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  }