in frontend/pkg/frontend/helpers.go [37:99]
func (f *Frontend) CheckForProvisioningStateConflict(ctx context.Context, operationRequest database.OperationRequest, doc *database.ResourceDocument) *arm.CloudError {
logger := LoggerFromContext(ctx)
switch operationRequest {
case database.OperationRequestCreate:
// Resource must already exist for there to be a conflict.
case database.OperationRequestDelete:
if doc.ProvisioningState == arm.ProvisioningStateDeleting {
return arm.NewConflictError(
doc.ResourceID,
"Resource is already deleting")
}
case database.OperationRequestUpdate:
// Defer to Cluster Service for ProvisioningStateFailed since
// it is ambiguous about whether the resource is functional.
if !doc.ProvisioningState.IsTerminal() {
return arm.NewConflictError(
doc.ResourceID,
"Cannot update resource while resource is %s",
strings.ToLower(string(doc.ProvisioningState)))
}
case database.OperationRequestRequestCredential:
// Defer to Cluster Service for ProvisioningStateFailed since
// it is ambiguous about whether the resource is functional.
if !doc.ProvisioningState.IsTerminal() {
return arm.NewConflictError(
doc.ResourceID,
"Cannot request credential while resource is %s",
strings.ToLower(string(doc.ProvisioningState)))
}
case database.OperationRequestRevokeCredentials:
// Defer to Cluster Service for ProvisioningStateFailed since
// it is ambiguous about whether the resource is functional.
if !doc.ProvisioningState.IsTerminal() {
return arm.NewConflictError(
doc.ResourceID,
"Cannot revoke credentials while resource is %s",
strings.ToLower(string(doc.ProvisioningState)))
}
}
parent := doc.ResourceID.Parent
// ResourceType casing is preserved for parents in the same namespace.
for parent.ResourceType.Namespace == doc.ResourceID.ResourceType.Namespace {
parentDoc, err := f.dbClient.GetResourceDoc(ctx, parent)
if err != nil {
logger.Error(err.Error())
return arm.NewInternalServerError()
}
if parentDoc.ProvisioningState == arm.ProvisioningStateDeleting {
return arm.NewConflictError(
doc.ResourceID,
"Cannot %s resource while parent resource is deleting",
strings.ToLower(string(operationRequest)))
}
parent = parent.Parent
}
return nil
}