github.com/verrazzano/verrazzano@v1.7.0/tools/oam-converter/pkg/resources/createresources.go (about)

     1  // Copyright (c) 2023, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package resources
     5  
     6  import (
     7  	"fmt"
     8  	coallateHosts "github.com/verrazzano/verrazzano/pkg/ingresstrait"
     9  	azp "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/resources/authorizationpolicy"
    10  	destination "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/resources/destinationrule"
    11  	gw "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/resources/gateway"
    12  	vs "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/resources/virtualservice"
    13  	"github.com/verrazzano/verrazzano/tools/oam-converter/pkg/resources/workloads"
    14  	"github.com/verrazzano/verrazzano/tools/oam-converter/pkg/types"
    15  	istioclient "istio.io/client-go/pkg/apis/networking/v1alpha3"
    16  	vsapi "istio.io/client-go/pkg/apis/networking/v1beta1"
    17  	clisecurity "istio.io/client-go/pkg/apis/security/v1beta1"
    18  	"sigs.k8s.io/controller-runtime/pkg/client"
    19  )
    20  
    21  func CreateResources(cli client.Client, conversionComponents []*types.ConversionComponents) (*types.KubeResources, error) {
    22  
    23  	var virtualServices []*vsapi.VirtualService
    24  	var destinationRules []*istioclient.DestinationRule
    25  	var authzPolicies []*clisecurity.AuthorizationPolicy
    26  	var virtualService []*vsapi.VirtualService
    27  	var destinationRule []*istioclient.DestinationRule
    28  	var authzPolicy []*clisecurity.AuthorizationPolicy
    29  	outputResources := types.KubeResources{}
    30  
    31  	gateway, allHostsForTrait, err := gw.CreateGatewayResource(cli, conversionComponents)
    32  
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  	listGateway, err := gw.CreateListGateway(gateway)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  
    41  	for _, conversionComponent := range conversionComponents {
    42  
    43  		if conversionComponent.Weblogicworkload != nil || conversionComponent.Coherenceworkload != nil {
    44  
    45  			virtualService, destinationRule, authzPolicy, err = createChildResources(cli, conversionComponent, gateway, allHostsForTrait)
    46  			if err != nil {
    47  				return nil, fmt.Errorf("failed to create Child resources from Weblogic workload %w", err)
    48  
    49  			}
    50  			virtualServices = append(virtualServices, virtualService...)
    51  			destinationRules = append(destinationRules, destinationRule...)
    52  			authzPolicies = append(authzPolicies, authzPolicy...)
    53  
    54  		}
    55  		if conversionComponent.Helidonworkload != nil || conversionComponent.Service != nil {
    56  			virtualService, destinationRule, authzPolicy, err = workloads.CreateIngressChildResourcesFromWorkload(cli, conversionComponent, gateway, allHostsForTrait)
    57  			if err != nil {
    58  				return nil, fmt.Errorf("failed to create Child resources from workload %w", err)
    59  
    60  			}
    61  			virtualServices = append(virtualServices, virtualService...)
    62  			destinationRules = append(destinationRules, destinationRule...)
    63  			authzPolicies = append(authzPolicies, authzPolicy...)
    64  
    65  		}
    66  	}
    67  	//Appending it to Kube Resources to print the output
    68  	outputResources.DestinationRules = destinationRules
    69  	outputResources.AuthPolicies = authzPolicies
    70  	outputResources.VirtualServices = virtualServices
    71  	outputResources.Gateway = listGateway
    72  	return &outputResources, nil
    73  }
    74  
    75  func createChildResources(cli client.Client, conversionComponent *types.ConversionComponents, gateway *vsapi.Gateway, allHostsForTrait []string) ([]*vsapi.VirtualService, []*istioclient.DestinationRule, []*clisecurity.AuthorizationPolicy, error) {
    76  
    77  	if conversionComponent.IngressTrait != nil {
    78  		rules := conversionComponent.IngressTrait.Spec.Rules
    79  		var virtualServices []*vsapi.VirtualService
    80  		var destinationRules []*istioclient.DestinationRule
    81  		var authzPolicies []*clisecurity.AuthorizationPolicy
    82  		for index, rule := range rules {
    83  
    84  			// Find the services associated with the trait in the application configuration.
    85  
    86  			vsHosts, err := coallateHosts.CreateHostsFromIngressTraitRule(cli, rule, conversionComponent.IngressTrait, conversionComponent.AppName, conversionComponent.AppNamespace)
    87  
    88  			if err != nil {
    89  				print(err)
    90  				return nil, nil, nil, err
    91  			}
    92  			vsName := fmt.Sprintf("%s-rule-%d-vs", conversionComponent.IngressTrait.Name, index)
    93  			drName := fmt.Sprintf("%s-rule-%d-dr", conversionComponent.IngressTrait.Name, index)
    94  			authzPolicyName := fmt.Sprintf("%s-rule-%d-authz", conversionComponent.IngressTrait.Name, index)
    95  			virtualService, err := vs.CreateVirtualService(conversionComponent.IngressTrait, rule, vsHosts, vsName, gateway)
    96  			virtualServices = append(virtualServices, virtualService)
    97  
    98  			if err != nil {
    99  				return nil, nil, nil, err
   100  			}
   101  			destinationRule, err := destination.CreateDestinationRule(conversionComponent.IngressTrait, rule, drName)
   102  			destinationRules = append(destinationRules, destinationRule)
   103  			if err != nil {
   104  				return nil, nil, nil, err
   105  			}
   106  			authzPolicy, err := azp.CreateAuthorizationPolicies(conversionComponent.IngressTrait, rule, authzPolicyName, allHostsForTrait)
   107  			if err != nil {
   108  				return nil, nil, nil, err
   109  			}
   110  			authzPolicies = append(authzPolicies, authzPolicy)
   111  		}
   112  		return virtualServices, destinationRules, authzPolicies, nil
   113  	}
   114  
   115  	return nil, nil, nil, fmt.Errorf("ingress Trait is empty")
   116  
   117  }