| @@ -49,6 +49,26 @@ def check_res_code(res): | |||||
| print('Got status: %d, json: %s' % (res.status_code, res.json())) | print('Got status: %d, json: %s' % (res.status_code, res.json())) | ||||
| sys.exit(1) | sys.exit(1) | ||||
| def makebool(s): | |||||
| s = s.lower() | |||||
| if s in { 'on', 'true', '1' }: | |||||
| return True | |||||
| elif s in { 'off', 'false', '0' }: | |||||
| return False | |||||
| raise ValueError('invalid value for bool: %s' % repr(s)) | |||||
| _typeconv = dict(power=makebool) | |||||
| def make_attrs(*args): | |||||
| '''Convert list of attributes to a dictionary.''' | |||||
| r = {} | |||||
| for i in args: | |||||
| k, v = i.split('=', 1) | |||||
| r[k] = _typeconv[k](v) | |||||
| return r | |||||
| async def real_main(): | async def real_main(): | ||||
| baseurl = os.environ['BITELAB_URL'] | baseurl = os.environ['BITELAB_URL'] | ||||
| authkey = os.environ['BITELAB_AUTH'] | authkey = os.environ['BITELAB_AUTH'] | ||||
| @@ -74,6 +94,20 @@ async def real_main(): | |||||
| check_res_code(res) | check_res_code(res) | ||||
| brd = Board.parse_obj(res.json()) | |||||
| print('Name:\t%s' % brd.name) | |||||
| print('Class:\t%s' % brd.brdclass) | |||||
| print('Attributes:') | |||||
| for i in sorted(brd.attrs): | |||||
| print('\t%s\t%s' % (i, brd.attrs[i])) | |||||
| elif sys.argv[1] == 'set': | |||||
| board_id = sys.argv[-1] | |||||
| res = await client.post('board/%s/attrs' % | |||||
| urllib.parse.quote(board_id, safe=''), | |||||
| auth=BiteAuth(authkey), json=make_attrs(*sys.argv[2:-1])) | |||||
| check_res_code(res) | |||||
| brd = Board.parse_obj(res.json()) | brd = Board.parse_obj(res.json()) | ||||
| print('Name:\t%s' % brd.name) | print('Name:\t%s' % brd.name) | ||||
| print('Class:\t%s' % brd.brdclass) | print('Class:\t%s' % brd.brdclass) | ||||
| @@ -216,3 +250,42 @@ Attributes: | |||||
| ac.assert_called_with(base_url='http://someserver/') | ac.assert_called_with(base_url='http://someserver/') | ||||
| acp.assert_called_with('board/cora-z7s/release', auth=BiteAuth('thisisanapikey')) | acp.assert_called_with('board/cora-z7s/release', auth=BiteAuth('thisisanapikey')) | ||||
| @patch.dict(sys.__dict__, dict(argv=[ '', 'set', 'power=on', 'cora-z7s' ])) | |||||
| def test_set(self): | |||||
| ac = self.ac | |||||
| acp = self.acp | |||||
| acp.return_value.status_code = HTTP_200_OK | |||||
| acp.return_value.json.return_value = Board(name='cora-1', | |||||
| brdclass='cora-z7s', reserved=True, | |||||
| attrs={ | |||||
| 'ip': '172.20.20.5', | |||||
| 'power': True, | |||||
| }).dict() | |||||
| ret, stdout = self.runMain() | |||||
| output = '''Name:\tcora-1 | |||||
| Class:\tcora-z7s | |||||
| Attributes: | |||||
| \tip\t172.20.20.5 | |||||
| \tpower\tTrue | |||||
| ''' | |||||
| self.assertEqual(ret, 0) | |||||
| self.assertEqual(stdout, output) | |||||
| ac.assert_called_with(base_url='http://someserver/') | |||||
| acp.assert_called_with('board/cora-z7s/attrs', | |||||
| auth=BiteAuth('thisisanapikey'), json=dict(power=True)) | |||||
| def test_make_attrs(self): | |||||
| self.assertEqual(make_attrs('power=on'), dict(power=True)) | |||||
| self.assertEqual(make_attrs('power=True'), dict(power=True)) | |||||
| self.assertEqual(make_attrs('power=1'), dict(power=True)) | |||||
| self.assertEqual(make_attrs('power=off'), dict(power=False)) | |||||
| self.assertEqual(make_attrs('power=FALSE'), dict(power=False)) | |||||
| self.assertEqual(make_attrs('power=0'), dict(power=False)) | |||||
| self.assertRaises(ValueError, make_attrs, 'power=bar') | |||||