istio.io/istio@v0.0.0-20240520182934-d79c90f27776/pkg/test/framework/components/gcemetadata/kube.go (about) 1 // Copyright Istio Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package gcemetadata 16 17 import ( 18 "fmt" 19 "io" 20 "net" 21 22 corev1 "k8s.io/api/core/v1" 23 24 environ "istio.io/istio/pkg/test/env" 25 "istio.io/istio/pkg/test/framework/components/cluster" 26 "istio.io/istio/pkg/test/framework/components/namespace" 27 "istio.io/istio/pkg/test/framework/resource" 28 testKube "istio.io/istio/pkg/test/kube" 29 "istio.io/istio/pkg/test/scopes" 30 ) 31 32 const ( 33 ns = "gce-metadata" 34 ) 35 36 var ( 37 _ Instance = &kubeComponent{} 38 _ io.Closer = &kubeComponent{} 39 ) 40 41 type kubeComponent struct { 42 id resource.ID 43 ns namespace.Instance 44 cluster cluster.Cluster 45 address string 46 addressVM string 47 } 48 49 func newKube(ctx resource.Context, cfg Config) (Instance, error) { 50 c := &kubeComponent{ 51 cluster: ctx.Clusters().GetOrDefault(cfg.Cluster), 52 } 53 54 c.id = ctx.TrackResource(c) 55 var err error 56 scopes.Framework.Info("=== BEGIN: Deploy GCE Metadata Server ===") 57 defer func() { 58 if err != nil { 59 err = fmt.Errorf("gcemetadata deployment failed: %v", err) 60 scopes.Framework.Infof("=== FAILED: Deploy GCE Metadata Server ===") 61 _ = c.Close() 62 } else { 63 scopes.Framework.Info("=== SUCCEEDED: Deploy GCE Metadata Server ===") 64 } 65 }() 66 67 c.ns, err = namespace.New(ctx, namespace.Config{ 68 Prefix: ns, 69 }) 70 if err != nil { 71 return nil, fmt.Errorf("could not create %q namespace for GCE Metadata Server install; err: %v", ns, err) 72 } 73 74 // apply YAML 75 if err := c.cluster.ApplyYAMLFiles(c.ns.Name(), environ.GCEMetadataServerInstallFilePath); err != nil { 76 return nil, fmt.Errorf("failed to apply rendered %s, err: %v", environ.GCEMetadataServerInstallFilePath, err) 77 } 78 79 var svc *corev1.Service 80 if svc, _, err = testKube.WaitUntilServiceEndpointsAreReady(c.cluster.Kube(), c.ns.Name(), "gce-metadata-server"); err != nil { 81 scopes.Framework.Infof("Error waiting for GCE Metadata service to be available: %v", err) 82 return nil, err 83 } 84 85 // Multicluster needs to use LoadBalancer IP 86 if ctx.Environment().IsMultiCluster() { 87 lb, err := testKube.WaitUntilServiceLoadBalancerReady(c.cluster.Kube(), c.ns.Name(), "gce-metadata-server") 88 if err != nil { 89 scopes.Framework.Infof("Error waiting for GCE Metadata service LB to be available: %v", err) 90 return nil, err 91 } 92 c.address = net.JoinHostPort(lb, fmt.Sprint(svc.Spec.Ports[0].Port)) 93 c.addressVM = net.JoinHostPort(lb, fmt.Sprint(svc.Spec.Ports[1].Port)) 94 } else { 95 c.address = net.JoinHostPort(svc.Spec.ClusterIP, fmt.Sprint(svc.Spec.Ports[0].Port)) 96 c.addressVM = net.JoinHostPort(svc.Spec.ClusterIP, fmt.Sprint(svc.Spec.Ports[1].Port)) 97 } 98 scopes.Framework.Infof("GCE Metadata Server in-cluster address: %s/%s", c.address, c.addressVM) 99 100 return c, nil 101 } 102 103 func (c *kubeComponent) ID() resource.ID { 104 return c.id 105 } 106 107 // Close implements io.Closer. 108 func (c *kubeComponent) Close() error { 109 return nil 110 } 111 112 func (c *kubeComponent) Address() string { 113 return c.address 114 } 115 116 func (c *kubeComponent) AddressVM() string { 117 return c.addressVM 118 }