github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/runtime/kubernetes/kubernetes_test.go (about) 1 //go:build kubernetes 2 // +build kubernetes 3 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // https://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 // Original source: github.com/micro/go-micro/v3/runtime/kubernetes/kubernetes_test.go 17 package kubernetes 18 19 import ( 20 "encoding/base64" 21 "fmt" 22 "io/ioutil" 23 "os" 24 "os/exec" 25 "regexp" 26 "strings" 27 "testing" 28 29 "github.com/tickoalcantara12/micro/v3/service/runtime" 30 "github.com/stretchr/testify/assert" 31 ) 32 33 func setupClient(t *testing.T) { 34 files := []string{"token", "ca.crt"} 35 for _, f := range files { 36 cmd := exec.Command("kubectl", "get", "secrets", "-o", 37 fmt.Sprintf(`jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='micro-runtime')].data.%s}"`, 38 strings.ReplaceAll(f, ".", "\\."))) 39 if outp, err := cmd.Output(); err != nil { 40 t.Fatalf("Failed to set k8s token %s", err) 41 } else { 42 outq := outp[1 : len(outp)-1] 43 decoded, err := base64.StdEncoding.DecodeString(string(outq)) 44 if err != nil { 45 t.Fatalf("Failed to set k8s token %s '%s'", err, outq) 46 } 47 if err := ioutil.WriteFile("/var/run/secrets/kubernetes.io/serviceaccount/"+f, decoded, 0755); err != nil { 48 t.Fatalf("Error setting up k8s %s", err) 49 } 50 } 51 52 } 53 outp, err := exec.Command("kubectl", "config", "view", "-o", `jsonpath='{.clusters[?(@.name=="kind-kind")].cluster.server}'`).Output() 54 if err != nil { 55 t.Fatalf("Cannot find server for kind %s", err) 56 } 57 serverHost := string(outp) 58 59 split := strings.Split(serverHost[9:len(serverHost)-1], ":") 60 os.Setenv("KUBERNETES_SERVICE_HOST", split[0]) 61 os.Setenv("KUBERNETES_SERVICE_PORT", split[1]) 62 63 } 64 65 func TestNamespaceCreateDelete(t *testing.T) { 66 defer func() { 67 exec.Command("kubectl", "-n", "foobar", "delete", "networkpolicy", "baz").Run() 68 exec.Command("kubectl", "delete", "namespace", "foobar").Run() 69 }() 70 setupClient(t) 71 r := NewRuntime() 72 73 // Create a namespace 74 testNamespace, err := runtime.NewNamespace("foobar") 75 assert.NoError(t, err) 76 if err := r.Create(testNamespace); err != nil { 77 t.Fatalf("Unexpected error creating Namespace: %v", err) 78 } 79 80 // Check that the namespace exists 81 if !namespaceExists(t, "foobar") { 82 t.Fatalf("Namespace foobar not found") 83 } 84 85 // Create a networkpolicy: 86 testNetworkPolicy, err := runtime.NewNetworkPolicy("baz", "foobar", nil) 87 assert.NoError(t, err) 88 if err := r.Create(testNetworkPolicy); err != nil { 89 t.Fatalf("Unexpected error creating NetworkPolicy: %v", err) 90 } 91 92 // Check that the networkpolicy exists: 93 if !networkPolicyExists(t, "foobar", "baz") { 94 t.Fatalf("NetworkPolicy foobar.baz not found") 95 } 96 97 // Create a resourcequota: 98 testResourceQuota, err := runtime.NewResourceQuota("caps", "foobar") 99 assert.NoError(t, err) 100 if err := r.Create(testResourceQuota); err != nil { 101 t.Fatalf("Unexpected error creating ResourceQuota: %v", err) 102 } 103 104 // Check that the ResourceQuota exists: 105 if !resourceQuotaExists(t, "foobar", "caps") { 106 t.Fatalf("ResourceQuota foobar.caps not found") 107 } 108 109 // Tidy up 110 if err := r.Delete(testResourceQuota); err != nil { 111 t.Fatalf("Unexpected error deleting ResourceQuota: %v", err) 112 } 113 if resourceQuotaExists(t, "foobar", "caps") { 114 t.Fatalf("ResourceQuota foobar.caps still exists") 115 } 116 if err := r.Delete(testNetworkPolicy); err != nil { 117 t.Fatalf("Unexpected error deleting NetworkPolicy: %v", err) 118 } 119 if networkPolicyExists(t, "foobar", "baz") { 120 t.Fatalf("NetworkPolicy foobar.baz still exists") 121 } 122 if err := r.Delete(testNamespace); err != nil { 123 t.Fatalf("Unexpected error deleting Namespace: %v", err) 124 } 125 if namespaceExists(t, "foobar") { 126 t.Fatalf("Namespace foobar still exists") 127 } 128 } 129 130 func namespaceExists(t *testing.T, ns string) bool { 131 cmd := exec.Command("kubectl", "get", "namespaces") 132 outp, err := cmd.Output() 133 if err != nil { 134 t.Fatalf("Unexpected error listing namespaces %s", err) 135 } 136 exists, err := regexp.Match(ns+"\\s+Active", outp) 137 if err != nil { 138 t.Fatalf("Error listing namespaces %s", err) 139 } 140 return exists 141 } 142 143 func networkPolicyExists(t *testing.T, ns, np string) bool { 144 cmd := exec.Command("kubectl", "-n", ns, "get", "networkpolicy") 145 outp, err := cmd.Output() 146 if err != nil { 147 t.Fatalf("Unexpected error listing networkpolicies %s", err) 148 } 149 exists, err := regexp.Match(np, outp) 150 if err != nil { 151 t.Fatalf("Error listing networkpolicies %s", err) 152 } 153 return exists 154 } 155 156 func resourceQuotaExists(t *testing.T, ns, rq string) bool { 157 cmd := exec.Command("kubectl", "-n", ns, "get", "resourcequota") 158 outp, err := cmd.Output() 159 if err != nil { 160 t.Fatalf("Unexpected error listing resourcequotas %s", err) 161 } 162 exists, err := regexp.Match(rq, outp) 163 if err != nil { 164 t.Fatalf("Error listing resourcequotas %s", err) 165 } 166 return exists 167 }