Exemplo n.º 1
0
    def test_cluster_action(self):
        from sqlalchemy import func
        #Prepare testing data: create machines, clusters in database
        #The first three machines will belong to cluster_01, the last one
        #belongs to cluster_10
        with database.session() as session:
            machines = [Machine(mac='00:27:88:0c:01'),
                        Machine(mac='00:27:88:0c:02'),
                        Machine(mac='00:27:88:0c:03'),
                        Machine(mac='00:27:88:0c:04'),
                        Machine(mac='00:27:88:0c:05'),
                        Machine(mac='00:27:88:0c:06'),
                        Machine(mac='00:27:88:0c:07'),
                        Machine(mac='00:27:88:0c:08')]
            clusters = [Cluster(name='cluster_10')]
            session.add_all(machines)
            session.add_all(clusters)
            # add a host to machine '00:27:88:0c:04' to cluster_02
            host = ClusterHost(cluster_id=10, machine_id=4,
                               hostname='host_c2_01')
            session.add(host)

        # Do an action to a non-existing cluster
        url = '/clusters/1000/action'
        request = {'addHosts': [10, 20, 30]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 404)

        # Test 'addHosts' action on cluster_01
        # 1. add a host with  non-existing machine
        url = '/clusters/1/action'
        request = {'addHosts': [1, 1000, 1001]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 404)
        # ClusterHost table should not have any records.
        with database.session() as session:
            hosts_num = session.query(func.count(ClusterHost.id))\
                               .filter_by(cluster_id=1).scalar()
            self.assertEqual(hosts_num, 0)

        # 2. add a host with a installed machine
        request = {'addHosts': [1, 4]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 409)
        data = json.loads(rv.get_data())
        self.assertEqual(len(data['failedMachines']), 1)

        # 3. add hosts to cluster_01
        request = {'addHosts': [1, 2, 3]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 200)
        total_hosts = 0
        with database.session() as session:
            total_hosts = session.query(func.count(ClusterHost.id))\
                                 .filter_by(cluster_id=1).scalar()
            data = json.loads(rv.get_data())
            self.assertEqual(len(data['cluster_hosts']), total_hosts)
            self.assertEqual(total_hosts, 3)

        # 4. try to remove some hosts not existing and in different cluster
        request = {'removeHosts': [1, 2, 3, 1000, 1001]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 404)
        data = json.loads(rv.get_data())
        self.assertEqual(len(data['failedHosts']), 3)
        with database.session() as session:
            count = session.query(func.count(ClusterHost.id))\
                           .filter_by(cluster_id=1).scalar()
            self.assertEqual(count, 3)

        # 5. sucessfully remove requested hosts
        request = {'removeHosts': [2, 3]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 200)
        data = json.loads(rv.get_data())
        self.assertEqual(len(data['cluster_hosts']), 2)
        with database.session() as session:
            count = session.query(func.count(ClusterHost.id))\
                           .filter_by(cluster_id=1).scalar()
            self.assertEqual(count, 1)

        # 6. Test 'replaceAllHosts' action on cluster_01
        request = {'replaceAllHosts': [5, 6, 7]}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 200)
        data = json.loads(rv.get_data())
        self.assertEqual(len(data['cluster_hosts']), 3)
        with database.session() as session:
            count = session.query(func.count(ClusterHost.id))\
                           .filter_by(cluster_id=1).scalar()
            self.assertEqual(count, 3)

        # 7. Test 'deploy' action on cluster_01
        request = {'deploy': []}
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 202)

        # 8. Test deploy cluster_01 the second time
        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 400)

        # 9. Try to deploy cluster_02 which no host in
        url = '/clusters/2/action'
        with database.session() as session:
            session.query(ClusterHost).filter_by(cluster_id=2)\
                                      .delete(synchronize_session=False)
            host = session.query(ClusterHost).filter_by(cluster_id=2).first()

        rv = self.app.post(url, data=json.dumps(request))
        self.assertEqual(rv.status_code, 404)

        # 10. Try to add a new host to cluster_01 and deploy it
        with database.session() as session:
            cluster = session.query(Cluster).filter_by(id=1).first()
            cluster.mutable = True

            hosts = session.query(ClusterHost).filter_by(cluster_id=1).all()
            for host in hosts:
                host.mutable = True
        url = '/clusters/1/action'
        # add another machine as a new host into cluster_01
        request = json.dumps({"addHosts": [8]})
        rv = self.app.post(url, data=request)
        host_id = json.loads(rv.get_data())["cluster_hosts"][0]["id"]

        deploy_request = json.dumps({"deploy": [host_id]})
        rv = self.app.post(url, data=deploy_request)
        self.assertEqual(202, rv.status_code)
        expected_deploy_result = {
            "cluster": {
                "cluster_id": 1,
                "url": "/clusters/1/progress"
            },
            "hosts": [
                {"host_id": 5,
                 "url": "/cluster_hosts/5/progress"}
            ]
        }
        data = json.loads(rv.get_data())["deployment"]
        self.assertDictEqual(expected_deploy_result, data)