Esempio n. 1
0
    def test_submit_work(self):
        # add soldier
        soldier = SoldierInfo(id='sxxx0',
                              name='sol_http',
                              place="left",
                              weapons=[],
                              orders=[])
        self.app.post('/leader/subordinates',
                      data=dumps(soldier.to_dict()),
                      content_type='application/json')

        # submit a work
        work = Work(purpose="some app",
                    time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                    values="some values")
        response = self.app.post('/leader/subordinates/sxxx0/work',
                                 data=dumps(work.to_dict()),
                                 content_type='application/json')
        self.assertEqual(response.status_code, 200)
        actual = loads(response.data.decode("utf-8"))

        # assert
        expected = {
            "_status": {'success': True, 'msg': "status is ok"},
            "accepted": work.to_dict()
        }
        self.assertEqual(actual, expected)
Esempio n. 2
0
    def test_submit_work(self):
        # add soldier
        soldier = SoldierInfo(id='sxxx0',
                              name='sol_http',
                              place="left",
                              weapons=[],
                              orders=[])
        self.app.post('/leader/subordinates',
                      data=dumps(soldier.to_dict()),
                      content_type='application/json')

        # submit a work
        work = Work(purpose="some app",
                    time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                    values="some values")
        response = self.app.post('/leader/subordinates/sxxx0/work',
                                 data=dumps(work.to_dict()),
                                 content_type='application/json')
        self.assertEqual(response.status_code, 200)
        actual = loads(response.data.decode("utf-8"))

        # assert
        expected = {
            "_status": {
                'success': True,
                'msg': "status is ok"
            },
            "accepted": work.to_dict()
        }
        self.assertEqual(actual, expected)
Esempio n. 3
0
    def run(self):
        if 'timer' in self.order.trigger.keys():
            interval = self.order.trigger['timer']
            while not self.lock.wait(timeout=interval):
                raw = self.soldier.tag.get_values(self.order.values)
                for k, v in raw.items():
                    if v == (None, None):
                        os._exit(1)
                        # 通信失敗していたらプロセスをkill
                        # やり方が酷いし、leaderのacceptに工夫が居る
                values = [{
                    "type": type,
                    "value": v[0],
                    "unit": v[1]
                } for type, v in raw.items()]

                time = datetime.datetime.now(datetime.timezone.utc).isoformat()
                work = Work(time, self.order.purpose, values)

                url = "{0}subordinates/{1}/work".format(
                    self.soldier.superior_ep, self.soldier.id)
                res, err = rest.post(url, json=work.to_dict())
                if err is not None:
                    self.soldier.shutdown()
                    logger.fatal('in WorkingThread, failed to post work: {0}',
                                 err)
                    return
        else:
            pass
Esempio n. 4
0
    def run(self):
        if 'timer' in self.order.trigger.keys():
            interval = self.order.trigger['timer']
            while not self.lock.wait(timeout=interval):
                raw = self.soldier.tag.get_values(self.order.values)
                for k, v in raw.items():
                    if v == (None, None):
                        os._exit(1)
                        # 通信失敗していたらプロセスをkill
                        # やり方が酷いし、leaderのacceptに工夫が居る
                values = [{"type": type, "value": v[0], "unit": v[1]}
                          for type, v in raw.items()]

                time = datetime.datetime.now(datetime.timezone.utc).isoformat()
                work = Work(time, self.order.purpose, values)

                url = "{0}subordinates/{1}/work".format(
                    self.soldier.superior_ep, self.soldier.id)
                res, err = rest.post(url, json=work.to_dict())
                if err is not None:
                    self.soldier.shutdown()
                    logger.fatal('in WorkingThread, failed to post work: {0}', err)
                    return
        else:
            pass
