github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/vapp_clone_test.go (about) 1 //go:build vapp || functional || ALL 2 // +build vapp functional ALL 3 4 /* 5 * Copyright 2023 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 6 */ 7 8 package govcd 9 10 import ( 11 "fmt" 12 "github.com/vmware/go-vcloud-director/v2/types/v56" 13 . "gopkg.in/check.v1" 14 "time" 15 ) 16 17 // TestVappfromTemplateAndClone creates a vApp with multiple VMs at once, then clones such vApp into a new one 18 func (vcd *TestVCD) TestVappfromTemplateAndClone(check *C) { 19 org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org) 20 check.Assert(err, IsNil) 21 check.Assert(org, NotNil) 22 23 vdc, err := org.GetVDCByName(vcd.config.VCD.Nsxt.Vdc, false) 24 check.Assert(err, IsNil) 25 check.Assert(vdc, NotNil) 26 27 name := check.TestName() 28 description := "test compose raw vApp with template" 29 30 catalog, err := org.GetCatalogByName(vcd.config.VCD.Catalog.NsxtBackedCatalogName, false) 31 check.Assert(err, IsNil) 32 vappTemplateName := vcd.config.VCD.Catalog.CatalogItemWithMultiVms 33 if vappTemplateName == "" { 34 check.Skip(fmt.Sprintf("vApp template missing in configuration - Make sure there is such template in catalog %s -"+ 35 " Using test_resources/vapp_with_3_vms.ova", 36 vcd.config.VCD.Catalog.NsxtBackedCatalogName)) 37 } 38 vappTemplate, err := catalog.GetVAppTemplateByName(vappTemplateName) 39 if err != nil { 40 if ContainsNotFound(err) { 41 check.Skip(fmt.Sprintf("vApp template %s not found - Make sure there is such template in catalog %s -"+ 42 " Using test_resources/vapp_with_3_vms.ova", 43 vappTemplateName, vcd.config.VCD.Catalog.NsxtBackedCatalogName)) 44 } 45 } 46 check.Assert(err, IsNil) 47 check.Assert(vappTemplate.VAppTemplate.Children, NotNil) 48 check.Assert(vappTemplate.VAppTemplate.Children.VM, NotNil) 49 50 var def = types.InstantiateVAppTemplateParams{ 51 Name: name, 52 Deploy: true, 53 PowerOn: true, 54 Description: description, 55 Source: &types.Reference{ 56 HREF: vappTemplate.VAppTemplate.HREF, 57 ID: vappTemplate.VAppTemplate.ID, 58 }, 59 IsSourceDelete: false, 60 AllEULAsAccepted: true, 61 } 62 63 start := time.Now() 64 printVerbose("creating vapp '%s' from template '%s'\n", name, vappTemplateName) 65 vapp, err := vdc.CreateVappFromTemplate(&def) 66 check.Assert(err, IsNil) 67 printVerbose("** created in %s\n", time.Since(start)) 68 69 AddToCleanupList(name, "vapp", vdc.Vdc.Name, name) 70 71 check.Assert(vapp.VApp.Name, Equals, name) 72 check.Assert(vapp.VApp.Description, Equals, description) 73 74 check.Assert(vapp.VApp.Children, NotNil) 75 check.Assert(vapp.VApp.Children.VM, NotNil) 76 77 cloneName := name + "-clone" 78 cloneDescription := description + " clone" 79 var defClone = types.CloneVAppParams{ 80 Name: cloneName, 81 Deploy: true, 82 PowerOn: true, 83 Description: cloneDescription, 84 Source: &types.Reference{ 85 HREF: vapp.VApp.HREF, 86 Type: vapp.VApp.Type, 87 }, 88 IsSourceDelete: addrOf(false), 89 } 90 91 start = time.Now() 92 printVerbose("cloning vapp '%s' from vapp '%s'\n", cloneName, name) 93 vapp2, err := vdc.CloneVapp(&defClone) 94 check.Assert(err, IsNil) 95 printVerbose("** cloned in %s\n", time.Since(start)) 96 97 AddToCleanupList(cloneName, "vapp", vdc.Vdc.Name, name) 98 99 status, err := vapp2.GetStatus() 100 check.Assert(err, IsNil) 101 if status == "SUSPENDED" { 102 printVerbose("\t discarding suspended state for vApp %s\n", vapp2.VApp.Name) 103 err = vapp2.DiscardSuspendedState() 104 check.Assert(err, IsNil) 105 status, err = vapp2.GetStatus() 106 check.Assert(err, IsNil) 107 if status != "POWERED_ON" { 108 printVerbose("\t powering on vApp %s\n", vapp2.VApp.Name) 109 task, err := vapp2.PowerOn() 110 check.Assert(err, IsNil) 111 err = task.WaitTaskCompletion() 112 check.Assert(err, IsNil) 113 } 114 } 115 116 check.Assert(vapp2.VApp.Name, Equals, cloneName) 117 check.Assert(vapp2.VApp.Description, Equals, cloneDescription) 118 check.Assert(vapp.VApp.HREF, Not(Equals), vapp2.VApp.HREF) 119 120 vappRemove(vapp, check) 121 vappRemove(vapp2, check) 122 } 123 124 func vappRemove(vapp *VApp, check *C) { 125 var task Task 126 var err error 127 status, err := vapp.GetStatus() 128 check.Assert(err, IsNil) 129 if status == "POWERED_ON" { 130 printVerbose("powering off vApp '%s'\n", vapp.VApp.Name) 131 task, err = vapp.Undeploy() 132 check.Assert(err, IsNil) 133 err = task.WaitTaskCompletion() 134 check.Assert(err, IsNil) 135 } 136 137 printVerbose("removing networks from vApp '%s'\n", vapp.VApp.Name) 138 task, err = vapp.RemoveAllNetworks() 139 check.Assert(err, IsNil) 140 err = task.WaitTaskCompletion() 141 check.Assert(err, IsNil) 142 143 printVerbose("removing vApp '%s'\n", vapp.VApp.Name) 144 task, err = vapp.Delete() 145 check.Assert(err, IsNil) 146 err = task.WaitTaskCompletion() 147 check.Assert(err, IsNil) 148 }