Skip to content

Commit

Permalink
Moved admin VDC functions from adminorg to admindvc
Browse files Browse the repository at this point in the history
Signed-off-by: Vaidotas Bauzys <vbauzys@vmware.com>
  • Loading branch information
vbauzys committed Feb 10, 2020
1 parent fae4c4b commit 65965d2
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 155 deletions.
174 changes: 21 additions & 153 deletions govcd/adminorg.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,6 @@ func NewAdminOrg(cli *Client) *AdminOrg {
}
}

// GetAdminVdcByName function uses a valid VDC name and returns a admin VDC object.
// If no VDC is found, then it returns an empty VDC and no error.
// Otherwise it returns an empty VDC and an error.
// Deprecated: Use adminOrg.GetAdminVDCByName
func (adminOrg *AdminOrg) GetAdminVdcByName(vdcname string) (AdminVdc, error) {
for _, vdcs := range adminOrg.AdminOrg.Vdcs.Vdcs {
if vdcs.Name == vdcname {
adminVdc := NewAdminVdc(adminOrg.client)
_, err := adminOrg.client.ExecuteRequest(vdcs.HREF, http.MethodGet,
"", "error getting vdc: %s", nil, adminVdc.AdminVdc)
return *adminVdc, err
}
}
return AdminVdc{}, nil
}

// CreateCatalog creates a catalog with given name and description under the
// the given organization. Returns an AdminCatalog that contains a creation
// task.
Expand All @@ -58,81 +42,6 @@ func (adminOrg *AdminOrg) CreateCatalog(name, description string) (AdminCatalog,
return CreateCatalog(adminOrg.client, adminOrg.AdminOrg.Link, name, description)
}

// If user specifies valid vdc name then this returns a vdc object.
// If no vdc is found, then it returns an empty vdc and no error.
// Otherwise it returns an empty vdc and an error. This function
// allows users to use an AdminOrg to fetch a vdc as well.
// Deprecated: Use adminOrg.GetVDCByName instead
func (adminOrg *AdminOrg) GetVdcByName(vdcname string) (Vdc, error) {
for _, vdcs := range adminOrg.AdminOrg.Vdcs.Vdcs {
if vdcs.Name == vdcname {
splitByAdminHREF := strings.Split(vdcs.HREF, "/api/admin")

// admin user and normal user will have different urls
var vdcHREF string
if len(splitByAdminHREF) == 1 {
vdcHREF = vdcs.HREF
} else {
vdcHREF = splitByAdminHREF[0] + "/api" + splitByAdminHREF[1]
}

vdc := NewVdc(adminOrg.client)

_, err := adminOrg.client.ExecuteRequest(vdcHREF, http.MethodGet,
"", "error getting vdc: %s", nil, vdc.Vdc)

return *vdc, err
}
}
return Vdc{}, nil
}

// CreateVdc creates a VDC with the given params under the given organization.
// Returns an AdminVdc.
// API Documentation: https://code.vmware.com/apis/220/vcloud#/doc/doc/operations/POST-VdcConfiguration.html
// Deprecated in favor of adminOrg.CreateOrgVdcAsync
func (adminOrg *AdminOrg) CreateVdc(vdcConfiguration *types.VdcConfiguration) (Task, error) {
err := validateVdcConfiguration(vdcConfiguration)
if err != nil {
return Task{}, err
}

vdcConfiguration.Xmlns = types.XMLNamespaceVCloud

vdcCreateHREF, err := url.ParseRequestURI(adminOrg.AdminOrg.HREF)
if err != nil {
return Task{}, fmt.Errorf("error parsing admin org url: %s", err)
}
vdcCreateHREF.Path += "/vdcsparams"

adminVdc := NewAdminVdc(adminOrg.client)

_, err = adminOrg.client.ExecuteRequest(vdcCreateHREF.String(), http.MethodPost,
"application/vnd.vmware.admin.createVdcParams+xml", "error creating VDC: %s", vdcConfiguration, adminVdc.AdminVdc)
if err != nil {
return Task{}, err
}

// Return the task
task := NewTask(adminOrg.client)
task.Task = adminVdc.AdminVdc.Tasks.Task[0]
return *task, nil
}