Esempio n. 5
0
    def test_missoin_do(self):
        def post_report(url, data=None, json=None, etag=None, **kwargs):
            res = requests.Response()
            res.status_code = 200
            res_dict = {
                "_status": {"msg": "ok", "success": True},
                "accepted": json
            }
            res._content = dumps(res_dict).encode()
            return res, None

        self.leader_obj.superior_ep = "test://cxxx0/commander/"
        soldier = SoldierInfo(id="sxxx0", name="sol-test", place="left",
                              weapons=[], orders=[])
        self.leader_obj.accept_subordinate(soldier)

        mission = Mission(author="sxxx0",
                          requirement=Requirement(
                              values=["zero", "random"],
                              trigger={"timer": 0.4}
                          ),
                          trigger={"timer": 0.7},
                          place="All",
                          purpose="some purpose hash")

        work_1 = Work(time=datetime.utcnow().isoformat(),
                      purpose=mission.get_id(),
                      values=[0, 0.584249])
        work_2 = Work(time=datetime.utcnow().isoformat(),
                      purpose=mission.get_id(),
                      values=[0, 0.238491])
        work_3 = Work(time=datetime.utcnow().isoformat(),
                      purpose="0" + mission.get_id()[:-1],  # 上2つとずらす
                      values=[0, 0.045066])
        self.leader_obj.accept_work("sxxx0", work_1)
        self.leader_obj.accept_work("sxxx0", work_2)
        self.leader_obj.accept_work("sxxx0", work_3)

        with patch("utils.rest.post", side_effect=post_report) as m:
            self.leader_obj.accept_mission(mission)
            time.sleep(1)
            self.assertEqual(m.call_count, 1)
            self.assertEqual(m.call_args[0][0],
                             "test://cxxx0/commander/subordinates/lxxx0/report")

            # reportのチェック
            actual = m.call_args[1]["json"]
            self.assertEqual(set(actual.keys()),
                             {"time", "place", "purpose", "values"})
            self.assertEqual(actual["purpose"], "some purpose hash")
            self.assertEqual(len(actual["values"]), 2)

            # report.valuesのチェック
            work_in_1 = work_1.to_dict()
            del work_in_1["purpose"]
            work_in_1["place"] = "left"
            work_in_2 = work_2.to_dict()
            del work_in_2["purpose"]
            work_in_2["place"] = "left"
            self.assertIn(work_in_1, actual["values"])
            self.assertIn(work_in_2, actual["values"])

        self.leader_obj.superior_ep = ""  # shutdownでDELETEを送信するのを阻止
Esempio n. 6
0
    def test_missoin_do(self):
        def post_report(url, data=None, json=None, etag=None, **kwargs):
            res = requests.Response()
            res.status_code = 200
            res_dict = {
                "_status": {
                    "msg": "ok",
                    "success": True
                },
                "accepted": json
            }
            res._content = dumps(res_dict).encode()
            return res, None

        self.leader_obj.superior_ep = "test://cxxx0/commander/"
        soldier = SoldierInfo(id="sxxx0",
                              name="sol-test",
                              place="left",
                              weapons=[],
                              orders=[])
        self.leader_obj.accept_subordinate(soldier)

        mission = Mission(author="sxxx0",
                          requirement=Requirement(values=["zero", "random"],
                                                  trigger={"timer": 0.4}),
                          trigger={"timer": 0.7},
                          place="All",
                          purpose="some purpose hash")

        work_1 = Work(time=datetime.utcnow().isoformat(),
                      purpose=mission.get_id(),
                      values=[0, 0.584249])
        work_2 = Work(time=datetime.utcnow().isoformat(),
                      purpose=mission.get_id(),
                      values=[0, 0.238491])
        work_3 = Work(
            time=datetime.utcnow().isoformat(),
            purpose="0" + mission.get_id()[:-1],  # 上2つとずらす
            values=[0, 0.045066])
        self.leader_obj.accept_work("sxxx0", work_1)
        self.leader_obj.accept_work("sxxx0", work_2)
        self.leader_obj.accept_work("sxxx0", work_3)

        with patch("utils.rest.post", side_effect=post_report) as m:
            self.leader_obj.accept_mission(mission)
            time.sleep(1)
            self.assertEqual(m.call_count, 1)
            self.assertEqual(
                m.call_args[0][0],
                "test://cxxx0/commander/subordinates/lxxx0/report")

            # reportのチェック
            actual = m.call_args[1]["json"]
            self.assertEqual(set(actual.keys()),
                             {"time", "place", "purpose", "values"})
            self.assertEqual(actual["purpose"], "some purpose hash")
            self.assertEqual(len(actual["values"]), 2)

            # report.valuesのチェック
            work_in_1 = work_1.to_dict()
            del work_in_1["purpose"]
            work_in_1["place"] = "left"
            work_in_2 = work_2.to_dict()
            del work_in_2["purpose"]
            work_in_2["place"] = "left"
            self.assertIn(work_in_1, actual["values"])
            self.assertIn(work_in_2, actual["values"])

        self.leader_obj.superior_ep = ""  # shutdownでDELETEを送信するのを阻止