github.com/apprenda/kismatic@v1.12.0/integration-tests/validate.go (about)

     1  package integration_tests
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"html/template"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  	"time"
    12  
    13  	homedir "github.com/mitchellh/go-homedir"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  func validateMiniPkgInstallationDisabled(provisioner infrastructureProvisioner, distro linuxDistro) {
    19  	WithMiniInfrastructure(distro, provisioner, func(node NodeDeets, sshKey string) {
    20  		sshUser := node.SSHUser
    21  		if err := ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    22  			Fail("Missing dependencies, but still passed")
    23  		}
    24  
    25  		By("Adding docker repository")
    26  		prep := getPrepForDistro(distro)
    27  		theNode := []NodeDeets{node}
    28  		err := runViaSSH(prep.CommandsToPrepDockerRepo, theNode, sshKey, 5*time.Minute)
    29  		FailIfError(err, "failed to add docker repository")
    30  
    31  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    32  			Fail("Missing dependencies, but still passed")
    33  		}
    34  
    35  		By("Installing Docker")
    36  		err = runViaSSH(prep.CommandsToInstallDocker, theNode, sshKey, 5*time.Minute)
    37  		FailIfError(err, "failed to install docker")
    38  
    39  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    40  			Fail("Missing dependencies, but still passed")
    41  		}
    42  
    43  		By("Adding kubernetes repository")
    44  		err = runViaSSH(prep.CommandsToPrepKubernetesRepo, theNode, sshKey, 5*time.Minute)
    45  		FailIfError(err, "failed to add kubernetes repository")
    46  
    47  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    48  			Fail("Missing dependencies, but still passed")
    49  		}
    50  
    51  		By("Installing Kubelet")
    52  		err = runViaSSH(prep.CommandsToInstallKubelet, theNode, sshKey, 5*time.Minute)
    53  		FailIfError(err, "failed to install the kubelet package")
    54  
    55  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    56  			Fail("Missing dependencies, but still passed")
    57  		}
    58  
    59  		By("Installing Kubectl")
    60  		err = runViaSSH(prep.CommandsToInstallKubectl, theNode, sshKey, 5*time.Minute)
    61  		FailIfError(err, "failed to install the kubectl package")
    62  
    63  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    64  			Fail("Missing dependencies, but still passed")
    65  		}
    66  
    67  		By("Installing Glusterfs Server")
    68  		err = runViaSSH(prep.CommandsToInstallGlusterfs, theNode, sshKey, 5*time.Minute)
    69  		FailIfError(err, "failed to install the glusterfs package")
    70  
    71  		err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey)
    72  		Expect(err).To(BeNil())
    73  	})
    74  }
    75  
    76  // ValidateKismaticMini runs validation against a mini Kubernetes cluster
    77  func ValidateKismaticMini(node NodeDeets, user, sshKey string) PlanAWS {
    78  	By("Building a template")
    79  	template, err := template.New("planAWSOverlay").Parse(planAWSOverlay)
    80  	FailIfError(err, "Couldn't parse template")
    81  
    82  	log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP)
    83  	By("Building a plan to set up an overlay network cluster on this hardware")
    84  	plan := PlanAWS{
    85  		Etcd:         []NodeDeets{node},
    86  		Master:       []NodeDeets{node},
    87  		Worker:       []NodeDeets{node},
    88  		LoadBalancer: node.Hostname,
    89  		SSHUser:      user,
    90  		SSHKeyFile:   sshKey,
    91  	}
    92  
    93  	// Create template file
    94  	f, fileErr := os.Create("kismatic-testing.yaml")
    95  	FailIfError(fileErr, "Error waiting for nodes")
    96  	defer f.Close()
    97  	w := bufio.NewWriter(f)
    98  	execErr := template.Execute(w, &plan)
    99  	FailIfError(execErr, "Error filling in plan template")
   100  	w.Flush()
   101  
   102  	// Run validation
   103  	By("Validate our plan")
   104  	err = runValidate(f.Name())
   105  	FailIfError(err, "Error validating plan")
   106  	return plan
   107  }
   108  
   109  func ValidateKismaticMiniDenyPkgInstallation(node NodeDeets, sshUser, sshKey string) error {
   110  	By("Building a template")
   111  	template, err := template.New("planAWSOverlay").Parse(planAWSOverlay)
   112  	FailIfError(err, "Couldn't parse template")
   113  
   114  	log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP)
   115  	By("Building a plan to set up an overlay network cluster on this hardware")
   116  	plan := PlanAWS{
   117  		DisablePackageInstallation: true,
   118  		Etcd:         []NodeDeets{node},
   119  		Master:       []NodeDeets{node},
   120  		Worker:       []NodeDeets{node},
   121  		Ingress:      []NodeDeets{node},
   122  		Storage:      []NodeDeets{node},
   123  		LoadBalancer: node.Hostname,
   124  		SSHUser:      sshUser,
   125  		SSHKeyFile:   sshKey,
   126  	}
   127  
   128  	// Create template file
   129  	f, fileErr := os.Create("kismatic-testing.yaml")
   130  	FailIfError(fileErr, "Error waiting for nodes")
   131  	defer f.Close()
   132  	w := bufio.NewWriter(f)
   133  	execErr := template.Execute(w, &plan)
   134  	FailIfError(execErr, "Error filling in plan template")
   135  	w.Flush()
   136  
   137  	// Run validation
   138  	By("Validate our plan")
   139  	return runValidate(f.Name())
   140  }
   141  
   142  func ValidateKismaticMiniWithBadSSH(node NodeDeets, user, sshKey string) PlanAWS {
   143  	By("Building a template")
   144  	template, err := template.New("planAWSOverlay").Parse(planAWSOverlay)
   145  	FailIfError(err, "Couldn't parse template")
   146  
   147  	log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP)
   148  	By("Building a plan to set up an overlay network cluster on this hardware")
   149  	plan := PlanAWS{
   150  		Etcd:         []NodeDeets{node},
   151  		Master:       []NodeDeets{node},
   152  		Worker:       []NodeDeets{node},
   153  		LoadBalancer: node.Hostname,
   154  		SSHUser:      user,
   155  		SSHKeyFile:   sshKey,
   156  	}
   157  
   158  	// Create template file
   159  	f, fileErr := os.Create("kismatic-testing.yaml")
   160  	FailIfError(fileErr, "Error waiting for nodes")
   161  	defer f.Close()
   162  	w := bufio.NewWriter(f)
   163  	execErr := template.Execute(w, &plan)
   164  	FailIfError(execErr, "Error filling in plan template")
   165  	w.Flush()
   166  
   167  	// Run validation
   168  	By("Validate our plan")
   169  	err = runValidate(f.Name())
   170  	FailIfSuccess(err)
   171  	return plan
   172  }
   173  
   174  func getBadSSHKeyFile() (string, error) {
   175  	dir, err := homedir.Dir()
   176  	if err != nil {
   177  		return "", err
   178  	}
   179  	// create empty file
   180  	_, err = os.Create(filepath.Join(dir, ".ssh", "bad.pem"))
   181  	if err != nil {
   182  		return "", fmt.Errorf("Unable to create tag file!")
   183  	}
   184  
   185  	return filepath.Join(dir, ".ssh", "bad.pem"), nil
   186  }
   187  
   188  func runValidate(planFile string) error {
   189  	cmd := exec.Command("./kismatic", "install", "validate", "-f", planFile)
   190  	cmd.Stdout = os.Stdout
   191  	cmd.Stderr = os.Stderr
   192  	return cmd.Run()
   193  }