Example #1
0
    def setup_class(self):
        self.newapp = Newapplication()
        self.middleware = Middleware()
        self.scs = Scs()

        self.namespace = self.middleware.global_info["$K8S_NAMESPACE"]
        self.zookeeper_name = "e2e-zookeeper-pub"
        self.kafka_name = "e2e-kafka-pub"

        scs_list_result = self.scs.list_scs()
        assert len(scs_list_result.json()) > 0, "没有存储类,不能创建zookeeper,创建zookeeper用例失败"
        self.scs_name = scs_list_result.json()[0]["kubernetes"]["metadata"]["name"]
        logger.info("查出来的第一个scs {}".format(self.scs_name))

        # 创建zookeeper
        zookeeper_template_id = self.middleware.get_template_id("zookeeper")
        version_id = self.middleware.get_version_id(zookeeper_template_id)
        create_result = self.middleware.create_application('./test_data/middleware/zookeeper.json',
                                                           {"$name": self.zookeeper_name,
                                                            "$template_id": zookeeper_template_id,
                                                            "$version_id": version_id, "$scs_name": self.scs_name})
        assert create_result.status_code == 201, "测试kafka前提条件创建zookeeper应用失败 {}".format(create_result.text)
        logger.info("测试kafka前提条件创建zookeeper应用成功")

        app_status = self.middleware.get_application_status(self.namespace, self.zookeeper_name, "Running")
        assert app_status, "测试kafka前提条件创建zookeeper应用后,验证应用状态出错,app:{} is not Running".format(self.zookeeper_name)
        logger.info("测试kafka前提条件zookeeper应用为运行中")
Example #2
0
    def setup_class(self):
        self.newapp = Newapplication()
        self.middleware = Middleware()
        self.scs = Scs()

        self.namespace = self.middleware.global_info["$K8S_NAMESPACE"]
        self.zookeeper_name = "e2e-zookeeper-pub"
        self.kafka_name = "e2e-kafka-pub"

        scs_list_result = self.scs.list_scs()
        assert len(
            scs_list_result.json()) > 0, "没有存储类,不能创建zookeeper,创建zookeeper用例失败"
        self.scs_name = scs_list_result.json(
        )[0]["kubernetes"]["metadata"]["name"]
        logger.info("查出来的第一个scs {}".format(self.scs_name))
Example #3
0
    def setup_class(self):
        self.newapp = Newapplication()
        self.k8s_namespace = self.newapp.global_info["$K8S_NAMESPACE"]
        self.newapp_name = 'alauda-newapp'

        self.configmap = Configmap()
        self.configmap_name = 'alauda-cmforapp-{}'.format(self.newapp.region_name).replace('_', '-')
        self.appwithcm_name = 'alauda-appwithcm-{}'.format(self.newapp.region_name).replace('_', '-')

        self.scs = Scs()
        self.scs_name = 'alauda-scsforapp-{}'.format(self.newapp.region_name).replace('_', '-')
        self.pvc = Pvc()
        self.pvc_name = 'alauda-pvcforapp-{}'.format(self.newapp.region_name).replace('_', '-')
        self.appwithpvc_name = 'alauda-appwithpvc-{}'.format(self.newapp.region_name).replace('_', '-')

        self.teardown_class(self)
Example #4
0
    def setup_class(self):

        self.pvc = Pvc()
        self.pvc_name = 'alauda-pvc-{}'.format(self.pvc.region_name).replace(
            '_', '-')
        self.k8s_namespace = self.pvc.global_info["$K8S_NAMESPACE"]
        self.scs = Scs()
        self.scs_name = 'alauda-scsforpvc-{}'.format(
            self.pvc.region_name).replace('_', '-')
        self.pvcusescs_name = 'alauda-pvcusescs-{}'.format(
            self.pvc.region_name).replace('_', '-')
        self.masterips = self.scs.global_info["$MASTERIPS"].split(",")
        self.default_size = self.scs.get_default_size()

        self.defaultscs_name = 'alauda-defaultscsforpvc-{}'.format(
            self.pvc.region_name).replace('_', '-')
        self.pvcusedefaultscs_name = 'alauda-pvcusedefaultscs-{}'.format(
            self.pvc.region_name).replace('_', '-')

        self.teardown_class(self)
