github.com/coreos/mantle@v0.13.0/kola/tests/kubernetes/basic.go (about)

     1  // Copyright 2015 CoreOS, Inc.
     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 kubernetes
    16  
    17  import (
    18  	"bytes"
    19  	"fmt"
    20  	"strings"
    21  	"time"
    22  
    23  	"github.com/coreos/mantle/kola/cluster"
    24  	"github.com/coreos/mantle/kola/register"
    25  	"github.com/coreos/mantle/platform"
    26  	"github.com/coreos/mantle/util"
    27  )
    28  
    29  // register a separate test for each version tag
    30  var basicTags = []string{
    31  	"v1.3.4_coreos.0",
    32  }
    33  
    34  // regester each tag once per runtime
    35  var runtimes = []string{
    36  	"docker",
    37  }
    38  
    39  func init() {
    40  	for i := range basicTags {
    41  		for j := range runtimes {
    42  			// use closure to store version and runtime in a Test
    43  			t, r := basicTags[i], runtimes[j]
    44  			f := func(c cluster.TestCluster) {
    45  				CoreOSBasic(c, t, r)
    46  			}
    47  
    48  			register.Register(&register.Test{
    49  				Name:        "google.kubernetes.basic." + r + "." + t,
    50  				Run:         f,
    51  				ClusterSize: 0,
    52  				Platforms:   []string{"gce"},
    53  				Distros:     []string{"cl"},
    54  			})
    55  		}
    56  	}
    57  }
    58  
    59  // Run basic smoke tests on cluster. Assumes master is machine index 1,
    60  // workers make up the rest.
    61  func CoreOSBasic(c cluster.TestCluster, version, runtime string) {
    62  	k := setupCluster(c, 2, version, runtime)
    63  
    64  	// start nginx pod and curl endpoint
    65  	if err := nginxCheck(c, k.master, k.workers); err != nil {
    66  		c.Fatal(err)
    67  	}
    68  
    69  	// http://kubernetes.io/v1.0/docs/user-guide/secrets/ Also, ensures
    70  	// https://github.com/coreos/bugs/issues/447 does not re-occur.
    71  	if err := secretCheck(c, k.master, k.workers); err != nil {
    72  		c.Fatal(err)
    73  	}
    74  }
    75  
    76  func nodeCheck(c cluster.TestCluster, master platform.Machine, nodes []platform.Machine) error {
    77  	b, err := c.SSH(master, "./kubectl get nodes")
    78  	if err != nil {
    79  		return err
    80  	}
    81  
    82  	// parse kubectl output for IPs
    83  	addrMap := map[string]struct{}{}
    84  	for _, line := range strings.Split(string(b), "\n")[1:] {
    85  		addrMap[strings.SplitN(line, " ", 2)[0]] = struct{}{}
    86  	}
    87  
    88  	// add master to node list because it is now normal to register
    89  	// master nodes but have it set as unschedulable in kubernetes v1.2+
    90  	nodes = append(nodes, master)
    91  
    92  	if len(addrMap) != len(nodes) {
    93  		return fmt.Errorf("cannot detect all nodes in kubectl output \n%v\n%v", addrMap, nodes)
    94  	}
    95  	for _, node := range nodes {
    96  		if _, ok := addrMap[node.PrivateIP()]; !ok {
    97  			return fmt.Errorf("node IP missing from kubectl get nodes")
    98  		}
    99  	}
   100  	return nil
   101  }
   102  
   103  func nginxCheck(c cluster.TestCluster, master platform.Machine, nodes []platform.Machine) error {
   104  	pod := strings.NewReader(nginxPodYAML)
   105  	if err := platform.InstallFile(pod, master, "./nginx-pod.yaml"); err != nil {
   106  		return err
   107  	}
   108  	if _, err := c.SSH(master, "./kubectl create -f nginx-pod.yaml"); err != nil {
   109  		return err
   110  	}
   111  	// wait for pod status to be 'Running'
   112  	podIsRunning := func() error {
   113  		b, err := c.SSH(master, "./kubectl get pod nginx --template={{.status.phase}}")
   114  		if err != nil {
   115  			return err
   116  		}
   117  		if !bytes.Equal(b, []byte("Running")) {
   118  			return fmt.Errorf("nginx pod not running: %s", b)
   119  		}
   120  		return nil
   121  	}
   122  	if err := util.Retry(10, 10*time.Second, podIsRunning); err != nil {
   123  		return err
   124  	}
   125  
   126  	// delete pod
   127  	_, err := c.SSH(master, "./kubectl delete pods nginx")
   128  	if err != nil {
   129  		return err
   130  	}
   131  
   132  	return nil
   133  }
   134  
   135  func secretCheck(c cluster.TestCluster, master platform.Machine, nodes []platform.Machine) error {
   136  	// create yaml files
   137  	secret := strings.NewReader(secretYAML)
   138  	pod := strings.NewReader(secretPodYAML)
   139  	if err := platform.InstallFile(secret, master, "./secret.yaml"); err != nil {
   140  		return err
   141  	}
   142  	if err := platform.InstallFile(pod, master, "./secret-pod.yaml"); err != nil {
   143  		return err
   144  	}
   145  
   146  	if _, err := c.SSH(master, "./kubectl create -f secret.yaml"); err != nil {
   147  		return err
   148  	}
   149  	_, err := c.SSH(master, "./kubectl describe secret test-secret")
   150  	if err != nil {
   151  		return err
   152  	}
   153  
   154  	b, err := c.SSH(master, "./kubectl create -f secret-pod.yaml")
   155  	if err != nil {
   156  		return err
   157  	}
   158  	expectedOutput := "value-1"
   159  	if strings.Contains(strings.TrimSpace(string(b)), expectedOutput) {
   160  		return fmt.Errorf("error detecting secret pod")
   161  	}
   162  
   163  	return nil
   164  }
   165  
   166  const (
   167  	secretPodYAML = `apiVersion: v1
   168  kind: Pod
   169  metadata:
   170    name: secret-test-pod
   171  spec:
   172    containers:
   173      - name: test-container
   174        image: kubernetes/mounttest:0.1
   175        command: [ "/mt", "--file_content=/etc/secret-volume/data-1" ]
   176        volumeMounts:
   177            # name must match the volume name below
   178            - name: secret-volume
   179              mountPath: /etc/secret-volume
   180    volumes:
   181      - name: secret-volume
   182        secret:
   183          secretName: test-secret
   184    restartPolicy: Never`
   185  
   186  	secretYAML = `apiVersion: v1
   187  kind: Secret
   188  metadata:
   189    name: test-secret
   190  data:
   191    data-1: dmFsdWUtMQ0K
   192    data-2: dmFsdWUtMg0KDQo=`
   193  
   194  	nginxPodYAML = `apiVersion: v1
   195  kind: Pod
   196  metadata:
   197    name: nginx
   198    labels:
   199      app: nginx
   200  spec:
   201    containers:
   202    - name: nginx
   203      image: nginx
   204      ports:
   205      - containerPort: 80`
   206  )