Skip to content
This repository has been archived by the owner on Jan 11, 2023. It is now read-only.

Commit

Permalink
- keeping original DeploymentOperationsListResult in DeploymentError (#…
Browse files Browse the repository at this point in the history
…2266)

* - keeping original DeploymentOperationsListResult in DeploymentError
- add DeploymentValidationError to distinguish validation errors

* addressed comments
  • Loading branch information
dmitsh authored and jackfrancis committed Feb 13, 2018
1 parent 455deb2 commit e56d441
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 45 deletions.
60 changes: 24 additions & 36 deletions pkg/armhelpers/deploymentError.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ type DeploymentError struct {
StatusCode int
Response []byte
ProvisioningState string
Operations [][]byte
OperationsLists []resources.DeploymentOperationsListResult
}

// Error implements error interface
Expand All @@ -27,13 +27,32 @@ func (e *DeploymentError) Error() string {
str = e.TopError.Error()
}
var ops []string
for _, b := range e.Operations {
ops = append(ops, string(b))
for _, operationsList := range e.OperationsLists {
if operationsList.Value == nil {
continue
}
for _, operation := range *operationsList.Value {
if operation.Properties != nil && *operation.Properties.ProvisioningState == string(api.Failed) && operation.Properties.StatusMessage != nil {
if b, err := json.MarshalIndent(operation.Properties.StatusMessage, "", " "); err == nil {
ops = append(ops, string(b))
}
}
}
}
return fmt.Sprintf("TopError[%s] StatusCode[%d] Response[%s] ProvisioningState[%s] Operations[%s]",
str, e.StatusCode, e.Response, e.ProvisioningState, strings.Join(ops, " | "))
}

// DeploymentValidationError contains validation error
type DeploymentValidationError struct {
Err error
}

// Error implements error interface
func (e *DeploymentValidationError) Error() string {
return e.Err.Error()
}

// DeployTemplateSync deploys the template and returns ArmError
func DeployTemplateSync(az ACSEngineClient, logger *logrus.Entry, resourceGroupName, deploymentName string, template map[string]interface{}, parameters map[string]interface{}) error {
deploymentExtended, err := az.DeployTemplate(resourceGroupName, deploymentName, template, parameters, nil)
Expand Down Expand Up @@ -76,46 +95,15 @@ func DeployTemplateSync(az ACSEngineClient, logger *logrus.Entry, resourceGroupN
logger.Errorf("unable to list deployment operations %s. error: %v", deploymentName, err)
return deploymentErr
}
getOperationError(res, deploymentErr, logger)
deploymentErr.OperationsLists = append(deploymentErr.OperationsLists, res)

for res.NextLink != nil {
res, err = az.ListDeploymentOperationsNextResults(res)
if err != nil {
logger.Warningf("unable to list next deployment operations %s. error: %v", deploymentName, err)
break
}
getOperationError(res, deploymentErr, logger)
deploymentErr.OperationsLists = append(deploymentErr.OperationsLists, res)
}
return deploymentErr
}

func getOperationError(operationsList resources.DeploymentOperationsListResult, deploymentErr *DeploymentError, logger *logrus.Entry) {
if operationsList.Value == nil {
return
}

for _, operation := range *operationsList.Value {
if operation.Properties == nil || *operation.Properties.ProvisioningState != string(api.Failed) {
continue
}

// log the full deployment operation error response
if operation.ID != nil && operation.OperationID != nil {
b, _ := json.Marshal(operation.Properties)
logger.Infof("deployment operation ID %s, operationID %s, prooperties: %s", *operation.ID, *operation.OperationID, b)
} else {
logger.Error("either deployment ID or operationID is nil")
}

if operation.Properties == nil || operation.Properties.StatusMessage == nil {
logger.Error("DeploymentOperation.Properties is not set")
continue
}
b, err := json.MarshalIndent(operation.Properties.StatusMessage, "", " ")
if err != nil {
logger.Errorf("Error occurred marshalling JSON: '%v'", err)
continue
}
deploymentErr.Operations = append(deploymentErr.Operations, b)
}
}
6 changes: 3 additions & 3 deletions pkg/armhelpers/deploymentError_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ var _ = Describe("Template deployment tests", func() {
Expect(deplErr.TopError.Error()).To(Equal("DeployTemplate failed"))
Expect(deplErr.ProvisioningState).To(Equal(""))
Expect(deplErr.StatusCode).To(Equal(0))
Expect(len(deplErr.Operations)).To(Equal(0))
Expect(len(deplErr.OperationsLists)).To(Equal(0))
})

It("Should return QuotaExceeded error code, specified in details", func() {
Expand All @@ -45,7 +45,7 @@ var _ = Describe("Template deployment tests", func() {
Expect(deplErr.ProvisioningState).To(Equal(""))
Expect(deplErr.StatusCode).To(Equal(400))
Expect(string(deplErr.Response)).To(ContainSubstring("\"code\":\"QuotaExceeded\""))
Expect(len(deplErr.Operations)).To(Equal(0))
Expect(len(deplErr.OperationsLists)).To(Equal(0))
})

It("Should return Conflict error code, specified in details", func() {
Expand All @@ -61,6 +61,6 @@ var _ = Describe("Template deployment tests", func() {
Expect(deplErr.ProvisioningState).To(Equal(""))
Expect(deplErr.StatusCode).To(Equal(200))
Expect(string(deplErr.Response)).To(ContainSubstring("\"code\":\"Conflict\""))
Expect(len(deplErr.Operations)).To(Equal(0))
Expect(len(deplErr.OperationsLists)).To(Equal(0))
})
})
6 changes: 2 additions & 4 deletions pkg/operations/kubernetesupgrade/upgradeagentnode.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ func (kan *UpgradeAgentNode) Validate(vmName *string) error {

client, err := kan.Client.GetKubernetesClient(masterURL, kan.kubeConfig, interval, kan.timeout)
if err != nil {
return err
return &armhelpers.DeploymentValidationError{Err: err}
}

retryTimer := time.NewTimer(time.Millisecond)
Expand All @@ -108,9 +108,7 @@ func (kan *UpgradeAgentNode) Validate(vmName *string) error {
select {
case <-timeoutTimer.C:
retryTimer.Stop()
err := fmt.Errorf("Node was not ready within %v", kan.timeout)
kan.logger.Errorf(err.Error())
return err
return &armhelpers.DeploymentValidationError{Err: kan.Translator.Errorf("Node was not ready within %v", kan.timeout)}
case <-retryTimer.C:
agentNode, err := client.GetNode(*vmName)
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions pkg/operations/kubernetesupgrade/upgrader.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ func (ku *Upgrader) upgradeAgentPools() error {
templateMap, parametersMap, err := ku.generateUpgradeTemplate(ku.ClusterTopology.DataModel)
if err != nil {
ku.logger.Errorf("Error generating upgrade template: %v", err)
return ku.Translator.Errorf("error generating upgrade template: %s", err.Error())
return ku.Translator.Errorf("Error generating upgrade template: %s", err.Error())
}

ku.logger.Infof("Prepping agent pool '%s' for upgrade...", *agentPool.Name)
Expand All @@ -212,7 +212,7 @@ func (ku *Upgrader) upgradeAgentPools() error {
}
if err := transformer.NormalizeResourcesForK8sAgentUpgrade(ku.logger, templateMap, isMasterManagedDisk, preservePools); err != nil {
ku.logger.Errorf(err.Error())
return err
return ku.Translator.Errorf("Error generating upgrade template: %s", err.Error())
}

var agentCount, agentPoolIndex int
Expand Down

0 comments on commit e56d441

Please sign in to comment.