in pkg/infrastructure/authorizationCheckers/ARMTemplateDeployment/armTemplateAuthorizationChecker.go [77:176]
func (a *armDeploymentConfig) deployARMTemplate(deploymentName string, mpfConfig domain.MPFConfig) (string, error) {
// jsonData, err := json.Marshal(properties)
// spCred, err := azidentity.NewClientSecretCredential(a.mpfCfg.Args.TenantID, a.mpfCfg.Args.SPClientID, a.mpfCfg.Args.SPClientSecret, nil)
// if err != nil {
// log.Fatal(err)
// }
bearerToken, err := a.azAPIClient.GetSPBearerToken(mpfConfig.TenantID, mpfConfig.SP.SPClientID, mpfConfig.SP.SPClientSecret)
if err != nil {
return "", err
}
// read template and parameters
template, err := mpfSharedUtils.ReadJson(a.armConfig.TemplateFilePath)
if err != nil {
return "", err
}
parameters, err := mpfSharedUtils.ReadJson(a.armConfig.ParametersFilePath)
if err != nil {
return "", err
}
// convert parameters to standard format
parameters = ARMTemplateShared.GetParametersInStandardFormat(parameters)
fullTemplate := map[string]interface{}{
"properties": map[string]interface{}{
"mode": "Incremental",
"template": template,
"parameters": parameters,
},
}
// convert bodyJSON to string
fullTemplateJSONBytes, err := json.Marshal(fullTemplate)
if err != nil {
return "", err
}
fullTemplateJSONString := string(fullTemplateJSONBytes)
log.Debugln()
log.Debugln(fullTemplateJSONString)
log.Debugln()
// create JSON body with template and parameters
client := &http.Client{}
log.Info("MPF mode is fullDeployment, Proceeding to create resources....")
url := fmt.Sprintf("https://management.azure.com/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Resources/deployments/%s?api-version=2020-10-01", mpfConfig.SubscriptionID, mpfConfig.ResourceGroup.ResourceGroupName, deploymentName)
reqMethod := "PUT"
req, err := http.NewRequest(reqMethod, url, bytes.NewBufferString(fullTemplateJSONString))
if err != nil {
return "", err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", "Go HTTP Client")
// add bearer token to header
req.Header.Add("Authorization", "Bearer "+bearerToken)
// make request
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
var respBody string
// read response body
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
respBody = string(body)
// fmt.Println(respBody)
log.Debugln(respBody)
// print response body
if strings.Contains(respBody, "Authorization") {
return respBody, nil
}
if strings.Contains(respBody, "InvalidTemplateDeployment") {
// This indicates all Authorization errors are fixed
// Sample error [{\"code\":\"PodIdentityAddonFeatureFlagNotEnabled\",\"message\":\"Provisioning of resource(s) for container service aks-24xalwx7i2ueg in resource group testdeployrg-Y2jsRAG failed. Message: PodIdentity addon is not allowed since feature 'Microsoft.ContainerService/EnablePodIdentityPreview' is not enabled.
// Hence ok to proceed, and not return error in this condition
log.Warnf("Non Authorizaton error occured: %s", respBody)
}
return "", nil
}