in frontend/pkg/frontend/frontend.go [684:773]
func (f *Frontend) ArmResourceActionRequestAdminCredential(writer http.ResponseWriter, request *http.Request) {
const operationRequest = database.OperationRequestRequestCredential
ctx := request.Context()
logger := LoggerFromContext(ctx)
resourceID, err := ResourceIDFromContext(ctx)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
// Parent resource is the hcpOpenShiftCluster.
resourceID = resourceID.Parent
pk := database.NewPartitionKey(resourceID.SubscriptionID)
resourceDoc, err := f.dbClient.GetResourceDoc(ctx, resourceID)
if err != nil {
logger.Error(err.Error())
if errors.Is(err, database.ErrNotFound) {
arm.WriteResourceNotFoundError(writer, resourceID)
} else {
arm.WriteInternalServerError(writer)
}
return
}
// CheckForProvisioningStateConflict does not log conflict errors
// but does log unexpected errors like database failures.
cloudError := f.CheckForProvisioningStateConflict(ctx, operationRequest, resourceDoc)
if cloudError != nil {
arm.WriteCloudError(writer, cloudError)
return
}
// New credential cannot be requested while credentials are being revoked.
iterator := f.dbClient.ListActiveOperationDocs(pk, &database.DBClientListActiveOperationDocsOptions{
Request: api.Ptr(database.OperationRequestRevokeCredentials),
ExternalID: resourceID,
})
for _, _ = range iterator.Items(ctx) {
writer.Header().Set("Retry-After", strconv.Itoa(10))
arm.WriteConflictError(
writer, resourceID,
"Cannot request credential while credentials are being revoked")
return
}
err = iterator.GetError()
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
csCredential, err := f.clusterServiceClient.PostBreakGlassCredential(ctx, resourceDoc.InternalID)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
internalID, err := ocm.NewInternalID(csCredential.HREF())
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
operationDoc := database.NewOperationDocument(operationRequest, resourceID, internalID)
operationID, err := f.dbClient.CreateOperationDoc(ctx, operationDoc)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
err = f.ExposeOperation(writer, request, pk, operationID)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
writer.WriteHeader(http.StatusAccepted)
}