github.com/jlmeeker/kismatic@v1.10.1-0.20180612190640-57f9005a1f1a/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 MasterNodeFQDN: node.Hostname, 89 MasterNodeShortName: node.Hostname, 90 SSHUser: user, 91 SSHKeyFile: sshKey, 92 } 93 94 // Create template file 95 f, fileErr := os.Create("kismatic-testing.yaml") 96 FailIfError(fileErr, "Error waiting for nodes") 97 defer f.Close() 98 w := bufio.NewWriter(f) 99 execErr := template.Execute(w, &plan) 100 FailIfError(execErr, "Error filling in plan template") 101 w.Flush() 102 103 // Run validation 104 By("Validate our plan") 105 err = runValidate(f.Name()) 106 FailIfError(err, "Error validating plan") 107 return plan 108 } 109 110 func ValidateKismaticMiniDenyPkgInstallation(node NodeDeets, sshUser, sshKey string) error { 111 By("Building a template") 112 template, err := template.New("planAWSOverlay").Parse(planAWSOverlay) 113 FailIfError(err, "Couldn't parse template") 114 115 log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP) 116 By("Building a plan to set up an overlay network cluster on this hardware") 117 plan := PlanAWS{ 118 DisablePackageInstallation: true, 119 Etcd: []NodeDeets{node}, 120 Master: []NodeDeets{node}, 121 Worker: []NodeDeets{node}, 122 Ingress: []NodeDeets{node}, 123 Storage: []NodeDeets{node}, 124 MasterNodeFQDN: node.Hostname, 125 MasterNodeShortName: node.Hostname, 126 SSHUser: sshUser, 127 SSHKeyFile: sshKey, 128 } 129 130 // Create template file 131 f, fileErr := os.Create("kismatic-testing.yaml") 132 FailIfError(fileErr, "Error waiting for nodes") 133 defer f.Close() 134 w := bufio.NewWriter(f) 135 execErr := template.Execute(w, &plan) 136 FailIfError(execErr, "Error filling in plan template") 137 w.Flush() 138 139 // Run validation 140 By("Validate our plan") 141 return runValidate(f.Name()) 142 } 143 144 func ValidateKismaticMiniWithBadSSH(node NodeDeets, user, sshKey string) PlanAWS { 145 By("Building a template") 146 template, err := template.New("planAWSOverlay").Parse(planAWSOverlay) 147 FailIfError(err, "Couldn't parse template") 148 149 log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP) 150 By("Building a plan to set up an overlay network cluster on this hardware") 151 plan := PlanAWS{ 152 Etcd: []NodeDeets{node}, 153 Master: []NodeDeets{node}, 154 Worker: []NodeDeets{node}, 155 MasterNodeFQDN: node.Hostname, 156 MasterNodeShortName: node.Hostname, 157 SSHUser: user, 158 SSHKeyFile: sshKey, 159 } 160 161 // Create template file 162 f, fileErr := os.Create("kismatic-testing.yaml") 163 FailIfError(fileErr, "Error waiting for nodes") 164 defer f.Close() 165 w := bufio.NewWriter(f) 166 execErr := template.Execute(w, &plan) 167 FailIfError(execErr, "Error filling in plan template") 168 w.Flush() 169 170 // Run validation 171 By("Validate our plan") 172 err = runValidate(f.Name()) 173 FailIfSuccess(err) 174 return plan 175 } 176 177 func getBadSSHKeyFile() (string, error) { 178 dir, err := homedir.Dir() 179 if err != nil { 180 return "", err 181 } 182 // create empty file 183 _, err = os.Create(filepath.Join(dir, ".ssh", "bad.pem")) 184 if err != nil { 185 return "", fmt.Errorf("Unable to create tag file!") 186 } 187 188 return filepath.Join(dir, ".ssh", "bad.pem"), nil 189 } 190 191 func runValidate(planFile string) error { 192 cmd := exec.Command("./kismatic", "install", "validate", "-f", planFile) 193 cmd.Stdout = os.Stdout 194 cmd.Stderr = os.Stderr 195 return cmd.Run() 196 }