Skip to content

Commit

Permalink
govc: enhance VAPI for vSphere Supervisor Services
Browse files Browse the repository at this point in the history
- Update GET for both /supervisor-services and /supervisor-services/{id}/versions
- Add GET for specific service and specific version:
 /supervisor-services/{id} and /supervisor-services/{id}/versions/{version}
- Add DELETE for /supervisor-services/{id} and /supervisor-services/{id}/versions/{version}:
DELETE for  /supervisor-services/{id} and /supervisor-services/{id}/versions/{version}
- Add activate/deactivate for a service version too (you can't delete a version of a service
if it's not deactivated first):
PATCH for superrvisor-services/{id} and /supervisor-services/{id}/versions/{version}

- Update namespace.bats tests to test list and get
- Update VAPI simulator to use `ServeHTTP` to make sure the path vlaues are set properly
- Also update copyrights

Fixes #3624

Testing Done: Ran `make check` and ./govc/test/namespace.bats

Also ran against a real VC where I added 1 dummy service with 2 versions:
`export GOVC_URL=...`

```
$ cat sample-pkg.test.carvel.dev-1.0.0.yaml
apiVersion: data.packaging.carvel.dev/v1alpha1
kind: PackageMetadata
metadata:
  name: sample-pkg-testgovc.test.carvel.dev
spec:
  displayName: "sample-service for testing"
  shortDescription: "Sample core service description"
---
apiVersion: data.packaging.carvel.dev/v1alpha1
kind: Package
metadata:
  name: sample-pkg-testgovc.test.carvel.dev.1.0.0
spec:
  refName: sample-pkg-testgovc.test.carvel.dev
  version: 1.0.0
  releasedAt: 2021-05-05T18:57:06Z
  template:
    spec:
      fetch:
        - imgpkgBundle:
            image: wcp-docker-ci.artifactory.eng.vmware.com/carvel/simple-app-bundle:v0.0.0
      template:
        - ytt:
            paths:
              - config-step-2-template
              - config-step-2a-overlays
      deploy:
        - kapp: { }

$ govc namespace.service.create sample-pkg.test.carvel.dev-1.0.0.yaml

$  govc namespace.service.create sample-pkg.test.carvel.dev-1.0.0.yaml
govc: 400 Bad Request: {"messages":[{"args":["sample-pkg-testgovc.test.carvel.dev","Supervisor Service"],"default_message":"Failed to create Supervisor Service sample-pkg-testgovc.test.carvel.dev because an instance of Supervisor Service with the same identifier already exists.","localized":"Failed to create Supervisor Service sample-pkg-testgovc.test.carvel.dev because an instance of Supervisor Service with the same identifier already exists.","id":"vcenter.wcp.appplatform.supervisorservice.write.unique_violation"}]}

$ govc namespace.service.version.create  sample-pkg-testgovc.test.carvel.dev  sample-pkg.test.carvel.dev-2.0.0.yaml

$ govc namespace.service.version.deactivate sample-pkg-testgovc.test.carvel.dev 2.0.0

$ govc namespace.service.version.activate sample-pkg-testgovc.test.carvel.dev 2.0.0

$ govc namespace.service.version.rm sample-pkg-testgovc.test.carvel.dev 2.0.0
govc: 400 Bad Request: {"messages":[{"args":["sample-pkg-testgovc.test.carvel.dev","2.0.0"],"default_message":"Cannot delete the Supervisor Service (sample-pkg-testgovc.test.carvel.dev) version (2.0.0) because it is active.","localized":"Cannot delete the Supervisor Service (sample-pkg-testgovc.test.carvel.dev) version (2.0.0) because it is active.","id":"vcenter.wcp.appplatform.supervisorserviceversion.delete.activated"}]}

$ govc namespace.service.version.deactivate sample-pkg-testgovc.test.carvel.dev 2.0.0
$ govc namespace.service.version.rm  sample-pkg-testgovc.test.carvel.dev 2.0.0
$ govc namespace.service.ls sample-pkg-testgovc.test.carvel.dev 2.0.0

$ govc namespace.service.ls -json
[...]
  {
    "supervisor_service": "sample-pkg-testgovc.test.carvel.dev",
    "display_name": "sample-service for testing version",
    "state": "ACTIVATED"
  },
]

$ govc namespace.service.info -json sample-pkg-testgovc.test.carvel.dev
{
  "display_name": "sample-service for testing version",
  "state": "ACTIVATED",
  "description": "Sample core service description",
  "must_be_installed": false,
  "has_default_versions_registered": false
}

{
  "must_be_installed": false,
  "has_default_versions_registered": false,
  "description": "Sample core service description",
  "state": "ACTIVATED",
  "display_name": "sample-service for testing version"
}
```
  • Loading branch information
fstrudel committed Jan 16, 2025
1 parent 8eb362f commit 8b9536b
Show file tree
Hide file tree
Showing 20 changed files with 898 additions and 215 deletions.
20 changes: 4 additions & 16 deletions cli/namespace/service/activate.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
/*
Copyright (c) 2021 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

Expand All @@ -39,7 +27,7 @@ func (cmd *activate) Register(ctx context.Context, f *flag.FlagSet) {
}

func (cmd *activate) Description() string {
return `Activates a vSphere Namespace Supervisor Service.
return `Activates a vSphere Supervisor Service (and all its versions).
Examples:
govc namespace.service.activate my-supervisor-service other-supervisor-service`
Expand Down
68 changes: 32 additions & 36 deletions cli/namespace/service/create.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
/*
Copyright (c) 2021 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

Expand All @@ -30,10 +18,7 @@ import (

type create struct {
*flags.ClientFlag

specType string
trustedProvider bool
acceptEULA bool
*ServiceVersionFlag
}

func init() {
Expand All @@ -44,13 +29,14 @@ func (cmd *create) Register(ctx context.Context, f *flag.FlagSet) {
cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
cmd.ClientFlag.Register(ctx, f)

f.StringVar(&cmd.specType, "spec-type", "vsphere", "Type of Spec: only vsphere is supported right now")
f.BoolVar(&cmd.trustedProvider, "trusted", false, "Define if this is a trusted provider")
f.BoolVar(&cmd.acceptEULA, "accept-eula", false, "Auto accept EULA")
cmd.ServiceVersionFlag = &ServiceVersionFlag{}
cmd.ServiceVersionFlag.Register(ctx, f)
}

func (cmd *create) Description() string {
return `Creates a vSphere Namespace Supervisor Service.
return `Registers a vSphere Supervisor Service version on vCenter for a new service.
A service version can be registered once on vCenter and then be installed on multiple vSphere Supervisors managed by this vCenter.
A vSphere Supervisor Service contains a list of service versions.
Examples:
govc namespace.service.create manifest.yaml`
Expand All @@ -60,30 +46,41 @@ func (cmd *create) Usage() string {
return "MANIFEST"
}

func (cmd *create) Process(ctx context.Context) error {
if err := cmd.ServiceVersionFlag.Process(ctx); err != nil {
return err
}
return cmd.ClientFlag.Process(ctx)
}

func (cmd *create) Run(ctx context.Context, f *flag.FlagSet) error {
manifest := f.Args()
if len(manifest) != 1 {
if f.NArg() != 1 {
return flag.ErrHelp
}

if cmd.specType != "vsphere" {
return fmt.Errorf("only vsphere specs are accepted right now")
}
manifestFile := f.Arg(0)

manifestFile, err := os.ReadFile(manifest[0])
manifest, err := os.ReadFile(manifestFile)
if err != nil {
return fmt.Errorf("failed to read manifest file: %s", err)
}
content := base64.StdEncoding.EncodeToString(manifest)

content := base64.StdEncoding.EncodeToString(manifestFile)
service := namespace.SupervisorService{
VsphereService: namespace.SupervisorServicesVSphereSpec{
service := namespace.SupervisorService{}
if cmd.ServiceVersionFlag.SpecType == "carvel" {
service.CarvelService = &namespace.SupervisorServicesCarvelSpec{
VersionSpec: namespace.CarvelVersionCreateSpec{
Content: content,
},
}
} else {
service.VsphereService = &namespace.SupervisorServicesVSphereSpec{
VersionSpec: namespace.SupervisorServicesVSphereVersionCreateSpec{
Content: content,
AcceptEula: cmd.acceptEULA,
TrustedProvider: cmd.trustedProvider,
AcceptEula: cmd.ServiceVersionFlag.AcceptEULA,
TrustedProvider: cmd.ServiceVersionFlag.TrustedProvider,
},
},
}
}

c, err := cmd.RestClient()
Expand All @@ -93,5 +90,4 @@ func (cmd *create) Run(ctx context.Context, f *flag.FlagSet) error {

m := namespace.NewManager(c)
return m.CreateSupervisorService(ctx, &service)

}
20 changes: 4 additions & 16 deletions cli/namespace/service/deactivate.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
/*
Copyright (c) 2021 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

Expand All @@ -39,7 +27,7 @@ func (cmd *deactivate) Register(ctx context.Context, f *flag.FlagSet) {
}

func (cmd *deactivate) Description() string {
return `Deactivates a vSphere Namespace Supervisor Service.
return `Deactivates a vSphere Supervisor Service (and all its versions).
Examples:
govc namespace.service.deactivate my-supervisor-service other-supervisor-service`
Expand Down
63 changes: 63 additions & 0 deletions cli/namespace/service/flag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

import (
"context"
"encoding/base64"
"flag"
"fmt"
"os"

"github.com/vmware/govmomi/vapi/namespace"
)

// Common processing of flags for service and service versions creation/update commands.
type ServiceVersionFlag struct {
SpecType string
TrustedProvider bool
AcceptEULA bool
content string
}

func (svf *ServiceVersionFlag) Register(ctx context.Context, f *flag.FlagSet) {
f.StringVar(&svf.SpecType, "spec-type", "carvel", "Type of Spec: vsphere (deprecated) or carvel")
f.BoolVar(&svf.TrustedProvider, "trusted", false, "Define if this is a trusted provider (only applicable for vSphere spec type)")
f.BoolVar(&svf.AcceptEULA, "accept-eula", false, "Auto accept EULA (only required for vSphere spec type)")
}

func (svf *ServiceVersionFlag) Process(ctx context.Context) error {
if svf.SpecType != "vsphere" && svf.SpecType != "carvel" {
return fmt.Errorf("Invalid type: '%v', only 'vsphere' and 'carvel' specs are supported", svf.SpecType)
}
return nil
}

// SupervisorServiceVersionSpec returns a spec for a supervisor service version definition
func (svf *ServiceVersionFlag) SupervisorServiceVersionSpec(manifestFile string) (namespace.SupervisorService, error) {
service := namespace.SupervisorService{}
manifest, err := os.ReadFile(manifestFile)
if err != nil {
return service, fmt.Errorf("failed to read manifest file: %s", err)
}

content := base64.StdEncoding.EncodeToString(manifest)
if svf.SpecType == "carvel" {
service.CarvelService = &namespace.SupervisorServicesCarvelSpec{
VersionSpec: namespace.CarvelVersionCreateSpec{
Content: content,
},
}
} else {
service.VsphereService = &namespace.SupervisorServicesVSphereSpec{
VersionSpec: namespace.SupervisorServicesVSphereVersionCreateSpec{
Content: content,
AcceptEula: svf.AcceptEULA,
TrustedProvider: svf.TrustedProvider,
},
}
}
return service, nil
}
19 changes: 3 additions & 16 deletions cli/namespace/service/info.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
/*
Copyright (c) 2021-2023 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

Expand Down Expand Up @@ -73,7 +61,6 @@ func (r *infoWriter) Write(w io.Writer) error {
fmt.Fprintf(tw, "%s", r.Service.Name)
fmt.Fprintf(tw, "\t%s", r.Service.State)
fmt.Fprintf(tw, "\t%s", r.Service.Description)

fmt.Fprintf(tw, "\n")

return tw.Flush()
Expand Down
20 changes: 4 additions & 16 deletions cli/namespace/service/ls.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
/*
Copyright (c) 2021-2023 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

Expand Down Expand Up @@ -58,7 +46,7 @@ func (cmd *ls) Process(ctx context.Context) error {
}

func (cmd *ls) Description() string {
return `List namepace registered supervisor services.
return `List all registered vSphere Supervisor Services.
Examples:
govc namespace.service.ls
Expand Down
20 changes: 4 additions & 16 deletions cli/namespace/service/rm.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
/*
Copyright (c) 2021 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package service

Expand Down Expand Up @@ -40,7 +28,7 @@ func (cmd *rm) Register(ctx context.Context, f *flag.FlagSet) {
}

func (cmd *rm) Description() string {
return `Removes a vSphere Namespace Supervisor Service.
return `Removes a vSphere Supervisor Service.
Examples:
govc namespace.service.rm my-supervisor-service other-supervisor-service`
Expand Down
57 changes: 57 additions & 0 deletions cli/namespace/service/version/activate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// © Broadcom. All Rights Reserved.
// The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
// SPDX-License-Identifier: Apache-2.0

package version

import (
"context"
"flag"

"github.com/vmware/govmomi/cli"
"github.com/vmware/govmomi/cli/flags"
"github.com/vmware/govmomi/vapi/namespace"
)

type activate struct {
*flags.ClientFlag
}

func init() {
cli.Register("namespace.service.version.activate", &activate{})
}

func (cmd *activate) Register(ctx context.Context, f *flag.FlagSet) {
cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
cmd.ClientFlag.Register(ctx, f)
}

func (cmd *activate) Description() string {
return `Activates a vSphere Supervisor Service version.
Examples:
govc namespace.service.version.activate my-supervisor-service 1.0.0`
}

func (cmd *activate) Usage() string {
return "NAME VERSION"
}

func (cmd *activate) Run(ctx context.Context, f *flag.FlagSet) error {
service := f.Arg(0)
if len(service) == 0 {
return flag.ErrHelp
}
version := f.Arg(1)
if len(version) == 0 {
return flag.ErrHelp
}

c, err := cmd.RestClient()
if err != nil {
return err
}

m := namespace.NewManager(c)
return m.ActivateSupervisorServiceVersion(ctx, service, version)
}
Loading

0 comments on commit 8b9536b

Please sign in to comment.