| Victor Ryzhenkin | 14354ac | 2017-09-27 17:42:30 +0400 | [diff] [blame] | 1 | #    Copyright 2017 Mirantis, Inc. | 
 | 2 | # | 
 | 3 | #    Licensed under the Apache License, Version 2.0 (the "License"); you may | 
 | 4 | #    not use this file except in compliance with the License. You may obtain | 
 | 5 | #    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, WITHOUT | 
 | 11 | #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
 | 12 | #    License for the specific language governing permissions and limitations | 
 | 13 | #    under the License. | 
 | 14 |  | 
 | 15 | import pytest | 
 | 16 |  | 
 | 17 | from tcp_tests import logger | 
 | 18 | from tcp_tests import settings | 
 | 19 |  | 
 | 20 | LOG = logger.logger | 
 | 21 |  | 
 | 22 |  | 
 | 23 | class TestMCPK8sActions(object): | 
 | 24 |     """Test class for different k8s actions""" | 
 | 25 |  | 
| Tatyana Leontovich | c411ec3 | 2017-10-09 14:48:00 +0300 | [diff] [blame] | 26 |     @pytest.mark.grab_versions | 
| Victor Ryzhenkin | 14354ac | 2017-09-27 17:42:30 +0400 | [diff] [blame] | 27 |     @pytest.mark.fail_snapshot | 
| Tatyana Leontovich | 071ce6a | 2017-10-24 18:08:10 +0300 | [diff] [blame] | 28 |     @pytest.mark.cz8116 | 
| Dennis Dmitriev | 0f624a8 | 2018-06-11 12:57:13 +0300 | [diff] [blame] | 29 |     @pytest.mark.k8s_calico | 
| Victor Ryzhenkin | 14354ac | 2017-09-27 17:42:30 +0400 | [diff] [blame] | 30 |     def test_k8s_externaldns_coredns(self, show_step, config, k8s_deployed): | 
 | 31 |         """Test externaldns integration with coredns | 
 | 32 |  | 
 | 33 |         Scenario: | 
 | 34 |         1. Install k8s with externaldns addon enabled(including etcd, coredns) | 
 | 35 |         2. Start simple service | 
 | 36 |         3. Expose deployment | 
 | 37 |         4. Annotate service with domain name | 
 | 38 |         5. Try to get service using nslookup | 
 | 39 |         """ | 
 | 40 |  | 
 | 41 |         if not (config.k8s_deploy.kubernetes_externaldns_enabled and | 
 | 42 |                 config.k8s_deploy.kubernetes_coredns_enabled): | 
 | 43 |             pytest.skip("Test requires Externaldns and coredns addons enabled") | 
 | 44 |  | 
 | 45 |         show_step(1) | 
 | 46 |         k8sclient = k8s_deployed.api | 
 | 47 |         assert k8sclient.nodes.list() is not None, "Can not get nodes list" | 
 | 48 |  | 
 | 49 |         show_step(2) | 
 | 50 |         name = 'test-nginx' | 
 | 51 |         k8s_deployed.kubectl_run(name, 'nginx', '80') | 
 | 52 |  | 
 | 53 |         show_step(3) | 
 | 54 |         k8s_deployed.kubectl_expose('deployment', name, '80', 'ClusterIP') | 
 | 55 |  | 
| Victor Ryzhenkin | 66d3937 | 2017-09-28 19:25:48 +0400 | [diff] [blame] | 56 |         hostname = "test.{0}.local.".format(settings.LAB_CONFIG_NAME) | 
| Victor Ryzhenkin | 14354ac | 2017-09-27 17:42:30 +0400 | [diff] [blame] | 57 |         annotation = "\"external-dns.alpha.kubernetes.io/" \ | 
 | 58 |                      "hostname={0}\"".format(hostname) | 
 | 59 |         show_step(4) | 
 | 60 |         k8s_deployed.kubectl_annotate('service', name, annotation) | 
 | 61 |  | 
 | 62 |         show_step(5) | 
 | 63 |         dns_host = k8s_deployed.get_svc_ip('coredns') | 
 | 64 |         k8s_deployed.nslookup(hostname, dns_host) | 
| Victor Ryzhenkin | 87a3142 | 2018-03-16 22:25:27 +0400 | [diff] [blame] | 65 |  | 
 | 66 |     @pytest.mark.grab_versions | 
 | 67 |     @pytest.mark.cncf_publisher(name=['e2e.log', 'junit_01.xml', 'version.txt', | 
 | 68 |                                       'cncf_results.tar.gz']) | 
 | 69 |     @pytest.mark.fail_snapshot | 
 | 70 |     def test_k8s_cncf_certification(self, show_step, config, k8s_deployed, | 
 | 71 |                                     cncf_log_helper): | 
 | 72 |         """Run cncf e2e suite and provide files needed for pull request | 
 | 73 |         to the CNCF repo | 
 | 74 |  | 
 | 75 |         Scenario: | 
 | 76 |         1. Run cncf from https://github.com/cncf/k8s-conformance | 
 | 77 |         """ | 
 | 78 |  | 
 | 79 |         show_step(1) | 
 | 80 |         k8s_deployed.start_k8s_cncf_verification() | 
