123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- /*
- Copyright (c) 2017 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.
- */
- package pbm
- import (
- "context"
- "fmt"
- "github.com/vmware/govmomi/pbm/methods"
- "github.com/vmware/govmomi/pbm/types"
- "github.com/vmware/govmomi/vim25"
- "github.com/vmware/govmomi/vim25/soap"
- vim "github.com/vmware/govmomi/vim25/types"
- )
- const (
- Namespace = "pbm"
- Path = "/pbm"
- )
- var (
- ServiceInstance = vim.ManagedObjectReference{
- Type: "PbmServiceInstance",
- Value: "ServiceInstance",
- }
- )
- type Client struct {
- *soap.Client
- ServiceContent types.PbmServiceInstanceContent
- }
- func NewClient(ctx context.Context, c *vim25.Client) (*Client, error) {
- sc := c.Client.NewServiceClient(Path, Namespace)
- req := types.PbmRetrieveServiceContent{
- This: ServiceInstance,
- }
- res, err := methods.PbmRetrieveServiceContent(ctx, sc, &req)
- if err != nil {
- return nil, err
- }
- return &Client{sc, res.Returnval}, nil
- }
- func (c *Client) QueryProfile(ctx context.Context, rtype types.PbmProfileResourceType, category string) ([]types.PbmProfileId, error) {
- req := types.PbmQueryProfile{
- This: c.ServiceContent.ProfileManager,
- ResourceType: rtype,
- ProfileCategory: category,
- }
- res, err := methods.PbmQueryProfile(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return res.Returnval, nil
- }
- func (c *Client) RetrieveContent(ctx context.Context, ids []types.PbmProfileId) ([]types.BasePbmProfile, error) {
- req := types.PbmRetrieveContent{
- This: c.ServiceContent.ProfileManager,
- ProfileIds: ids,
- }
- res, err := methods.PbmRetrieveContent(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return res.Returnval, nil
- }
- type PlacementCompatibilityResult []types.PbmPlacementCompatibilityResult
- func (c *Client) CheckRequirements(ctx context.Context, hubs []types.PbmPlacementHub, ref *types.PbmServerObjectRef, preq []types.BasePbmPlacementRequirement) (PlacementCompatibilityResult, error) {
- req := types.PbmCheckRequirements{
- This: c.ServiceContent.PlacementSolver,
- HubsToSearch: hubs,
- PlacementSubjectRef: ref,
- PlacementSubjectRequirement: preq,
- }
- res, err := methods.PbmCheckRequirements(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return res.Returnval, nil
- }
- func (l PlacementCompatibilityResult) CompatibleDatastores() []types.PbmPlacementHub {
- var compatibleDatastores []types.PbmPlacementHub
- for _, res := range l {
- if len(res.Error) == 0 {
- compatibleDatastores = append(compatibleDatastores, res.Hub)
- }
- }
- return compatibleDatastores
- }
- func (l PlacementCompatibilityResult) NonCompatibleDatastores() []types.PbmPlacementHub {
- var nonCompatibleDatastores []types.PbmPlacementHub
- for _, res := range l {
- if len(res.Error) > 0 {
- nonCompatibleDatastores = append(nonCompatibleDatastores, res.Hub)
- }
- }
- return nonCompatibleDatastores
- }
- func (c *Client) CreateProfile(ctx context.Context, capabilityProfileCreateSpec types.PbmCapabilityProfileCreateSpec) (*types.PbmProfileId, error) {
- req := types.PbmCreate{
- This: c.ServiceContent.ProfileManager,
- CreateSpec: capabilityProfileCreateSpec,
- }
- res, err := methods.PbmCreate(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return &res.Returnval, nil
- }
- func (c *Client) UpdateProfile(ctx context.Context, id types.PbmProfileId, updateSpec types.PbmCapabilityProfileUpdateSpec) error {
- req := types.PbmUpdate{
- This: c.ServiceContent.ProfileManager,
- ProfileId: id,
- UpdateSpec: updateSpec,
- }
- _, err := methods.PbmUpdate(ctx, c, &req)
- if err != nil {
- return err
- }
- return nil
- }
- func (c *Client) DeleteProfile(ctx context.Context, ids []types.PbmProfileId) ([]types.PbmProfileOperationOutcome, error) {
- req := types.PbmDelete{
- This: c.ServiceContent.ProfileManager,
- ProfileId: ids,
- }
- res, err := methods.PbmDelete(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return res.Returnval, nil
- }
- func (c *Client) QueryAssociatedEntity(ctx context.Context, id types.PbmProfileId, entityType string) ([]types.PbmServerObjectRef, error) {
- req := types.PbmQueryAssociatedEntity{
- This: c.ServiceContent.ProfileManager,
- Profile: id,
- EntityType: entityType,
- }
- res, err := methods.PbmQueryAssociatedEntity(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return res.Returnval, nil
- }
- func (c *Client) QueryAssociatedEntities(ctx context.Context, ids []types.PbmProfileId) ([]types.PbmQueryProfileResult, error) {
- req := types.PbmQueryAssociatedEntities{
- This: c.ServiceContent.ProfileManager,
- Profiles: ids,
- }
- res, err := methods.PbmQueryAssociatedEntities(ctx, c, &req)
- if err != nil {
- return nil, err
- }
- return res.Returnval, nil
- }
- func (c *Client) ProfileIDByName(ctx context.Context, profileName string) (string, error) {
- resourceType := types.PbmProfileResourceType{
- ResourceType: string(types.PbmProfileResourceTypeEnumSTORAGE),
- }
- category := types.PbmProfileCategoryEnumREQUIREMENT
- ids, err := c.QueryProfile(ctx, resourceType, string(category))
- if err != nil {
- return "", err
- }
- profiles, err := c.RetrieveContent(ctx, ids)
- if err != nil {
- return "", err
- }
- for i := range profiles {
- profile := profiles[i].GetPbmProfile()
- if profile.Name == profileName {
- return profile.ProfileId.UniqueId, nil
- }
- }
- return "", fmt.Errorf("no pbm profile found with name: %q", profileName)
- }
|