// Creates the vdc and waits for the asynchronous task to complete.
// Deprecated in favor of adminOrg.CreateOrgVdc
func (adminOrg *AdminOrg) CreateVdcWait(vdcDefinition *types.VdcConfiguration) error {
task, err := adminOrg.CreateVdc(vdcDefinition)
if err != nil {
return err
}
err = task.WaitTaskCompletion()
if err != nil {
return fmt.Errorf("couldn't finish creating vdc %s", err)
}
return nil
}

// Deletes the org, returning an error if the vCD call fails.
// API Documentation: https://code.vmware.com/apis/220/vcloud#/doc/doc/operations/DELETE-Organization.html
func (adminOrg *AdminOrg) Delete(force bool, recursive bool) error {
Expand Down Expand Up @@ -724,72 +633,31 @@ func (adminOrg *AdminOrg) GetVDCByNameOrId(identifier string, refresh bool) (*Vd
return entity.(*Vdc), err
}

// GetVDCByHref retrieves a VDC using a direct call with the HREF
func (adminOrg *AdminOrg) GetAdminVDCByHref(vdcHref string) (*AdminVdc, error) {

adminVdc := NewAdminVdc(adminOrg.client)
// If user specifies valid vdc name then this returns a vdc object.
// If no vdc is found, then it returns an empty vdc and no error.
// Otherwise it returns an empty vdc and an error. This function
// allows users to use an AdminOrg to fetch a vdc as well.
// Deprecated: Use adminOrg.GetVDCByName instead
func (adminOrg *AdminOrg) GetVdcByName(vdcname string) (Vdc, error) {
for _, vdcs := range adminOrg.AdminOrg.Vdcs.Vdcs {
if vdcs.Name == vdcname {
splitByAdminHREF := strings.Split(vdcs.HREF, "/api/admin")

// We are executing below request with a specific API version in the header, because we want to retrieve the most
// available fields in AdminVdc which vCD provides, but also which our code understands. As we can't blindly use
// the latest version, we're limiting the highest used version to the one we support with
// the GetSpecificApiVersionOnCondition(...) function. Specifically, the API version 32 returns
// two additional fields: IncludeMemoryOverhead and IsElastic for Flex allocation
_, err := adminOrg.client.ExecuteRequestWithApiVersion(vdcHref, http.MethodGet,
"", "error getting vdc: %s", nil, adminVdc.AdminVdc, adminVdc.client.GetSpecificApiVersionOnCondition(">= 32.0", "32.0"))
// admin user and normal user will have different urls
var vdcHREF string
if len(splitByAdminHREF) == 1 {
vdcHREF = vdcs.HREF
} else {
vdcHREF = splitByAdminHREF[0] + "/api" + splitByAdminHREF[1]
}

if err != nil {
return nil, err
}
return adminVdc, nil
}
vdc := NewVdc(adminOrg.client)

// GetAdminVDCByName finds an Admin VDC by Name
// On success, returns a pointer to the AdminVdc structure and a nil error
// On failure, returns a nil pointer and an error
func (adminOrg *AdminOrg) GetAdminVDCByName(vdcName string, refresh bool) (*AdminVdc, error) {
if refresh {
err := adminOrg.Refresh()
if err != nil {
return nil, err
}
}
for _, vdc := range adminOrg.AdminOrg.Vdcs.Vdcs {
if vdc.Name == vdcName {
return adminOrg.GetAdminVDCByHref(vdc.HREF)
}
}
return nil, ErrorEntityNotFound
}
_, err := adminOrg.client.ExecuteRequest(vdcHREF, http.MethodGet,
"", "error getting vdc: %s", nil, vdc.Vdc)

// GetAdminVDCById finds an Admin VDC by ID
// On success, returns a pointer to the AdminVdc structure and a nil error
// On failure, returns a nil pointer and an error
func (adminOrg *AdminOrg) GetAdminVDCById(vdcId string, refresh bool) (*AdminVdc, error) {
if refresh {
err := adminOrg.Refresh()
if err != nil {
return nil, err
}
}
for _, vdc := range adminOrg.AdminOrg.Vdcs.Vdcs {
if equalIds(vdcId, vdc.ID, vdc.HREF) {
return adminOrg.GetAdminVDCByHref(vdc.HREF)
return *vdc, err
}
}
return nil, ErrorEntityNotFound
}

// GetAdminVDCByNameOrId finds an Admin VDC by Name Or ID
// On success, returns a pointer to the AdminVdc structure and a nil error
// On failure, returns a nil pointer and an error
func (adminOrg *AdminOrg) GetAdminVDCByNameOrId(identifier string, refresh bool) (*AdminVdc, error) {
getByName := func(name string, refresh bool) (interface{}, error) {
return adminOrg.GetAdminVDCByName(name, refresh)
}
getById := func(id string, refresh bool) (interface{}, error) { return adminOrg.GetAdminVDCById(id, refresh) }
entity, err := getEntityByNameOrId(getByName, getById, identifier, refresh)
if entity == nil {
return nil, err
}
return entity.(*AdminVdc), err
return Vdc{}, nil
}
132 changes: 132 additions & 0 deletions govcd/adminvdc.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,138 @@ var vdcProducerByVcdVersion = map[string]vdcProducer{
"vdc10.0": vdcCrudV97,
}

// GetAdminVdcByName function uses a valid VDC name and returns a admin VDC object.
// If no VDC is found, then it returns an empty VDC and no error.
// Otherwise it returns an empty VDC and an error.
// Deprecated: Use adminOrg.GetAdminVDCByName
func (adminOrg *AdminOrg) GetAdminVdcByName(vdcname string) (AdminVdc, error) {
for _, vdcs := range adminOrg.AdminOrg.Vdcs.Vdcs {
if vdcs.Name == vdcname {
adminVdc := NewAdminVdc(adminOrg.client)
_, err := adminOrg.client.ExecuteRequest(vdcs.HREF, http.MethodGet,
"", "error getting vdc: %s", nil, adminVdc.AdminVdc)
return *adminVdc, err
}
}
return AdminVdc{}, nil
}

// GetVDCByHref retrieves a VDC using a direct call with the HREF
func (adminOrg *AdminOrg) GetAdminVDCByHref(vdcHref string) (*AdminVdc, error) {

adminVdc := NewAdminVdc(adminOrg.client)

// We are executing below request with a specific API version in the header, because we want to retrieve the most
// available fields in AdminVdc which vCD provides, but also which our code understands. As we can't blindly use
// the latest version, we're limiting the highest used version to the one we support with
// the GetSpecificApiVersionOnCondition(...) function. Specifically, the API version 32 returns
// two additional fields: IncludeMemoryOverhead and IsElastic for Flex allocation
_, err := adminOrg.client.ExecuteRequestWithApiVersion(vdcHref, http.MethodGet,
"", "error getting vdc: %s", nil, adminVdc.AdminVdc, adminVdc.client.GetSpecificApiVersionOnCondition(">= 32.0", "32.0"))

if err != nil {
return nil, err
}
return adminVdc, nil
}

// GetAdminVDCByName finds an Admin VDC by Name
// On success, returns a pointer to the AdminVdc structure and a nil error
// On failure, returns a nil pointer and an error
func (adminOrg *AdminOrg) GetAdminVDCByName(vdcName string, refresh bool) (*AdminVdc, error) {
if refresh {
err := adminOrg.Refresh()
if err != nil {
return nil, err
}
}
for _, vdc := range adminOrg.AdminOrg.Vdcs.Vdcs {
if vdc.Name == vdcName {
return adminOrg.GetAdminVDCByHref(vdc.HREF)
}
}
return nil, ErrorEntityNotFound
}

// GetAdminVDCById finds an Admin VDC by ID
// On success, returns a pointer to the AdminVdc structure and a nil error
// On failure, returns a nil pointer and an error
func (adminOrg *AdminOrg) GetAdminVDCById(vdcId string, refresh bool) (*AdminVdc, error) {
if refresh {
err := adminOrg.Refresh()
if err != nil {
return nil, err
}
}
for _, vdc := range adminOrg.AdminOrg.Vdcs.Vdcs {
if equalIds(vdcId, vdc.ID, vdc.HREF) {
return adminOrg.GetAdminVDCByHref(vdc.HREF)
}
}
return nil, ErrorEntityNotFound
}

// GetAdminVDCByNameOrId finds an Admin VDC by Name Or ID
// On success, returns a pointer to the AdminVdc structure and a nil error
// On failure, returns a nil pointer and an error
func (adminOrg *AdminOrg) GetAdminVDCByNameOrId(identifier string, refresh bool) (*AdminVdc, error) {
getByName := func(name string, refresh bool) (interface{}, error) {
return adminOrg.GetAdminVDCByName(name, refresh)
}
getById := func(id string, refresh bool) (interface{}, error) { return adminOrg.GetAdminVDCById(id, refresh) }
entity, err := getEntityByNameOrId(getByName, getById, identifier, refresh)
if entity == nil {
return nil, err
}
return entity.(*AdminVdc), err
}

// CreateVdc creates a VDC with the given params under the given organization.
// Returns an AdminVdc.
// API Documentation: https://code.vmware.com/apis/220/vcloud#/doc/doc/operations/POST-VdcConfiguration.html
// Deprecated in favor of adminOrg.CreateOrgVdcAsync
func (adminOrg *AdminOrg) CreateVdc(vdcConfiguration *types.VdcConfiguration) (Task, error) {
err := validateVdcConfiguration(vdcConfiguration)
if err != nil {
return Task{}, err
}

vdcConfiguration.Xmlns = types.XMLNamespaceVCloud

vdcCreateHREF, err := url.ParseRequestURI(adminOrg.AdminOrg.HREF)
if err != nil {
return Task{}, fmt.Errorf("error parsing admin org url: %s", err)
}
vdcCreateHREF.Path += "/vdcsparams"

adminVdc := NewAdminVdc(adminOrg.client)

_, err = adminOrg.client.ExecuteRequest(vdcCreateHREF.String(), http.MethodPost,
"application/vnd.vmware.admin.createVdcParams+xml", "error creating VDC: %s", vdcConfiguration, adminVdc.AdminVdc)
if err != nil {
return Task{}, err
}

// Return the task
task := NewTask(adminOrg.client)
task.Task = adminVdc.AdminVdc.Tasks.Task[0]
return *task, nil
}

// Creates the vdc and waits for the asynchronous task to complete.
// Deprecated in favor of adminOrg.CreateOrgVdc
func (adminOrg *AdminOrg) CreateVdcWait(vdcDefinition *types.VdcConfiguration) error {
task, err := adminOrg.CreateVdc(vdcDefinition)
if err != nil {
return err
}
err = task.WaitTaskCompletion()
if err != nil {
return fmt.Errorf("couldn't finish creating vdc %s", err)
}
return nil
}

// Given an adminVdc with a valid HREF, the function refresh the adminVdc
// and updates the adminVdc data. Returns an error on failure
// Users should use refresh whenever they suspect
Expand Down
3 changes: 1 addition & 2 deletions govcd/adminvdc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ package govcd
import (
"fmt"
"github.com/vmware/go-vcloud-director/v2/types/v56"
"math"

. "gopkg.in/check.v1"
"math"
)

// Tests org function GetVDCByName with the vdc specified
Expand Down

0 comments on commit 65965d2

Please sign in to comment.