| Vladimir Jigulin | 62bcf46 | 2018-05-28 18:17:01 +0400 | [diff] [blame] | 81 |  | 
 | 82 |     @pytest.mark.grap_versions | 
 | 83 |     @pytest.mark.fail_snapshot | 
 | 84 |     def test_k8s_chain_update(self, show_step, underlay, config, k8s_deployed, | 
 | 85 |                               k8s_chain_update_log_helper): | 
 | 86 |         """Test for chain-upgrading k8s hypercube pool and checking it | 
 | 87 |  | 
 | 88 |         Scenario: | 
 | 89 |             1. Prepare salt on hosts | 
 | 90 |             2. Setup controller nodes | 
 | 91 |             3. Setup compute nodes | 
 | 92 |             4. Setup Kubernetes cluster | 
 | 93 |             5. Run and expose sample test service | 
 | 94 |             6. Run conformance to check consistency | 
 | 95 |             7. For every version in update chain: | 
 | 96 |                Update cluster to new version, check test sample service | 
 | 97 |                availability, run conformance | 
 | 98 |         """ | 
 | 99 |  | 
| Vladimir Jigulin | 62bcf46 | 2018-05-28 18:17:01 +0400 | [diff] [blame] | 100 |         show_step(5) | 
| Vladimir Jigulin | a6b018b | 2018-07-18 15:19:01 +0400 | [diff] [blame] | 101 |         sample = k8s_deployed.get_sample_deployment('test-dep-chain-upgrade') | 
 | 102 |         sample.run() | 
 | 103 |         sample.expose() | 
 | 104 |         sample.wait_for_ready() | 
| Vladimir Jigulin | 62bcf46 | 2018-05-28 18:17:01 +0400 | [diff] [blame] | 105 |  | 
| Vladimir Jigulin | a6b018b | 2018-07-18 15:19:01 +0400 | [diff] [blame] | 106 |         assert sample.is_service_available() | 
| Vladimir Jigulin | 62bcf46 | 2018-05-28 18:17:01 +0400 | [diff] [blame] | 107 |  | 
 | 108 |         show_step(6) | 
 | 109 |         k8s_deployed.run_conformance(log_out="k8s_conformance.log") | 
 | 110 |  | 
 | 111 |         show_step(7) | 
 | 112 |         chain_versions = config.k8s.k8s_update_chain.split(" ") | 
 | 113 |         for version in chain_versions: | 
 | 114 |             LOG.info("Chain update to '{}' version".format(version)) | 
 | 115 |             k8s_deployed.update_k8s_images(version) | 
 | 116 |  | 
 | 117 |             LOG.info("Checking test service availability") | 
| Vladimir Jigulin | a6b018b | 2018-07-18 15:19:01 +0400 | [diff] [blame] | 118 |             assert sample.is_service_available() | 
| Vladimir Jigulin | 62bcf46 | 2018-05-28 18:17:01 +0400 | [diff] [blame] | 119 |  | 
 | 120 |             LOG.info("Running conformance on {} version".format(version)) | 
 | 121 |             log_name = "k8s_conformance_{}.log".format(version) | 
 | 122 |             k8s_deployed.run_conformance(log_out=log_name, raise_on_err=False) | 
| Vladimir Jigulin | a6b018b | 2018-07-18 15:19:01 +0400 | [diff] [blame] | 123 |  | 
 | 124 |     @pytest.mark.grap_versions | 
 | 125 |     @pytest.mark.fail_snapshot | 
 | 126 |     def test_k8s_metallb(self, show_step, config, k8s_deployed): | 
 | 127 |         """Enable metallb in cluster and do basic tests | 
 | 128 |  | 
 | 129 |         Scenario: | 
 | 130 |             1. Setup Kubernetes cluster with enabled metallb | 
 | 131 |             2. Check that metallb pods created in metallb-system namespace | 
 | 132 |             3. Run 5 sample deployments | 
 | 133 |             4. Expose deployments with type=LoadBalancer | 
 | 134 |             5. Check services availability from outside of cluster | 
 | 135 |             6. Run conformance | 
 | 136 |             7. Check services availability from outside of cluster | 
 | 137 |         """ | 
 | 138 |         show_step(1) | 
 | 139 |         if not config.k8s_deploy.kubernetes_metallb_enabled: | 
 | 140 |             pytest.skip("Test requires metallb addon enabled") | 
 | 141 |  | 
 | 142 |         show_step(2) | 
 | 143 |         pods = k8s_deployed.api.pods.list(namespace="metallb-system") | 
 | 144 |  | 
 | 145 |         def is_pod_exists_with_prefix(prefix): | 
 | 146 |             for pod in pods: | 
 | 147 |                 if pod.name.startswith(prefix) and pod.phase == 'Running': | 
 | 148 |                     return True | 
 | 149 |             return False | 
 | 150 |  | 
 | 151 |         assert is_pod_exists_with_prefix("controller") | 
 | 152 |         assert is_pod_exists_with_prefix("speaker") | 
 | 153 |  | 
 | 154 |         show_step(3) | 
 | 155 |         samples = [] | 
 | 156 |         for i in range(5): | 
 | 157 |             name = 'test-dep-metallb-{}'.format(i) | 
 | 158 |             sample = k8s_deployed.get_sample_deployment(name) | 
 | 159 |             sample.run() | 
 | 160 |             samples.append(sample) | 
 | 161 |  | 
 | 162 |         show_step(4) | 
 | 163 |         for sample in samples: | 
 | 164 |             sample.expose('LoadBalancer') | 
 | 165 |         for sample in samples: | 
 | 166 |             sample.wait_for_ready() | 
 | 167 |  | 
 | 168 |         show_step(5) | 
 | 169 |         for sample in samples: | 
 | 170 |             assert sample.is_service_available(external=True) | 
 | 171 |  | 
 | 172 |         show_step(6) | 
 | 173 |         k8s_deployed.run_conformance() | 
 | 174 |  | 
 | 175 |         show_step(7) | 
 | 176 |         for sample in samples: | 
 | 177 |             assert sample.is_service_available(external=True) |