From 2b74f40446020b62818d4400f752a24a0f0e35fe Mon Sep 17 00:00:00 2001
From: Philippe Virouleau <philippe.virouleau@inria.fr>
Date: Mon, 25 Nov 2024 11:24:31 +0100
Subject: [PATCH] Introduce a postinstall branch selector

---
 src/components/CreatePipeline.tsx       | 19 ++++++++++++-------
 src/components/RemoteBranchSelector.tsx | 11 ++++++-----
 src/components/TestImagesTabContent.tsx | 15 +++++++++++++--
 src/lib/requests.ts                     |  4 ++--
 4 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/components/CreatePipeline.tsx b/src/components/CreatePipeline.tsx
index 3aa7cfd..71dad6b 100644
--- a/src/components/CreatePipeline.tsx
+++ b/src/components/CreatePipeline.tsx
@@ -9,7 +9,6 @@ import Button from '@mui/material/Button';
 import Container from '@mui/material/Container';
 import EnabledEnvAlert from './EnabledEnvAlert';
 import GenerationTabContent from './GenerationTabContent';
-import PushImagesTabContent from './PushImagesTabContent';
 import RemoteBranchSelector from './RemoteBranchSelector';
 import Tab from '@mui/material/Tab';
 import Tabs from '@mui/material/Tabs';
