async function createCanaryService()

in src/strategyHelpers/canary/smiCanaryHelper.ts [115:217]


async function createCanaryService(
   kubectl: Kubectl,
   filePaths: string[]
): Promise<string[]> {
   const newObjectsList = []
   const trafficObjectsList: string[] = []

   for (const filePath of filePaths) {
      try {
         const fileContents = fs.readFileSync(filePath).toString()
         const parsedYaml: K8sObject[] = yaml.loadAll(
            fileContents
         ) as K8sObject[]

         for (const inputObject of parsedYaml) {
            const name = inputObject.metadata.name
            const kind = inputObject.kind

            if (isServiceEntity(kind)) {
               core.debug(`Creating services for ${kind} ${name}`)
               const newCanaryServiceObject =
                  canaryDeploymentHelper.getNewCanaryResource(inputObject)
               newObjectsList.push(newCanaryServiceObject)

               const newBaselineServiceObject =
                  canaryDeploymentHelper.getNewBaselineResource(inputObject)
               newObjectsList.push(newBaselineServiceObject)

               const stableObject = await canaryDeploymentHelper.fetchResource(
                  kubectl,
                  kind,
                  canaryDeploymentHelper.getStableResourceName(name)
               )
               if (!stableObject) {
                  const newStableServiceObject =
                     canaryDeploymentHelper.getStableResource(inputObject)
                  newObjectsList.push(newStableServiceObject)

                  core.debug('Creating the traffic object for service: ' + name)
                  const trafficObject = await createTrafficSplitManifestFile(
                     kubectl,
                     name,
                     0,
                     0,
                     1000
                  )

                  trafficObjectsList.push(trafficObject)
               } else {
                  let updateTrafficObject = true
                  const trafficObject =
                     await canaryDeploymentHelper.fetchResource(
                        kubectl,
                        TRAFFIC_SPLIT_OBJECT,
                        getTrafficSplitResourceName(name)
                     )

                  if (trafficObject) {
                     const trafficJObject = JSON.parse(
                        JSON.stringify(trafficObject)
                     )
                     if (trafficJObject?.spec?.backends) {
                        trafficJObject.spec.backends.forEach((s) => {
                           if (
                              s.service ===
                                 canaryDeploymentHelper.getCanaryResourceName(
                                    name
                                 ) &&
                              s.weight === '1000m'
                           ) {
                              core.debug('Update traffic objcet not required')
                              updateTrafficObject = false
                           }
                        })
                     }
                  }

                  if (updateTrafficObject) {
                     core.debug(
                        'Stable service object present so updating the traffic object for service: ' +
                           name
                     )
                     trafficObjectsList.push(
                        await updateTrafficSplitObject(kubectl, name)
                     )
                  }
               }
            }
         }
      } catch (error) {
         core.error(`Failed to process file at ${filePath}: ${error.message}`)
         throw error
      }
   }

   const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
   manifestFiles.push(...trafficObjectsList)
   const forceDeployment = core.getInput('force').toLowerCase() === 'true'

   const result = await kubectl.apply(manifestFiles, forceDeployment)
   checkForErrors([result])
   return manifestFiles
}