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  }