@@ -56,7 +55,7 @@ type Pipeline = {
 
 // FIXME: can we do something like typeof(useRouter()) ?
 function createPipelineAction(generations: GenState, clusters: TestState,
-  ref: string, refApiBranch: string,
+  ref: string, refApiBranch: string, postinstallBranch: string | null,
   token: string | undefined,
   router: AppRouterInstance,
   setLoading: Dispatch<SetStateAction<boolean>>) {
@@ -75,6 +74,9 @@ function createPipelineAction(generations: GenState, clusters: TestState,
       { key: 'CLUSTERS', value: getValidSelectedClusters(generations, clusters).join(',')},
     ]
   };
+  if (postinstallBranch) {
+    payload.variables.push({ key: 'CUSTOM_POSTINSTALL_BRANCH', value: postinstallBranch});
+  }
   setLoading(true);
   fetch(CREATE_PIPELINE_URL, {
     method: 'POST',
@@ -97,9 +99,11 @@ function CreatePipelineButton({
   clusters,
   branch,
   refApiBranch,
+  postinstallBranch,
 }: {
   branch: string | null,
   refApiBranch: string | null,
+  postinstallBranch: string | null,
   generations: GenState,
   clusters: TestState,
 }) {
@@ -118,7 +122,7 @@ function CreatePipelineButton({
         if (branch === null || refApiBranch === null) {
           return;
         }
-        createPipelineAction(generations, clusters, branch, refApiBranch, auth.user?.access_token, router, setLoading)
+        createPipelineAction(generations, clusters, branch, refApiBranch, postinstallBranch, auth.user?.access_token, router, setLoading)
       }}
       sx={{ ml: 'auto' }}
     >
@@ -148,6 +152,7 @@ export default function CreatePipeline() {
   const [clusters, setClusters] = useState<TestState>([]);
   const [branch, setBranch] = useState<string | null>(null);
   const [refApiBranch, setRefApiBranch] = useState<string | null>(null);
+  const [postinstallBranch, setPostinstallBranch] = useState<string | null>(null);
 
   return (
     <Container maxWidth="xl">
@@ -158,16 +163,17 @@ export default function CreatePipeline() {
           branch={branch}
           setBranch={setBranch}
           label="Environments recipes branch"
+          useDefault
         />
       </Box>
       <Box sx={{ borderBottom: 1, borderColor: 'divider', mb: 2 }}>
         <Tabs value={value} onChange={handleChange}>
           <Tab label="Generation" />
           <Tab label="Tests" />
-          <Tab label="Push" />
           <CreatePipelineButton
             branch={branch}
             refApiBranch={refApiBranch}
+            postinstallBranch={postinstallBranch}
             generations={generations}
             clusters={clusters}
           />
@@ -186,11 +192,10 @@ export default function CreatePipeline() {
           setClusters={setClusters}
           branch={refApiBranch}
           setBranchState={setRefApiBranch}
+          postinstallBranch={postinstallBranch}
+          setPostinstallBranch={setPostinstallBranch}
         />
       </CustomTabPanel>
-      <CustomTabPanel value={value} index={2}>
-        <PushImagesTabContent />
-      </CustomTabPanel>
     </Container>
   );
 }
diff --git a/src/components/RemoteBranchSelector.tsx b/src/components/RemoteBranchSelector.tsx
index 991b166..d51b74c 100644
--- a/src/components/RemoteBranchSelector.tsx
+++ b/src/components/RemoteBranchSelector.tsx
@@ -17,10 +17,11 @@ const GET_BRANCHES = gql`
 `;
 
 export default function RemoteBranchSelector({
-  branch, setBranch, label, project
+  branch, setBranch, label, project, useDefault, helperText
 } : {
   branch: string | null, setBranch: Dispatch<string | null>,
-  label: string, project: string,
+  label: string, project: string, useDefault?: boolean,
+  helperText?: string,
 }) {
   const { loading, error, data } = useQuery(GET_BRANCHES, {
     variables: { project },
@@ -28,10 +29,10 @@ export default function RemoteBranchSelector({
 
   // Set the default branch when we have one.
   useEffect(() => {
-    if (data && !branch) {
+    if (useDefault && data && !branch) {
       setBranch(data.project.repository.rootRef);
     }
-  }, [branch, data, setBranch]);
+  }, [branch, data, setBranch, useDefault]);
 
   const options = useMemo(() => {
     if (data) {
@@ -52,7 +53,7 @@ export default function RemoteBranchSelector({
         <TextField
           {...params}
           error={error ? true : false}
-          helperText={error ? error.message : ''}
+          helperText={error ? error.message : helperText}
           label={label}
         />
       )}
diff --git a/src/components/TestImagesTabContent.tsx b/src/components/TestImagesTabContent.tsx
index db335a5..01e189d 100644
--- a/src/components/TestImagesTabContent.tsx
+++ b/src/components/TestImagesTabContent.tsx
@@ -315,10 +315,13 @@ function AllClustersAccordion({
 export default function TestImagesTabContent({
   clusters, setClusters,
   generations, branch, setBranchState,
+  postinstallBranch, setPostinstallBranch,
 }: {
   generations: GenState,
   branch: string | null,
   setBranchState: Dispatch<SetStateAction<string | null>>,
+  postinstallBranch: string | null,
+  setPostinstallBranch: Dispatch<SetStateAction<string | null>>,
 } & TestClustersProps) {
 
   const [showInfo, setShowInfo] = useState(false);
@@ -334,7 +337,7 @@ export default function TestImagesTabContent({
       <Stack
         direction="row"
         sx={{
-          minWidth: '300px', mb: 2, alignItems: 'center'
+          minWidth: '300px', mb: 2, alignItems: 'flex-start'
         }}
         spacing={2}
       >
@@ -343,9 +346,17 @@ export default function TestImagesTabContent({
           branch={branch}
           setBranch={setBranch}
           label="Ref API branch"
+          useDefault
+        />
+        <RemoteBranchSelector
+          project="grid5000/g5k-postinstall"
+          branch={postinstallBranch}
+          setBranch={setPostinstallBranch}
+          label="Postinstall branch"
+          helperText="Leave empty to use the default"
         />
-        <Legend />
       </Stack>
+      <Legend />
       {branch && (
         <AllClustersAccordion
           clusters={clusters}
diff --git a/src/lib/requests.ts b/src/lib/requests.ts
index a1ed032..cfb3c8b 100644
--- a/src/lib/requests.ts
+++ b/src/lib/requests.ts
@@ -2,9 +2,9 @@ export function defaultFetch(url: string, options = {}) {
   return fetch(url, options).then(r => {
     if (!r.ok) {
       const error = new Error(
-        `An error ${r.status} occurred while fetching data`
+        `An error ${r.status} occurred while fetching data`,
+        { cause: r.statusText }
       );
-      error.cause = r.statusText;
       throw error;
     }
     return r.json();
-- 
GitLab