This commit is contained in:
Amber Brown 2024-07-18 17:28:01 +10:00
Родитель e4be577423
Коммит f519a8eede
3 изменённых файлов: 220 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,65 @@
package frontend
// Copyright (c) Microsoft Corporation.
// Licensed under the Apache License 2.0.
import (
"context"
"encoding/json"
"net/http"
"path/filepath"
"strings"
"github.com/go-chi/chi/v5"
"github.com/sirupsen/logrus"
"github.com/Azure/ARO-RP/pkg/api"
"github.com/Azure/ARO-RP/pkg/api/admin"
"github.com/Azure/ARO-RP/pkg/frontend/middleware"
)
func (f *frontend) getSingleAdminMaintManifest(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
log := ctx.Value(middleware.ContextKeyLog).(*logrus.Entry)
resourceID := strings.TrimPrefix(filepath.Dir(r.URL.Path), "/admin")
b, err := f._getSingleAdminMaintManifest(ctx, r, resourceID)
if cloudErr, ok := err.(*api.CloudError); ok {
api.WriteCloudError(w, cloudErr)
return
}
adminReply(log, w, nil, b, err)
}
func (f *frontend) _getSingleAdminMaintManifest(ctx context.Context, r *http.Request, resourceID string) ([]byte, error) {
manifestId := chi.URLParam(r, "manifestId")
converter := f.apis[admin.APIVersion].MaintenanceManifestConverter
dbOpenShiftClusters, err := f.dbGroup.OpenShiftClusters()
if err != nil {
return nil, api.NewCloudError(http.StatusInternalServerError, api.CloudErrorCodeInternalServerError, "", err.Error())
}
dbMaintenanceManifests, err := f.dbGroup.MaintenanceManifests()
if err != nil {
return nil, api.NewCloudError(http.StatusInternalServerError, api.CloudErrorCodeInternalServerError, "", err.Error())
}
doc, err := dbOpenShiftClusters.Get(ctx, resourceID)
if err != nil {
return nil, api.NewCloudError(http.StatusNotFound, api.CloudErrorCodeNotFound, "", "cluster not found")
}
if doc.OpenShiftCluster.Properties.ProvisioningState == api.ProvisioningStateDeleting {
return nil, api.NewCloudError(http.StatusNotFound, api.CloudErrorCodeNotFound, "", "cluster being deleted")
}
manifest, err := dbMaintenanceManifests.Get(ctx, resourceID, manifestId)
if err != nil {
return nil, api.NewCloudError(http.StatusNotFound, api.CloudErrorCodeInternalServerError, "", err.Error())
}
return json.MarshalIndent(converter.ToExternal(manifest), "", " ")
}

Просмотреть файл

