github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_firewall.go (about)

     1  /*
     2   * Copyright 2021 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     3   */
     4  
     5  package govcd
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    11  )
    12  
    13  // NsxtFirewall contains a types.NsxtFirewallRuleContainer which encloses three types of rules -
    14  // system, default and user defined rules. User defined rules are the only ones that can be modified, others are
    15  // read-only.
    16  type NsxtFirewall struct {
    17  	NsxtFirewallRuleContainer *types.NsxtFirewallRuleContainer
    18  	client                    *Client
    19  	// edgeGatewayId is stored for usage in NsxtFirewall receiver functions
    20  	edgeGatewayId string
    21  }
    22  
    23  // UpdateNsxtFirewall allows user to set new firewall rules or update existing ones. The API does not have POST endpoint
    24  // and always uses PUT endpoint for creating and updating.
    25  func (egw *NsxtEdgeGateway) UpdateNsxtFirewall(firewallRules *types.NsxtFirewallRuleContainer) (*NsxtFirewall, error) {
    26  	client := egw.client
    27  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtFirewallRules
    28  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  
    33  	// Insert Edge Gateway ID into endpoint path edgeGateways/%s/firewall/rules
    34  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID))
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  
    39  	returnObject := &NsxtFirewall{
    40  		NsxtFirewallRuleContainer: &types.NsxtFirewallRuleContainer{},
    41  		client:                    client,
    42  		edgeGatewayId:             egw.EdgeGateway.ID,
    43  	}
    44  
    45  	err = client.OpenApiPutItem(minimumApiVersion, urlRef, nil, firewallRules, returnObject.NsxtFirewallRuleContainer, nil)
    46  	if err != nil {
    47  		return nil, fmt.Errorf("error setting NSX-T Firewall: %s", err)
    48  	}
    49  
    50  	return returnObject, nil
    51  }
    52  
    53  // GetNsxtFirewall retrieves all firewall rules system, default and user defined rules
    54  func (egw *NsxtEdgeGateway) GetNsxtFirewall() (*NsxtFirewall, error) {
    55  	client := egw.client
    56  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtFirewallRules
    57  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	// Insert Edge Gateway ID into endpoint path edgeGateways/%s/firewall/rules
    63  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID))
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  
    68  	returnObject := &NsxtFirewall{
    69  		NsxtFirewallRuleContainer: &types.NsxtFirewallRuleContainer{},
    70  		client:                    client,
    71  		edgeGatewayId:             egw.EdgeGateway.ID,
    72  	}
    73  
    74  	err = client.OpenApiGetItem(minimumApiVersion, urlRef, nil, returnObject.NsxtFirewallRuleContainer, nil)
    75  	if err != nil {
    76  		return nil, fmt.Errorf("error retrieving NSX-T Firewall rules: %s", err)
    77  	}
    78  
    79  	// Store Edge Gateway ID for later operations
    80  	returnObject.edgeGatewayId = egw.EdgeGateway.ID
    81  
    82  	return returnObject, nil
    83  }
    84  
    85  // DeleteAllRules allows users to delete all NSX-T Firewall rules in a particular Edge Gateway
    86  func (firewall *NsxtFirewall) DeleteAllRules() error {
    87  
    88  	if firewall.edgeGatewayId == "" {
    89  		return fmt.Errorf("missing Edge Gateway ID")
    90  	}
    91  
    92  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtFirewallRules
    93  	minimumApiVersion, err := firewall.client.checkOpenApiEndpointCompatibility(endpoint)
    94  	if err != nil {
    95  		return err
    96  	}
    97  
    98  	urlRef, err := firewall.client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, firewall.edgeGatewayId))
    99  	if err != nil {
   100  		return err
   101  	}
   102  
   103  	err = firewall.client.OpenApiDeleteItem(minimumApiVersion, urlRef, nil, nil)
   104  
   105  	if err != nil {
   106  		return fmt.Errorf("error deleting all NSX-T Firewall Rules: %s", err)
   107  	}
   108  
   109  	return nil
   110  }
   111  
   112  // DeleteRuleById allows users to delete NSX-T Firewall Rule By ID
   113  func (firewall *NsxtFirewall) DeleteRuleById(id string) error {
   114  	if id == "" {
   115  		return fmt.Errorf("empty ID specified")
   116  	}
   117  
   118  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtFirewallRules
   119  	minimumApiVersion, err := firewall.client.checkOpenApiEndpointCompatibility(endpoint)
   120  	if err != nil {
   121  		return err
   122  	}
   123  
   124  	urlRef, err := firewall.client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, firewall.edgeGatewayId), "/", id)
   125  	if err != nil {
   126  		return err
   127  	}
   128  
   129  	err = firewall.client.OpenApiDeleteItem(minimumApiVersion, urlRef, nil, nil)
   130  
   131  	if err != nil {
   132  		return fmt.Errorf("error deleting NSX-T Firewall Rule with ID '%s': %s", id, err)
   133  	}
   134  
   135  	return nil
   136  }