Example #5
0
 def setup_class(self):
     self.scs = Scs()
     self.scs_name = "e2e-scs{}".format(self.scs.region_name).replace(
         '_', '-')
     self.masterips = self.scs.global_info["$MASTERIPS"].split(",")
Example #6
0
class Teststorageclass():
    def setup_class(self):
        self.scs = Scs()
        self.scs_name = "e2e-scs{}".format(self.scs.region_name).replace(
            '_', '-')
        self.masterips = self.scs.global_info["$MASTERIPS"].split(",")

    def teardown_class(self):
        self.scs.delete_scs(self.scs_name)

    def test_scs(self):
        result = {"flag": True}
        # create scs
        create_result = self.scs.create_scs("./test_data/scs/scs.yml", {
            "$scs_name": self.scs_name,
            "$is_default": "false",
        })
        assert create_result.status_code == 201, "创建sc失败{}".format(
            create_result.text)
        self.scs.check_value_in_response(self.scs.get_common_scs_url(),
                                         self.scs_name,
                                         params={})
        # list scs
        list_result = self.scs.list_scs()
        result = self.scs.update_result(result, list_result.status_code == 200,
                                        list_result.text)
        result = self.scs.update_result(result, self.scs_name
                                        in list_result.text,
                                        "获取存储类列表:新建sc不在列表中")
        # update scs
        update_result = self.scs.update_scs(self.scs_name,
                                            "./test_data/scs/scs.yml", {
                                                "$scs_name": self.scs_name,
                                                "$is_default": "true",
                                            })
        assert update_result.status_code == 204, "sc设为默认失败{}".format(
            update_result.text)
        self.scs.get_status(
            self.scs.get_common_scs_url(self.scs_name),
            "kubernetes#metadata#annotations#storageclass.kubernetes.io/is-default-class",
            "true",
            delimiter="#",
            params={})
        # get scs detail
        detail_result = self.scs.get_scs_detail(self.scs_name)
        result = self.scs.update_result(result,
                                        detail_result.status_code == 200,
                                        detail_result.text)
        result = self.scs.update_result(
            result,
            self.scs.get_value(
                detail_result.json(),
                "kubernetes#metadata#annotations#storageclass.kubernetes.io/is-default-class",
                delimiter="#") == "true", "sc设为默认失败")
        # delete scs
        delete_result = self.scs.delete_scs(self.scs_name)
        assert delete_result.status_code == 204, "删除sc失败 {}".format(
            delete_result.text)
        assert result['flag'], result
Example #7
0
class TestZookeeperSuite(object):
    def setup_class(self):
        self.newapp = Newapplication()
        self.middleware = Middleware()
        self.scs = Scs()

        self.namespace = self.middleware.global_info["$K8S_NAMESPACE"]
        self.zookeeper_name = "e2e-zookeeper-pub"
        self.kafka_name = "e2e-kafka-pub"

        scs_list_result = self.scs.list_scs()
        assert len(
            scs_list_result.json()) > 0, "没有存储类,不能创建zookeeper,创建zookeeper用例失败"
        self.scs_name = scs_list_result.json(
        )[0]["kubernetes"]["metadata"]["name"]
        logger.info("查出来的第一个scs {}".format(self.scs_name))

    def teardown_class(self):
        logger.info("清除zookeeper应用资源")
        self.newapp.delete_newapp(self.namespace, self.kafka_name)
        self.newapp.check_exists(
            self.newapp.get_newapp_common_url(self.namespace, self.kafka_name),
            404)
        self.newapp.delete_newapp(self.namespace, self.zookeeper_name)
        self.newapp.check_exists(
            self.newapp.get_newapp_common_url(self.namespace,
                                              self.zookeeper_name), 404)
        logger.info("清除完毕")

    @pytest.mark.middleware_zookeeper
    def test_zookeeper(self):
        result = {"flag": True}
        zookeeper_template_id = self.middleware.get_template_id("zookeeper")
        version_id = self.middleware.get_version_id(zookeeper_template_id)
        create_result = self.middleware.create_application(
            './test_data/middleware/zookeeper.json', {
                "$name": self.zookeeper_name,
                "$template_id": zookeeper_template_id,
                "$version_id": version_id,
                "$scs_name": self.scs_name
            })
        assert create_result.status_code == 201, "中间件创建zookeeper应用失败 {}".format(
            create_result.text)
        logger.info("中间件创建zookeeper应用成功")

        app_status = self.middleware.get_application_status(
            self.namespace, self.zookeeper_name, "Running")
        assert app_status, "创建应用后,验证应用状态出错,app:{} is not Running".format(
            self.zookeeper_name)
        logger.info("中间件zookeeper应用为运行中")

        delete_result = self.newapp.delete_newapp(self.namespace,
                                                  self.zookeeper_name)
        assert delete_result.status_code == 204, "删除zookeeper应用失败 {}".format(
            delete_result.text)
        self.newapp.check_exists(
            self.newapp.get_newapp_common_url(self.namespace,
                                              self.zookeeper_name), 404)
        logger.info("删除zookeeper应用成功")

        assert result["flag"], True