@ -0,0 +1,152 @@
package frontend
// Copyright (c) Microsoft Corporation.
// Licensed under the Apache License 2.0.
import (
"context"
"fmt"
"net/http"
"strings"
"testing"
"time"
"github.com/Azure/ARO-RP/pkg/api"
"github.com/Azure/ARO-RP/pkg/api/admin"
"github.com/Azure/ARO-RP/pkg/metrics/noop"
testdatabase "github.com/Azure/ARO-RP/test/database"
)
func TestMIMOGet(t *testing.T) {
mockSubID := "00000000-0000-0000-0000-000000000000"
mockTenantID := "00000000-0000-0000-0000-000000000000"
resourceID := fmt.Sprintf("/subscriptions/%s/resourcegroups/resourceGroup/providers/Microsoft.RedHatOpenShift/openShiftClusters/resourceName", mockSubID)
ctx := context.Background()
type test struct {
name string
fixtures func(f *testdatabase.Fixture)
wantStatusCode int
wantResponse *admin.MaintenanceManifest
wantError string
}
for _, tt := range []*test{
// {
// name: "no cluster",
// wantError: "404: NotFound: : cluster not found",
// fixtures: func(f *testdatabase.Fixture) {},
// wantStatusCode: http.StatusNotFound,
// },
{
name: "cluster being deleted",
fixtures: func(f *testdatabase.Fixture) {
f.AddOpenShiftClusterDocuments(&api.OpenShiftClusterDocument{
Key: strings.ToLower(resourceID),
OpenShiftCluster: &api.OpenShiftCluster{
ID: resourceID,
Name: "resourceName",
Type: "Microsoft.RedHatOpenShift/openshiftClusters",
Properties: api.OpenShiftClusterProperties{
ProvisioningState: api.ProvisioningStateDeleting,
},
},
})
},
wantError: "404: NotFound: : cluster being deleted",
wantStatusCode: http.StatusNotFound,
},
{
name: "no item",
fixtures: func(f *testdatabase.Fixture) {
f.AddOpenShiftClusterDocuments(&api.OpenShiftClusterDocument{
Key: strings.ToLower(resourceID),
OpenShiftCluster: &api.OpenShiftCluster{
ID: resourceID,
Name: "resourceName",
Type: "Microsoft.RedHatOpenShift/openshiftClusters",
},
})
},
wantError: "404: NotFound: : cluster not found",
wantStatusCode: http.StatusNotFound,
},
{
name: "get entry",
fixtures: func(f *testdatabase.Fixture) {
f.AddOpenShiftClusterDocuments(&api.OpenShiftClusterDocument{
Key: strings.ToLower(resourceID),
OpenShiftCluster: &api.OpenShiftCluster{
ID: resourceID,
Name: "resourceName",
Type: "Microsoft.RedHatOpenShift/openshiftClusters",
},
})
f.AddMaintenanceManifestDocuments(&api.MaintenanceManifestDocument{
ClusterResourceID: strings.ToLower(resourceID),
MaintenanceManifest: &api.MaintenanceManifest{
MaintenanceSetID: "exampleset",
State: api.MaintenanceManifestStatePending,
RunAfter: 1,
RunBefore: 1,
},
})
},
wantResponse: &admin.MaintenanceManifest{
ID: "07070707-0707-0707-0707-070707070001",
MaintenanceSetID: "exampleset",
State: admin.MaintenanceManifestStatePending,
Priority: 0,
RunAfter: 1,
RunBefore: 1,
},
wantStatusCode: http.StatusOK,
},
} {
t.Run(tt.name, func(t *testing.T) {
now := func() time.Time { return time.Unix(1000, 0) }
ti := newTestInfra(t).WithOpenShiftClusters().WithSubscriptions().WithMaintenanceManifests(now)
defer ti.done()
ti.fixture.AddSubscriptionDocuments(&api.SubscriptionDocument{
ID: mockSubID,
Subscription: &api.Subscription{
State: api.SubscriptionStateRegistered,
Properties: &api.SubscriptionProperties{
TenantID: mockTenantID,
},
},
})
if tt.fixtures != nil {
tt.fixtures(ti.fixture)
}
err := ti.buildFixtures(nil)
if err != nil {
t.Fatal(err)
}
f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.dbGroup, api.APIs, &noop.Noop{}, &noop.Noop{}, testdatabase.NewFakeAEAD(), nil, nil, nil, nil, nil)
if err != nil {
t.Fatal(err)
}
go f.Run(ctx, nil, nil)
resp, b, err := ti.request(http.MethodGet,
fmt.Sprintf("https://server/admin%s/maintenancemanifests/07070707-0707-0707-0707-070707070001", resourceID),
nil, nil)
if err != nil {
t.Fatal(err)
}
err = validateResponse(resp, b, tt.wantStatusCode, tt.wantError, tt.wantResponse)
if err != nil {
t.Error(err)
}
})
}
}

Просмотреть файл

@ -330,6 +330,9 @@ func (f *frontend) chiAuthenticatedRoutes(router chi.Router) {
// MIMO
r.Get("/maintenancemanifests", f.getAdminMaintManifests)
r.Route("/maintenancemanifests/{manifestId}", func(r chi.Router) {
r.Get("/", f.getSingleAdminMaintManifest)
})
})
})