github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/defined_interface_test.go (about) 1 //go:build functional || openapi || rde || ALL 2 3 /* 4 * Copyright 2023 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 5 */ 6 7 package govcd 8 9 import ( 10 "fmt" 11 "github.com/vmware/go-vcloud-director/v2/types/v56" 12 . "gopkg.in/check.v1" 13 "strings" 14 ) 15 16 // Test_DefinedInterface tests the CRUD behavior of Defined Interfaces as a System administrator and tenant user. 17 // This test can be run with GOVCD_SKIP_VAPP_CREATION option enabled. 18 func (vcd *TestVCD) Test_DefinedInterface(check *C) { 19 if vcd.skipAdminTests { 20 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 21 } 22 skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointRdeInterfaces) 23 if len(vcd.config.Tenants) == 0 { 24 check.Skip("skipping as there is no configured tenant users") 25 } 26 27 // Creates the clients for the System admin and the Tenant user 28 systemAdministratorClient := vcd.client 29 tenantUserClient := NewVCDClient(vcd.client.Client.VCDHREF, true) 30 err := tenantUserClient.Authenticate(vcd.config.Tenants[0].User, vcd.config.Tenants[0].Password, vcd.config.Tenants[0].SysOrg) 31 check.Assert(err, IsNil) 32 33 // First, it checks how many exist already, as VCD contains some pre-defined ones. 34 allDefinedInterfacesBySysAdmin, err := systemAdministratorClient.GetAllDefinedInterfaces(nil) 35 check.Assert(err, IsNil) 36 alreadyPresentRDEs := len(allDefinedInterfacesBySysAdmin) 37 38 allDefinedInterfacesByTenant, err := tenantUserClient.GetAllDefinedInterfaces(nil) 39 check.Assert(err, IsNil) 40 check.Assert(len(allDefinedInterfacesByTenant), Equals, len(allDefinedInterfacesBySysAdmin)) 41 42 // Then we create a new Defined Interface with System administrator. We replace the dots in both 43 // nss and name as API is quirky at versions of VCD <= 10.3.0 44 dummyRde := &types.DefinedInterface{ 45 Name: strings.ReplaceAll(check.TestName()+"name", ".", ""), 46 Nss: strings.ReplaceAll(check.TestName()+"nss", ".", ""), 47 Version: "1.2.3", 48 Vendor: "vmware", 49 } 50 newDefinedInterfaceFromSysAdmin, err := systemAdministratorClient.CreateDefinedInterface(dummyRde) 51 check.Assert(err, IsNil) 52 check.Assert(newDefinedInterfaceFromSysAdmin, NotNil) 53 check.Assert(newDefinedInterfaceFromSysAdmin.DefinedInterface.Name, Equals, dummyRde.Name) 54 check.Assert(newDefinedInterfaceFromSysAdmin.DefinedInterface.Nss, Equals, dummyRde.Nss) 55 check.Assert(newDefinedInterfaceFromSysAdmin.DefinedInterface.Version, Equals, dummyRde.Version) 56 check.Assert(newDefinedInterfaceFromSysAdmin.DefinedInterface.Vendor, Equals, dummyRde.Vendor) 57 check.Assert(newDefinedInterfaceFromSysAdmin.DefinedInterface.IsReadOnly, Equals, dummyRde.IsReadOnly) 58 AddToCleanupListOpenApi(newDefinedInterfaceFromSysAdmin.DefinedInterface.ID, check.TestName(), types.OpenApiPathVersion1_0_0+types.OpenApiEndpointRdeInterfaces+newDefinedInterfaceFromSysAdmin.DefinedInterface.ID) 59 60 // Tenants can't create Defined Interfaces. We replace the dots in both 61 // nss and name as API is quirky at versions of VCD <= 10.3.0 62 nilDefinedInterface, err := tenantUserClient.CreateDefinedInterface(&types.DefinedInterface{ 63 Name: strings.ReplaceAll(check.TestName()+"name2", ".", ""), 64 Nss: strings.ReplaceAll(check.TestName()+"name2", ".", ""), 65 Version: "4.5.6", 66 Vendor: "vmware", 67 }) 68 check.Assert(err, NotNil) 69 check.Assert(nilDefinedInterface, IsNil) 70 check.Assert(strings.Contains(err.Error(), "ACCESS_TO_RESOURCE_IS_FORBIDDEN"), Equals, true) 71 72 // As we created a new one, we check the new count is correct in both System admin and Tenant user 73 allDefinedInterfacesBySysAdmin, err = systemAdministratorClient.GetAllDefinedInterfaces(nil) 74 check.Assert(err, IsNil) 75 check.Assert(len(allDefinedInterfacesBySysAdmin), Equals, alreadyPresentRDEs+1) 76 77 allDefinedInterfacesByTenant, err = tenantUserClient.GetAllDefinedInterfaces(nil) 78 check.Assert(err, IsNil) 79 check.Assert(len(allDefinedInterfacesByTenant), Equals, len(allDefinedInterfacesBySysAdmin)) 80 81 // Test the multiple ways of getting a Defined Interface in both users. 82 obtainedDefinedInterface, err := systemAdministratorClient.GetDefinedInterfaceById(newDefinedInterfaceFromSysAdmin.DefinedInterface.ID) 83 check.Assert(err, IsNil) 84 check.Assert(*obtainedDefinedInterface.DefinedInterface, DeepEquals, *newDefinedInterfaceFromSysAdmin.DefinedInterface) 85 86 obtainedDefinedInterface, err = tenantUserClient.GetDefinedInterfaceById(newDefinedInterfaceFromSysAdmin.DefinedInterface.ID) 87 check.Assert(err, IsNil) 88 check.Assert(*obtainedDefinedInterface.DefinedInterface, DeepEquals, *newDefinedInterfaceFromSysAdmin.DefinedInterface) 89 90 obtainedDefinedInterface2, err := systemAdministratorClient.GetDefinedInterface(obtainedDefinedInterface.DefinedInterface.Vendor, obtainedDefinedInterface.DefinedInterface.Nss, obtainedDefinedInterface.DefinedInterface.Version) 91 check.Assert(err, IsNil) 92 check.Assert(*obtainedDefinedInterface2.DefinedInterface, DeepEquals, *obtainedDefinedInterface.DefinedInterface) 93 94 obtainedDefinedInterface2, err = tenantUserClient.GetDefinedInterface(obtainedDefinedInterface.DefinedInterface.Vendor, obtainedDefinedInterface.DefinedInterface.Nss, obtainedDefinedInterface.DefinedInterface.Version) 95 check.Assert(err, IsNil) 96 check.Assert(*obtainedDefinedInterface2.DefinedInterface, DeepEquals, *obtainedDefinedInterface.DefinedInterface) 97 98 // Update the Defined Interface as System administrator 99 err = newDefinedInterfaceFromSysAdmin.Update(types.DefinedInterface{ 100 Name: dummyRde.Name + "3", // Only name can be updated 101 }) 102 check.Assert(err, IsNil) 103 check.Assert(newDefinedInterfaceFromSysAdmin.DefinedInterface.Name, Equals, dummyRde.Name+"3") 104 105 // This one was obtained by the tenant, so it shouldn't be updatable 106 err = obtainedDefinedInterface2.Update(types.DefinedInterface{ 107 Name: dummyRde.Name + "4", 108 }) 109 check.Assert(err, NotNil) 110 check.Assert(strings.Contains(err.Error(), "ACCESS_TO_RESOURCE_IS_FORBIDDEN"), Equals, true) 111 112 // This one was obtained by the tenant, so it shouldn't be deletable 113 err = obtainedDefinedInterface2.Delete() 114 check.Assert(err, NotNil) 115 check.Assert(strings.Contains(err.Error(), "ACCESS_TO_RESOURCE_IS_FORBIDDEN"), Equals, true) 116 117 // We perform the actual removal with the System administrator 118 deletedId := newDefinedInterfaceFromSysAdmin.DefinedInterface.ID 119 err = newDefinedInterfaceFromSysAdmin.Delete() 120 check.Assert(err, IsNil) 121 check.Assert(*newDefinedInterfaceFromSysAdmin.DefinedInterface, DeepEquals, types.DefinedInterface{}) 122 123 _, err = systemAdministratorClient.GetDefinedInterfaceById(deletedId) 124 check.Assert(err, NotNil) 125 check.Assert(strings.Contains(err.Error(), ErrorEntityNotFound.Error()), Equals, true) 126 } 127 128 // Test_DefinedInterfaceBehavior tests the CRUD methods of Defined Interfaces to create Behaviors. 129 // This test can be run with GOVCD_SKIP_VAPP_CREATION option enabled. 130 func (vcd *TestVCD) Test_DefinedInterfaceBehavior(check *C) { 131 if vcd.skipAdminTests { 132 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 133 } 134 skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointRdeInterfaceBehaviors) 135 136 // Create a new Defined Interface with dummy values, so we can test behaviors on it 137 sanizitedTestName := strings.NewReplacer("_", "", ".", "").Replace(check.TestName()) 138 di, err := vcd.client.CreateDefinedInterface(&types.DefinedInterface{ 139 Name: sanizitedTestName, 140 Nss: "nss", 141 Version: "1.0.0", 142 Vendor: "vmware", 143 }) 144 check.Assert(err, IsNil) 145 AddToCleanupListOpenApi(di.DefinedInterface.ID, check.TestName(), types.OpenApiPathVersion1_0_0+types.OpenApiEndpointRdeInterfaces+di.DefinedInterface.ID) 146 defer func() { 147 err := di.Delete() 148 check.Assert(err, IsNil) 149 }() 150 151 // Create a new Behavior payload with an Activity type. 152 behaviorPayload := types.Behavior{ 153 Name: sanizitedTestName, 154 Description: "Generated by " + check.TestName(), 155 Execution: map[string]interface{}{ 156 "id": "TestActivity", 157 "type": "Activity", 158 }, 159 } 160 behavior, err := di.AddBehavior(behaviorPayload) 161 check.Assert(err, IsNil) 162 check.Assert(behavior.Name, Equals, behaviorPayload.Name) 163 check.Assert(behavior.Description, Equals, behaviorPayload.Description) 164 check.Assert(behavior.Ref, Equals, fmt.Sprintf("urn:vcloud:behavior-interface:%s:%s:%s:%s", behaviorPayload.Name, di.DefinedInterface.Vendor, di.DefinedInterface.Nss, di.DefinedInterface.Version)) 165 check.Assert(behavior.ID, Equals, behavior.Ref) 166 167 // Try to add the same behavior again. 168 _, err = di.AddBehavior(behaviorPayload) 169 check.Assert(err, NotNil) 170 check.Assert(strings.Contains(err.Error(), "RDE_BEHAVIOR_ALREADY_EXISTS"), Equals, true) 171 172 // We check that the Behaviors can be retrieved 173 allBehaviors, err := di.GetAllBehaviors(nil) 174 check.Assert(err, IsNil) 175 check.Assert(1, Equals, len(allBehaviors)) 176 check.Assert(allBehaviors[0], DeepEquals, behavior) 177 178 // Error getting non-existing Behaviors 179 _, err = di.GetBehaviorById("urn:vcloud:behavior-interface:notexist:notexist:notexist:9.9.9") 180 check.Assert(err, NotNil) 181 check.Assert(strings.Contains(err.Error(), ErrorEntityNotFound.Error()), Equals, true) 182 183 _, err = di.GetBehaviorByName("DoesNotExist") 184 check.Assert(err, NotNil) 185 check.Assert(strings.Contains(err.Error(), ErrorEntityNotFound.Error()), Equals, true) 186 187 // Getting behaviors correctly 188 retrievedBehavior, err := di.GetBehaviorById(behavior.ID) 189 check.Assert(err, IsNil) 190 check.Assert(retrievedBehavior, NotNil) 191 check.Assert(retrievedBehavior.Name, Equals, behavior.Name) 192 check.Assert(retrievedBehavior.Description, Equals, behavior.Description) 193 check.Assert(retrievedBehavior.Execution, DeepEquals, behavior.Execution) 194 195 retrievedBehavior2, err := di.GetBehaviorByName(behavior.Name) 196 check.Assert(err, IsNil) 197 check.Assert(retrievedBehavior, NotNil) 198 check.Assert(retrievedBehavior, DeepEquals, retrievedBehavior2) 199 200 updatePayload := types.Behavior{ 201 Description: "Updated description", 202 Execution: map[string]interface{}{ 203 "id": "TestActivityUpdated", 204 "type": "Activity", 205 }, 206 Ref: "notGoingToUpdate1", 207 Name: "notGoingToUpdate2", 208 } 209 _, err = di.UpdateBehavior(updatePayload) 210 check.Assert(err, NotNil) 211 check.Assert(err.Error(), Equals, "ID of the Behavior to update is empty") 212 213 updatePayload.ID = retrievedBehavior.ID 214 updatedBehavior, err := di.UpdateBehavior(updatePayload) 215 check.Assert(err, IsNil) 216 check.Assert(updatedBehavior.ID, Equals, retrievedBehavior.ID) 217 check.Assert(updatedBehavior.Ref, Equals, retrievedBehavior.Ref) // This cannot be updated 218 check.Assert(updatedBehavior.Name, Equals, retrievedBehavior.Name) // This cannot be updated 219 check.Assert(updatedBehavior.Execution, DeepEquals, updatePayload.Execution) 220 check.Assert(updatedBehavior.Description, Equals, updatePayload.Description) 221 222 err = di.DeleteBehavior(behavior.ID) 223 check.Assert(err, IsNil) 224 }