#! /usr/bin/env python import unittest from httplib import OK, BAD_REQUEST import requests import json from subprocess import Popen import time class TestOnosDistributedManager(unittest.TestCase): base_url = 'http://localhost:5000/' cluster_json_url = base_url + 'cluster.json' def setUp(self): command = ["onos-distributed-manager"] self.server_process = Popen(command) time.sleep(1) def tearDown(self): requests.put(self.base_url + 'exit') def test_operations(self): node1_json = '{"id":"node1","ip":"10.128.11.161","port":9876}' node2_json = '{"id":"node2","ip":"10.128.11.162","port":9876}' node3_json = '{"id":"node3","ip":"10.128.11.163","port":9876}' node4_json = '{"id":"node4","ip":"10.128.11.164","port":9876}' node5_json = '{"id":"node5","ip":"10.128.11.165","port":9876}' new_node5_json = '{"id":"node5","ip":"10.128.11.265","port":1234}' node1_dict = json.loads(node1_json) new_node5_dict = json.loads(new_node5_json) post_headers = { 'Content-Type': 'application/json' } def check_list_lengths(expected_length): json_request = requests.get(self.cluster_json_url) self.assertEqual(json_request.status_code, OK) json_object = json_request.json() self.assertEqual(len(json_object["nodes"]), expected_length) self.assertEqual(len(json_object["partitions"]), expected_length) def post_node(node_json): request = requests.post(self.base_url, data=node_json, headers=post_headers) self.assertEqual(request.status_code, OK) # Test initial configuration - node list should be empty check_list_lengths(0) # Test post operation to add a node post_node(node1_json) json_request = requests.get(self.cluster_json_url) self.assertEqual(json_request.status_code, OK) json_object = json_request.json() self.assertEqual(len(json_object["nodes"]), 1) self.assertEqual(len(json_object["partitions"]), 1) self.assertIn(node1_dict, json_object["nodes"]) self.assertIn(node1_dict["id"], json_object["partitions"][0]["members"]) # Re-posting the same node should cause an error json_request = requests.post(self.base_url, data=node1_json, headers=post_headers) self.assertEqual(json_request.status_code, BAD_REQUEST) check_list_lengths(1) # Add 4 more nodes and check the partitions generated post_node(node2_json) post_node(node3_json) post_node(node4_json) post_node(node5_json) check_list_lengths(5) json_request = requests.get(self.cluster_json_url) self.assertEqual(json_request.status_code, OK) json_object = json_request.json() self.assertEqual(["node4", "node5", "node1"], json_object["partitions"][3]["members"]) # modify a node json_request = requests.put(self.base_url, data=new_node5_json, headers=post_headers) self.assertEqual(json_request.status_code, OK) json_request = requests.get(self.cluster_json_url) self.assertEqual(json_request.status_code, OK) json_object = json_request.json() self.assertIn(new_node5_dict, json_object["nodes"]) # delete all the nodes def delete_node(json_string): request = requests.delete(self.base_url, data=json_string, headers=post_headers) self.assertEqual(request.status_code, OK) delete_node(new_node5_json) delete_node(node4_json) delete_node(node3_json) delete_node(node2_json) delete_node(node1_json) # make sure that no nodes remain check_list_lengths(0) if __name__ == '__main__': unittest.main()