magefiles/kubernetes/provision/provisioner.go (87 lines of code) (raw):

package provision import ( "bytes" "fmt" "os" "os/exec" "text/template" "github.com/magefile/mage/sh" "gitlab.com/gitlab-org/gitlab-runner/magefiles/kubernetes/docs" ) const ( baseName = "k8s-runner-integration-tests-runner" namespace = "k8s-runner-integration-tests" ) func ProvisionIntegrationKubernetes(id string) error { permissions, err := docs.ParsePermissions() if err != nil { return err } name := baseName + "-" + id role, err := docs.GeneratePermissionsDocsRoleYaml(name, namespace, map[string]string{ "test.k8s.gitlab.com/name": name, }, permissions) if err != nil { return err } files := map[string][]byte{ "role": []byte(role), } for _, file := range []string{"rolebinding", "serviceaccount"} { manifest, err := renderManifest(name, file) if err != nil { return err } files[file] = manifest } for name, yamlBytes := range files { cmd := exec.Command("kubectl", "apply", "-f", "-") cmd.Stdin = bytes.NewReader(yamlBytes) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return fmt.Errorf("error applying %s yaml: %w", name, err) } } return nil } func renderManifest(name, file string) ([]byte, error) { manifest, err := os.ReadFile("magefiles/kubernetes/provision/manifests/" + file + ".yaml.tpl") if err != nil { return nil, err } tpl := template.New(file) tpl, err = tpl.Parse(string(manifest)) if err != nil { return nil, fmt.Errorf("error parsing %s template: %w", file, err) } buffer := new(bytes.Buffer) err = tpl.Execute(buffer, map[string]any{ "Name": name, "Namespace": namespace, }) if err != nil { return nil, fmt.Errorf("error executing %s template: %w", file, err) } return buffer.Bytes(), nil } func DestroyIntegrationKubernetes(id string) error { name := baseName + "-" + id for _, file := range []string{"rolebinding", "serviceaccount"} { manifest, err := renderManifest(name, file) if err != nil { return err } cmd := exec.Command("kubectl", "delete", "--ignore-not-found=true", "-f", "-") cmd.Stdin = bytes.NewReader(manifest) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return fmt.Errorf("error deleting %s yaml: %w", name, err) } } if err := sh.RunV("kubectl", "delete", "--ignore-not-found=true", "role", "-n", namespace, name); err != nil { return fmt.Errorf("error deleting role: %w", err) } return nil }