func()

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
}