Example #8
0
class TestPvcSuite(object):
    def setup_class(self):

        self.pvc = Pvc()
        self.pvc_name = 'alauda-pvc-{}'.format(self.pvc.region_name).replace(
            '_', '-')
        self.k8s_namespace = self.pvc.global_info["$K8S_NAMESPACE"]
        self.scs = Scs()
        self.scs_name = 'alauda-scsforpvc-{}'.format(
            self.pvc.region_name).replace('_', '-')
        self.pvcusescs_name = 'alauda-pvcusescs-{}'.format(
            self.pvc.region_name).replace('_', '-')
        self.masterips = self.scs.global_info["$MASTERIPS"].split(",")
        self.default_size = self.scs.get_default_size()

        self.defaultscs_name = 'alauda-defaultscsforpvc-{}'.format(
            self.pvc.region_name).replace('_', '-')
        self.pvcusedefaultscs_name = 'alauda-pvcusedefaultscs-{}'.format(
            self.pvc.region_name).replace('_', '-')

        self.teardown_class(self)

    def teardown_class(self):
        self.scs.delete_scs(self.defaultscs_name)
        self.pvc.delete_pvc(self.k8s_namespace, self.pvcusedefaultscs_name)
        self.scs.delete_scs(self.scs_name)
        self.pvc.delete_pvc(self.k8s_namespace, self.pvcusescs_name)

    @pytest.mark.scs
    def test_pvc_use_scs(self):
        result = {"flag": True}
        create_result = self.scs.create_scs("./test_data/scs/scs.yml", {
            "$scs_name": self.scs_name,
            "$is_default": "false",
        })
        assert create_result.status_code == 201, "创建sc失败{}".format(
            create_result.text)

        # create pvc
        createpvc_result = self.pvc.create_pvc(
            "./test_data/pvc/pvc.json", {
                "$pvc_name": self.pvcusescs_name,
                "$pvc_mode": "ReadWriteOnce",
                "$scs_name": self.scs_name,
                "$size": "1"
            })
        assert createpvc_result.status_code == 201, "创建pvc失败{}".format(
            createpvc_result.text)
        self.pvc.get_status(
            self.pvc.get_common_pvc_url(self.k8s_namespace,
                                        self.pvcusescs_name), "status.phase",
            "Bound")
        # list pvc
        list_result = self.pvc.list_pvc()
        result = self.pvc.update_result(result, list_result.status_code == 200,
                                        list_result.text)
        result = self.pvc.update_result(
            result, self.pvcusescs_name in list_result.text,
            "获取持久卷声明列表:新建pvc不在列表中")
        # get pvc detail
        detail_result = self.pvc.get_pvc_detail(self.k8s_namespace,
                                                self.pvcusescs_name)
        result = self.pvc.update_result(result,
                                        detail_result.status_code == 200,
                                        detail_result.text)
        result = self.pvc.update_result(
            result,
            self.pvc.get_value(detail_result.json(),
                               "status.phase") == "Bound",
            "pvc详情状态不是绑定{}".format(detail_result.text))
        volumeName = self.pvc.get_value(detail_result.json(),
                                        "kubernetes.spec.volumeName")
        result = self.pvc.update_result(
            result, volumeName.startswith("pvc"),
            "pvc详情关联持久卷不是以pvc开头的{}".format(detail_result.text))
        # update pvc
        update_result = self.pvc.update_pvc(
            self.k8s_namespace, self.pvcusescs_name,
            "./test_data/pvc/pvc-update.json", {
                "$pvc_name": self.pvcusescs_name,
                "$pvc_mode": "ReadWriteOnce",
                "$scs_name": self.scs_name,
                "$size": "1",
                "$vol_name": volumeName
            })
        result = self.pvc.update_result(result,
                                        update_result.status_code == 204,
                                        update_result.text)
        # get pvc detail
        detail_result = self.pvc.get_pvc_detail(self.k8s_namespace,
                                                self.pvcusescs_name)
        result = self.pvc.update_result(result,
                                        detail_result.status_code == 200,
                                        detail_result.text)
        result = self.pvc.update_result(
            result,
            self.pvc.get_value(detail_result.json(),
                               "kubernetes.metadata.labels") == {"e2e": "pvc"},
            "pvc详情的标签没有更新{}".format(detail_result.text))
        result = self.pvc.update_result(
            result,
            self.pvc.get_value(detail_result.json(),
                               "kubernetes.metadata.annotations") == {
                                   "e2e": "pvc"
                               }, "pvc详情的描述没有更新{}".format(detail_result.text))

        # delete pvc
        delete_result = self.pvc.delete_pvc(self.k8s_namespace,
                                            self.pvcusescs_name)
        assert delete_result.status_code == 204, "删除pvc失败 {}".format(
            delete_result.text)
        assert self.pvc.check_exists(
            self.pvc.get_common_pvc_url(self.k8s_namespace,
                                        self.pvcusescs_name), 404)
        self.scs.delete_scs(self.scs_name)
        assert result['flag'], result

    @pytest.mark.scs
    def test_pvc_use_defaultscs(self):
        if self.default_size > 1:
            assert False, "有两个以上的默认存储类,无法测试"
        elif self.default_size == 0:
            create_result = self.scs.create_scs("./test_data/scs/scs.yml", {
                "$scs_name": self.defaultscs_name,
                "$is_default": "true",
            })
            assert create_result.status_code == 201, "创建sc失败{}".format(
                create_result.text)
        result = {"flag": True}
        # create pvc
        createpvc_result = self.pvc.create_pvc(
            "./test_data/pvc/pvc_usedefault.json", {
                "$pvc_name": self.pvcusedefaultscs_name,
                "$pvc_mode": "ReadWriteOnce",
                "$size": "1"
            })
        assert createpvc_result.status_code == 201, "创建pvc失败{}".format(
            createpvc_result.text)
        self.pvc.get_status(
            self.pvc.get_common_pvc_url(self.k8s_namespace,
                                        self.pvcusedefaultscs_name),
            "status.phase", "Bound")
        # get pvc detail
        detail_result = self.pvc.get_pvc_detail(self.k8s_namespace,
                                                self.pvcusedefaultscs_name)
        result = self.pvc.update_result(result,
                                        detail_result.status_code == 200,
                                        detail_result.text)
        result = self.pvc.update_result(
            result,
            self.pvc.get_value(detail_result.json(),
                               "status.phase") == "Bound",
            "pvc详情状态不是绑定{}".format(detail_result.text))
        result = self.pvc.update_result(
            result,
            self.pvc.get_value(detail_result.json(),
                               "kubernetes.spec.volumeName").startswith("pvc"),
            "pvc详情关联持久卷不是以pvc开头的{}".format(detail_result.text))
        self.pvc.delete_pvc(self.k8s_namespace, self.pvcusedefaultscs_name)
        self.scs.delete_scs(self.defaultscs_name)
        assert result['flag'], result
Example #9
0
class TestNewApplicationSuite(object):
    def setup_class(self):
        self.newapp = Newapplication()
        self.k8s_namespace = self.newapp.global_info["$K8S_NAMESPACE"]
        self.newapp_name = 'alauda-newapp'

        self.configmap = Configmap()
        self.configmap_name = 'alauda-cmforapp-{}'.format(self.newapp.region_name).replace('_', '-')
        self.appwithcm_name = 'alauda-appwithcm-{}'.format(self.newapp.region_name).replace('_', '-')

        self.scs = Scs()
        self.scs_name = 'alauda-scsforapp-{}'.format(self.newapp.region_name).replace('_', '-')
        self.pvc = Pvc()
        self.pvc_name = 'alauda-pvcforapp-{}'.format(self.newapp.region_name).replace('_', '-')
        self.appwithpvc_name = 'alauda-appwithpvc-{}'.format(self.newapp.region_name).replace('_', '-')

        self.teardown_class(self)

    def teardown_class(self):
        self.newapp.delete_newapp(self.k8s_namespace, self.newapp_name)
        self.newapp.delete_newapp(self.k8s_namespace, self.appwithcm_name)
        self.newapp.delete_newapp(self.k8s_namespace, self.appwithpvc_name)
        self.configmap.delete_configmap(self.k8s_namespace, self.configmap_name)
        self.pvc.delete_pvc(self.k8s_namespace, self.pvc_name)
        self.scs.delete_scs(self.scs_name)

    @pytest.mark.BAT
    @pytest.mark.ace
    def test_newapp(self):
        # if not self.newapp.is_weblab_open("USER_VIEW_ENABLED"):
        #     return True, "用户视角未打开,不需要测试"
        """
        创建应用-获取拓扑图-获取容器组-获取yaml-获取日志-获取事件-获取k8s事件-exec-获取全部应用-获取命名空间下的应用-搜索应用-
        更新应用-获取应用yaml-缩容-扩容-删除应用下的资源-获取应用详情-添加资源到应用-停止应用-启动应用-删除组件-删除应用
        """
        # 创建应用
        result = {"flag": True}
        create_result = self.newapp.create_newapp('./test_data/newapp/appcore.json', {'$newapp_name': self.newapp_name})
        assert create_result.status_code == 201, "新版应用创建失败 {}".format(create_result.text)
        app_uuid = self.newapp.get_value(create_result.json(), '0.kubernetes.metadata.uid')

        # 获取应用状态
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "创建应用后,验证应用状态出错:app: {} is not running".format(self.newapp_name)

        # 获取拓扑图
        topology_result = self.newapp.get_topology_in_namespace(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, topology_result.status_code == 200, "获取拓扑图失败")
        result = self.newapp.update_result(result, len(topology_result.json().get('referenced_by')) == 2, "拓扑图关联错误")

        # 获取容器组
        pod_result = self.newapp.get_newapp_pods(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, pod_result.status_code == 200, "获取容器组失败")
        result = self.newapp.update_result(result, len(pod_result.json()) == 1,
                                           "容器组不是1 {}".format(len(pod_result.json())))
        container_name = self.newapp.get_value(pod_result.json(), '0.kubernetes.metadata.name')

        # 获取yaml
        yaml_result = self.newapp.get_newapp_yaml(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, yaml_result.status_code == 200, "创建应用后,yaml失败")
        result = self.newapp.update_result(result, 'Application' in yaml_result.text, "创建应用后,yaml失败:不存在Application")
        result = self.newapp.update_result(result, 'Deployment' in yaml_result.text, "创建应用后,yaml失败:不存在Deployment")
        result = self.newapp.update_result(result, 'HorizontalPodAutoscaler' in yaml_result.text,
                                           "创建应用后,yaml失败:HorizontalPodAutoscaler")
        result = self.newapp.update_result(result, 'Service' in yaml_result.text, "创建应用后,yaml失败:不存在Service")

        # 获取日志
        log_result = self.newapp.get_newapp_log(self.k8s_namespace, self.newapp_name, container_name)
        result = self.newapp.update_result(result, log_result.status_code == 200, "获取日志失败")
        result = self.newapp.update_result(result, len(log_result.json()['logs']) > 0, "获取日志为空")

        # 获取事件
        event_result = self.newapp.get_newapp_event(app_uuid)
        result = self.newapp.update_result(result, event_result.status_code == 200, "获取事件失败")
        result = self.newapp.update_result(result, event_result.json().get('total_items') != 0, "获取事件为空")

        # 获取k8s事件
        kevent_result = self.newapp.get_newapp_kevent(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, kevent_result.status_code == 200, "获取k8s事件失败")
        result = self.newapp.update_result(result, kevent_result.json().get('count') != 0, "获取k8s事件为空")

        # exec
        exec_result = self.newapp.exec_newapp(self.k8s_namespace, self.newapp_name, container_name)
        result = self.newapp.update_result(result, exec_result.status_code == 200, "exec失败")

        # 获取全部应用
        list_result = self.newapp.get_all_newapp()
        result = self.newapp.update_result(result, list_result.status_code == 200, "获取应用列表失败")
        result = self.newapp.update_result(result, self.newapp_name in list_result.text, "获取应用列表失败:新建应用不在列表中")

        # 获取命名空间下的应用
        namespace_result = self.newapp.get_newapp_in_namespace(self.k8s_namespace)
        result = self.newapp.update_result(result, namespace_result.status_code == 200, "获取命名空间下的应用列表失败")
        result = self.newapp.update_result(result, self.newapp_name in namespace_result.text,
                                           "获取命名空间下的应用列表失败:新建应用不在列表中")

        # 按名称搜索应用
        search_result = self.newapp.search_newapp(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, search_result.status_code == 200, "按名称搜索应用失败")
        result = self.newapp.update_result(result, self.newapp_name in search_result.text,
                                           "按名称搜索应用失败:新建应用不在列表中")

        # 更新应用,个数为2,添加ClusterRole
        update_result = self.newapp.update_newapp(self.k8s_namespace, self.newapp_name,
                                                  './test_data/newapp/update_appcore.json',
                                                  {'$newapp_name': self.newapp_name})
        assert update_result.status_code == 200, "更新应用失败 {}".format(update_result.text)
        self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Pending')
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "更新应用后,验证应用状态出错:app: {} is not running".format(self.newapp_name)

        # 获取应用yaml
        yaml_result = self.newapp.get_newapp_yaml(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, yaml_result.status_code == 200, "更新应用后,yaml失败")
        result = self.newapp.update_result(result, 'Application' in yaml_result.text, "更新应用后,yaml失败:不存在Application")
        result = self.newapp.update_result(result, 'Deployment' in yaml_result.text, "更新应用后,yaml失败:不存在Deployment")
        result = self.newapp.update_result(result, 'HorizontalPodAutoscaler' in yaml_result.text,
                                           "更新应用后,yaml失败:HorizontalPodAutoscaler")
        result = self.newapp.update_result(result, 'Service' in yaml_result.text, "更新应用后,yaml失败:不存在Service")
        result = self.newapp.update_result(result, 'ClusterRole' in yaml_result.text, "更新应用后,yaml失败:不存在ClusterRole")
        result = self.newapp.update_result(result, '15222222222' in yaml_result.text, "更新应用后,owners未更新")

        # 缩容
        scale_down_result = self.newapp.scale_down_newapp(self.k8s_namespace, self.newapp_name)
        assert scale_down_result.status_code == 204, "缩容失败 {}".format(scale_down_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "缩容后,验证应用状态出错:app: {} is not running".format(self.newapp_name)
        flag = self.newapp.get_status(self.newapp.get_newapp_status_url(self.k8s_namespace, self.newapp_name),
                                      'workloads.deployment-{}.desired'.format(self.newapp_name), 1)
        assert flag, "缩容后,预期个数不是1"

        # 扩容
        scale_up_result = self.newapp.scale_up_newapp(self.k8s_namespace, self.newapp_name)
        assert scale_up_result.status_code == 204, "扩容失败 {}".format(scale_up_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "扩容后,验证应用状态出错:app: {} is not running".format(self.newapp_name)
        flag = self.newapp.get_status(self.newapp.get_newapp_status_url(self.k8s_namespace, self.newapp_name),
                                      'workloads.deployment-{}.desired'.format(self.newapp_name), 2)
        assert flag, "扩容后,预期个数不是2"

        # 删除应用下的资源ClusterRole
        remove_result = self.newapp.remove_resource_newapp(self.k8s_namespace, self.newapp_name,
                                                           './test_data/newapp/resource.json',
                                                           {'$newapp_name': self.newapp_name})
        assert remove_result.status_code == 204, "删除应用下的资源失败 {}".format(remove_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "删除应用下的资源后,验证应用状态出错:app: {} is not running".format(self.newapp_name)

        # 获取应用详情
        detail_result = self.newapp.get_newapp_detail(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, detail_result.status_code == 200, "获取应用详情失败")
        result = self.newapp.update_result(result, 'Application' in detail_result.text, "删除应用下的资源详情失败:不存在Application")
        result = self.newapp.update_result(result, 'Deployment' in detail_result.text, "删除应用下的资源详情失败:不存在Deployment")
        result = self.newapp.update_result(result, 'HorizontalPodAutoscaler' in detail_result.text,
                                           "删除应用下的资源详情失败:不存在HorizontalPodAutoscaler")
        result = self.newapp.update_result(result, 'Service' in detail_result.text, "删除应用下的资源详情失败:存在Service")
        result = self.newapp.update_result(result, 'ClusterRole' not in detail_result.text,
                                           "删除应用下的资源详情失败:存在ClusterRole")

        # 添加资源ClusterRole到应用
        add_result = self.newapp.add_resource_newapp(self.k8s_namespace, self.newapp_name,
                                                     './test_data/newapp/resource.json',
                                                     {'$newapp_name': self.newapp_name})
        assert add_result.status_code == 204, "添加资源到应用失败 {}".format(remove_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "添加资源到应用后,验证应用状态出错:app: {} is not running".format(self.newapp_name)
        detail_result = self.newapp.get_newapp_detail(self.k8s_namespace, self.newapp_name)
        result = self.newapp.update_result(result, detail_result.status_code == 200, "获取应用详情失败")
        result = self.newapp.update_result(result, 'Application' in detail_result.text, "添加资源到应用详情失败:不存在Application")
        result = self.newapp.update_result(result, 'Deployment' in detail_result.text, "添加资源到应用详情失败:不存在Deployment")
        result = self.newapp.update_result(result, 'HorizontalPodAutoscaler' in detail_result.text,
                                           "删除应用下的资源详情失败:不存在HorizontalPodAutoscaler")
        result = self.newapp.update_result(result, 'Service' in detail_result.text, "添加资源到应用详情失败:不存在Service")
        result = self.newapp.update_result(result, 'ClusterRole' in detail_result.text,
                                           "添加资源到应用详情失败:不存在ClusterRole")

        # 停止应用
        stop_result = self.newapp.stop_newapp(self.k8s_namespace, self.newapp_name)
        assert stop_result.status_code == 204, "停止应用失败 {}".format(stop_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Stopped')
        assert app_status, "停止应用后,验证应用状态出错:app: {} is running".format(self.newapp_name)

        # 开始应用
        start_result = self.newapp.start_newapp(self.k8s_namespace, self.newapp_name)
        assert start_result.status_code == 204, "启动应用失败 {}".format(start_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Running')
        assert app_status, "启动应用后,验证应用状态出错:app: {} is not running".format(self.newapp_name)

        # 删除组件
        deploy_result = self.newapp.delete_deployment(self.k8s_namespace, self.newapp_name)
        assert deploy_result.status_code == 204, "删除组件失败 {}".format(deploy_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.newapp_name, 'Empty')
        assert app_status, "删除组件后,验证应用状态出错:app: {} is not Empty".format(self.newapp_name)

        # 删除应用
        delete_result = self.newapp.delete_newapp(self.k8s_namespace, self.newapp_name)
        assert delete_result.status_code == 204, "删除应用失败 {}".format(delete_result.text)
        delete_flag = self.newapp.check_exists(self.newapp.get_newapp_common_url(self.k8s_namespace, self.newapp_name),
                                               404)
        assert delete_flag, "删除应用失败"
        assert result['flag'], result

    @pytest.mark.cm
    @pytest.mark.BAT
    def test_app_with_cm(self):
        """
        应用使用configmap测试:创建configmap-创建应用-删除应用-删除configmap
        :return:
        """
        result = {"flag": True}
        # create configmap
        createconfigmap_result = self.configmap.create_configmap("./test_data/configmap/configmap.json",
                                                                 {"$cm_name": self.configmap_name,
                                                                  "$cm_key": self.configmap_name})
        assert createconfigmap_result.status_code == 201, "创建cm出错:{}".format(createconfigmap_result.text)

        # create app with cm
        create_result = self.newapp.create_newapp_by_yaml(self.k8s_namespace,
                                                          self.appwithcm_name, './test_data/newapp/daemonset_cm.yml',
                                                          {'$newapp_name': self.appwithcm_name,
                                                           "$cm_name": self.configmap_name,
                                                           "$cm_key": self.configmap_name})
        assert create_result.status_code == 201, "新版应用创建失败 {}".format(create_result.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.appwithcm_name, 'Running')
        assert app_status, "创建使用configmap的应用后,验证应用状态出错:app: {} is not running".format(self.appwithcm_name)
        daemonset_result = self.newapp.get_component(self.k8s_namespace, self.appwithcm_name, 'daemonsets')
        result = self.newapp.update_result(result, daemonset_result.status_code == 200, '获取daemonset详情失败')
        content = daemonset_result.json()
        v1 = self.newapp.get_value(content, 'kubernetes.spec.template.spec.volumes.0.configMap.name')
        result = self.newapp.update_result(result, v1 == self.configmap_name, '存储卷挂载configmap失败')
        v2 = self.newapp.get_value(content, 'kubernetes.spec.template.spec.volumes.1.configMap.name')
        result = self.newapp.update_result(result, v2 == self.configmap_name, '存储卷挂载configmap失败')
        e1 = self.newapp.get_value(content,
                                   'kubernetes.spec.template.spec.containers.0.envFrom.0.configMapRef.name')
        result = self.newapp.update_result(result, e1 == self.configmap_name, '环境变量完整引用configmap失败')
        e2 = ''
        env = self.newapp.get_value(content, 'kubernetes.spec.template.spec.containers.0.env')
        for e in env:
            if e.get('name') == 'cm':
                e2 = self.newapp.get_value(e, 'valueFrom.configMapKeyRef.name')
        result = self.newapp.update_result(result, e2 == self.configmap_name, '环境变量引用configmap的key失败')
        self.newapp.delete_newapp(self.k8s_namespace, self.appwithcm_name)
        self.newapp.check_exists(self.newapp.get_newapp_common_url(self.k8s_namespace, self.appwithcm_name), 404)
        self.configmap.delete_configmap(self.k8s_namespace, self.configmap_name)
        assert result['flag'], result

    @pytest.mark.pvc
    def test_app_with_pvc(self):
        """
        应用使用pvc测试:创建sc-创建pvc-创建应用-获取pvc拓扑图-删除应用-删除pvc-删除sc
        :return:
        """
        result = {"flag": True}
        create_result = self.scs.create_scs("./test_data/scs/scs.yml",
                                            {"$scs_name": self.scs_name, "$is_default": "false",
                                             })
        assert create_result.status_code == 201, "创建sc失败{}".format(create_result.text)

        # create pvc
        createpvc_result = self.pvc.create_pvc("./test_data/pvc/pvc.json",
                                               {"$pvc_name": self.pvc_name, "$pvc_mode": "ReadWriteOnce",
                                                "$scs_name": self.scs_name, "$size": "1"})
        assert createpvc_result.status_code == 201, "创建pvc失败{}".format(createpvc_result.text)
        self.pvc.get_status(self.pvc.get_common_pvc_url(self.pvc.global_info["$K8S_NAMESPACE"], self.pvc_name),
                            "status.phase", "Bound")
        # create app
        create_app = self.newapp.create_newapp_by_yaml(self.k8s_namespace,
                                                       self.appwithpvc_name,
                                                       './test_data/newapp/statefulset_pvc.yml',
                                                       {"$newapp_name": self.appwithpvc_name,
                                                        "$pvc_name": self.pvc_name})
        assert create_app.status_code == 201, "创建app出错:{}".format(create_app.text)
        app_status = self.newapp.get_newapp_status(self.k8s_namespace, self.appwithpvc_name, 'Running')
        assert app_status, "创建使用pvc的应用后,验证应用状态出错:app: {} is not running".format(self.appwithpvc_name)

        # get statefulset detail
        statefulset_result = self.newapp.get_component(self.k8s_namespace, self.appwithpvc_name, 'statefulsets')
        result = self.newapp.update_result(result, statefulset_result.status_code == 200, '获取statefulset详情失败')
        claimName = self.newapp.get_value(statefulset_result.json(),
                                          "kubernetes.spec.template.spec.volumes.0.persistentVolumeClaim.claimName")
        result = self.newapp.update_result(result, claimName == self.pvc_name, "详情中挂载pvc失败")

        # get pvc topology
        pvc_topology = self.newapp.get_topology_in_namespace(self.k8s_namespace, self.pvc_name, 'PersistentVolumeClaim')
        result = self.newapp.update_result(result, pvc_topology.status_code == 200,
                                           "获取pvc拓扑图失败 {}".format(pvc_topology.status_code))
        result = self.newapp.update_result(result, len(pvc_topology.json()['referenced_by']) == 1,
                                           "获取pvc拓扑图错误 {}".format(pvc_topology.text))
        # delete
        self.newapp.delete_newapp(self.k8s_namespace, self.appwithpvc_name)
        self.newapp.check_exists(self.newapp.get_newapp_common_url(self.k8s_namespace, self.appwithpvc_name), 404)
        self.pvc.get_status(
            self.newapp.get_topology_in_namespace_url(self.k8s_namespace, self.pvc_name, 'PersistentVolumeClaim'),
            "referenced_by", [])
        time.sleep(60)
        self.pvc.delete_pvc(self.k8s_namespace, self.pvc_name)
        self.scs.delete_scs(self.scs_name)

        assert result['flag'], result