Beispiel #1
0
class TestDatabase(unittest.TestCase):
    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch(
        'jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login'
    )
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        self.conn = HealthBotClient(server='1.1.1.1',
                                    user='******',
                                    password='******').open()

    def tearDown(self) -> None:
        self.conn.close()

    def test_get_table(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.tsdb.get_table()
        self.assertEqual(obj.name, 'test')

    def _mock_manager(self, *args):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args[0] == 'https://1.1.1.1:8080/api/v1/data/database/table':
            return MockResponse({"name": "test", "type": "Field table"}, 200)
class TestRules(unittest.TestCase):
    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch(
        'jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login'
    )
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        with patch('jnpr.healthbot.healthbot.HealthBotClient.version',
                   new_callable=PropertyMock) as mock_ver:
            with patch('jnpr.healthbot.healthbot.HealthBotClient.config_url',
                       new_callable=PropertyMock) as mock_cnf:
                mock_ver.return_value = '2.1.0'
                mock_cnf.return_value = "https://1.1.1.1:8080/api/v1"
                self.conn = HealthBotClient(server='1.1.1.1',
                                            user='******',
                                            password='******').open()

    def tearDown(self) -> None:
        self.conn.close()

    def test_add_rule(self):
        self.mock_request().get.side_effect = self._mock_manager
        rs = RuleSchema(rule_name="hbez-fpc-heap-utilization")
        rs.description = "HealthBot EZ example"
        rs.synopsis = "Using python client for demo"
        rs.sensor = [{
            'description': 'Monitors FPC buffer, heap and cpu utilization',
            'iAgent': {
                'file': 'fpc-utilization.yml',
                'frequency': '30s',
                'table': 'FPCCPUHEAPutilizationTable'
            },
            'sensor_name': 'fpccpuheaputilization'
        }]
        rs.field = [{
            'constant': {
                'value': '{{fpc-buffer-usage-threshold}}'
            },
            'description': 'This field is for buffer usage threshold',
            'field_name': 'linecard-buffer-usage-threshold'
        }, {
            'constant': {
                'value': '{{fpc-cpu-usage-threshold}}'
            },
            'description': 'This field is for linecard cpu usage threshold',
            'field_name': 'linecard-cpu-usage-threshold'
        }, {
            'constant': {
                'value': '{{fpc-heap-usage-threshold}}'
            },
            'description': 'This field is for linecard heap usage threshold',
            'field_name': 'linecard-heap-usage-threshold'
        }]
        rs.keys = ['slot']
        rs.variable = [{
            'description': 'Linecard Buffer Memory usage threshold value',
            'name': 'fpc-buffer-usage-threshold',
            'type': 'int',
            'value': '80'
        }, {
            'description': 'Linecard CPU usage threshold value',
            'name': 'fpc-cpu-usage-threshold',
            'type': 'int',
            'value': '80'
        }, {
            'description': 'Linecard Heap Memory usage threshold value',
            'name': 'fpc-heap-usage-threshold',
            'type': 'int',
            'value': '80'
        }]
        rs.trigger = [{
            'description':
            'Sets health based on linecard buffer memory',
            'frequency':
            '60s',
            'synopsis':
            'Linecard buffer memory kpi',
            'term': [{
                'term_name':
                'is-buffer-memory-utilization-greater-than-threshold',
                'then': {
                    'status': {
                        'color':
                        'red',
                        'message':
                        'FPC buffer memory '
                        'utilization '
                        '($memory-buffer-utilization) '
                        'is over threshold '
                        '($linecard-buffer-usage-threshold)'
                    }
                },
                'when': {
                    'greater_than': [{
                        'left_operand':
                        '$memory-buffer-utilization',
                        'right_operand':
                        '$linecard-buffer-usage-threshold'
                    }]
                }
            }, {
                'term_name': 'buffer-utilization-less-than-threshold',
                'then': {
                    'status': {
                        'color': 'green'
                    }
                }
            }],
            'trigger_name':
            'fpc-buffer-memory-utilization'
        }, {
            'description':
            'Sets health based on linecard cpu utilization',
            'frequency':
            '60s',
            'synopsis':
            'Linecard cpu utilization kpi',
            'term': [{
                'term_name': 'is-cpu-utilization-greater-than-80',
                'then': {
                    'status': {
                        'color':
                        'red',
                        'message':
                        'FPC CPU utilization '
                        '($cpu-total) is over '
                        'threshold '
                        '($linecard-cpu-usage-threshold)'
                    }
                },
                'when': {
                    'greater_than': [{
                        'left_operand': '$cpu-total',
                        'right_operand': '$linecard-cpu-usage-threshold',
                        'time_range': '180s'
                    }]
                }
            }, {
                'term_name': 'cpu-utilization-less-than-threshold',
                'then': {
                    'status': {
                        'color': 'green'
                    }
                }
            }],
            'trigger_name':
            'fpc-cpu-utilization'
        }, {
            'description':
            'Sets health based on linecard heap memory '
            'utilization',
            'frequency':
            '60s',
            'synopsis':
            'Linecard heap memory kpi',
            'term': [{
                'term_name':
                'is-heap-memory-utilization-greater-than-threshold',
                'then': {
                    'status': {
                        'color':
                        'red',
                        'message':
                        'FPC heap memory '
                        'utilization '
                        '($memory-heap-utilization) '
                        'is over threshold '
                        '($linecard-heap-usage-threshold)'
                    }
                },
                'when': {
                    'greater_than': [{
                        'left_operand':
                        '$memory-heap-utilization',
                        'right_operand':
                        '$linecard-heap-usage-threshold'
                    }]
                }
            }, {
                'term_name': 'heap-memory-utilization-less-than-threshold',
                'then': {
                    'status': {
                        'color': 'green'
                    }
                }
            }],
            'trigger_name':
            'fpc-heap-memory-utilization'
        }]

        self.assertTrue(self.conn.rule.add('external', schema=rs))

    def test_add_rule_without_schema(self):
        self.assertTrue(
            self.conn.rule.add(rule_name="hbez-fpc-heap-utilization",
                               topic_name='test'))

    def test_schema_check(self):
        self.assertTrue(
            self.conn.rule.add(rule_name="hbez-fpc-heap-utilization",
                               topic_name='test'))

    def test_get_rule(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.rule.get(topic_name='external',
                                 rule_name="hbez-fpc-heap-utilization")
        self.assertEqual(ret.description, 'HealthBot EZ example')

    def test_get_rules(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.rule.get(topic_name='external')
        self.assertEqual(ret[0].rule_name, 'interface-info')

    def test_delete_rule(self):
        ret = self.conn.rule.delete(topic_name='external',
                                    rule_name="hbez-fpc-heap-utilization")
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0], 'delete')

    def test_update_rule(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.rule.get(topic_name='external',
                                 rule_name="hbez-fpc-heap-utilization")
        ret.keys = ['slot']
        self.conn.rule.update(topic_name='external', schema=ret)
        self.assertEqual(self.mock_request().mock_calls[3][2]['json']['keys'],
                         ['slot'])

    def test_get_topic(self):
        self.mock_request().get.side_effect = self._mock_manager
        topic = self.conn.topic.get(topic_name='external')
        self.assertEqual(topic.topic_name, 'external')

    def test_get_topics(self):
        self.mock_request().get.side_effect = self._mock_manager
        topics = self.conn.topic.get()
        self.assertEqual(topics[0].description,
                         'Monitors the chassis temperatures of whole chassis')

    def _mock_manager(self, *args):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args[0] == 'https://1.1.1.1:8080/api/v1/topic/external/?working=true':
            obj = MockResponse(
                {
                    "rule": [{
                        "field":
                        [{
                            "description":
                            "admin status",
                            "field-name":
                            "admin",
                            "sensor": [{
                                "path": "admin",
                                "sensor-name": "phyport"
                            }],
                            "type":
                            "string"
                        }, {
                            "field-name": "name",
                            "sensor": [{
                                "path": "name",
                                "sensor-name": "phyport"
                            }],
                            "type": "string"
                        }, {
                            "description": "oper status",
                            "field-name": "oper",
                            "sensor": [{
                                "path": "oper",
                                "sensor-name": "phyport"
                            }],
                            "type": "string"
                        }],
                        "keys": ["name"],
                        "rule-name":
                        "interface-info",
                        "variable": [{
                            "name": "interface_name",
                            "type": "sensor-argument"
                        }]
                    }],
                    "sub-topics": [],
                    "topic-name":
                    "external"
                }, 200)
            return obj
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/topic/external/rule/hbez-fpc-heap-utilization/?working=true':
            obj = MockResponse(
                {
                    "description":
                    "HealthBot EZ example",
                    "field": [
                        {
                            "constant": {
                                "value": "{{fpc-buffer-usage-threshold}}"
                            },
                            "description":
                            "This field is for buffer usage threshold",
                            "field-name": "linecard-buffer-usage-threshold"
                        },
                        {
                            "constant": {
                                "value": "{{fpc-cpu-usage-threshold}}"
                            },
                            "description":
                            "This field is for linecard cpu usage threshold",
                            "field-name": "linecard-cpu-usage-threshold"
                        },
                    ],
                    "keys": ["slot"],
                    "rule-name":
                    "hbez-fpc-heap-utilization",
                    "sensor": [{
                        "description":
                        "Monitors FPC buffer, heap and cpu utilization",
                        "iAgent": {
                            "file": "fpc-utilization.yml",
                            "frequency": "30s",
                            "table": "FPCCPUHEAPutilizationTable"
                        },
                        "sensor-name": "fpccpuheaputilization"
                    }],
                    "synopsis":
                    "Using python client for demo",
                    "trigger": [
                        {
                            "description":
                            "Sets health based on linecard buffer memory",
                            "frequency": "60s",
                            "synopsis": "Linecard buffer memory kpi",
                            "trigger-name": "fpc-buffer-memory-utilization"
                        },
                        {
                            "description":
                            "Sets health based on linecard cpu utilization",
                            "frequency": "60s",
                            "synopsis": "Linecard cpu utilization kpi",
                            "trigger-name": "fpc-cpu-utilization"
                        },
                    ],
                    "variable": [{
                        "description":
                        "Linecard Buffer Memory usage threshold value",
                        "name": "fpc-buffer-usage-threshold",
                        "type": "int",
                        "value": "80"
                    }]
                }, 200)
            return obj
        elif args[0] == 'https://1.1.1.1:8080/api/v1/topics':
            return MockResponse(
                {
                    "topic": [{
                        "description":
                        "Monitors the chassis temperatures of whole chassis",
                        "topic-name":
                        "external",
                        "rule": [{
                            "description":
                            "HealthBot EZ example",
                            "field": [
                                {
                                    "constant": {
                                        "value":
                                        "{{fpc-buffer-usage-threshold}}"
                                    },
                                    "description":
                                    "This field is for buffer usage threshold",
                                    "field-name":
                                    "linecard-buffer-usage-threshold"
                                },
                                {
                                    "constant": {
                                        "value": "{{fpc-cpu-usage-threshold}}"
                                    },
                                    "description":
                                    "This field is for linecard cpu usage threshold",
                                    "field-name":
                                    "linecard-cpu-usage-threshold"
                                },
                            ],
                            "keys": ["slot"],
                            "rule-name":
                            "hbez-fpc-heap-utilization",
                            "sensor": [{
                                "description":
                                "Monitors FPC buffer, heap and cpu utilization",
                                "iAgent": {
                                    "file": "fpc-utilization.yml",
                                    "frequency": "30s",
                                    "table": "FPCCPUHEAPutilizationTable"
                                },
                                "sensor-name": "fpccpuheaputilization"
                            }],
                            "synopsis":
                            "Using python client for demo",
                            "trigger": [
                                {
                                    "description":
                                    "Sets health based on linecard buffer memory",
                                    "frequency": "60s",
                                    "synopsis": "Linecard buffer memory kpi",
                                    "trigger-name":
                                    "fpc-buffer-memory-utilization"
                                },
                                {
                                    "description":
                                    "Sets health based on linecard cpu utilization",
                                    "frequency": "60s",
                                    "synopsis": "Linecard cpu utilization kpi",
                                    "trigger-name": "fpc-cpu-utilization"
                                },
                            ],
                            "variable": [{
                                "description":
                                "Linecard Buffer Memory usage threshold value",
                                "name": "fpc-buffer-usage-threshold",
                                "type": "int",
                                "value": "80"
                            }]
                        }]
                    }]
                }, 200)
        return MockResponse(None, 404)
Beispiel #3
0
class TestAdministration(unittest.TestCase):

    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch('jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login')
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        self.mock_request().get.side_effect = self._mock_manager
        self.conn = HealthBotClient(
            server='1.1.1.1',
            user='******',
            password='******').open()
        self.conn.api_client.call_api = self._mock_manager

    def tearDown(self) -> None:
        self.conn.close()

    def test_administration_group_get(self):
        ret = self.conn.administration.group.get(group_name="hboperator")
        self.assertEqual(ret.group_name, 'hboperator')

    def test_administration_group_update(self):
        userid = self.conn.administration.user.get_userid_from_user_name(
            user_name="xxx")
        schema = Groups(
            group_name='hboperator',
            group_description="testing HbEZ",
            roles=[
                GroupgroupidRoles(
                    role_id='xxx-xx-xxx',
                    role_name='token:write')],
            users=[
                AssociatedUserSchemaInner(
                    user_id=userid,
                    user_name="xxx")])
        self.assertTrue(self.conn.administration.group.add(schema))
        schema = self.conn.administration.group.get(group_name="hboperator")
        schema.users.append(
            AssociatedUserSchemaInner(
                user_id=self.conn.administration.user.get_userid_from_user_name(
                    user_name="yyy"),
                user_name="yyy"))
        self.assertTrue(self.conn.administration.group.update(schema=schema))

    def test_administration_group_get_all(self):
        ret = self.conn.administration.group.get()
        self.assertEqual(ret[0].group_name, 'hboperator')

    def test_administration_user_get(self):
        ret = self.conn.administration.user.get(user_name="xxx")
        print(ret)
        self.assertEqual(ret.user_name, 'xxx')

    def test_administration_user_add(self):
        self.conn.administration.user._admin_api.create_users = self._mock_manager
        from jnpr.healthbot import UserSchema, UserSchemaGroups
        group_id = self.conn.administration.group.get_groupid_from_group_name(
            'hboperator')
        user = UserSchema(
            user_name="xxx",
            first_name="xxx",
            last_name="xxx",
            password="******",
            email="*****@*****.**",
            active=True,
            groups=[
                UserSchemaGroups(
                    group_id=group_id,
                    group_name="hboperator")])
        self.assertTrue(self.conn.administration.user.add(user))

    def test_administration_user_update(self):
        self.conn.administration.user._admin_api.create_users = self._mock_manager
        from jnpr.healthbot import UserSchema, UserSchemaGroups
        group_id = self.conn.administration.group.get_groupid_from_group_name(
            'hboperator')
        user = UserSchema(
            user_name="xxx",
            first_name="xxx",
            last_name="xxx",
            password="******",
            email="*****@*****.**",
            active=True,
            groups=[
                UserSchemaGroups(
                    group_id=group_id,
                    group_name="hboperator")])
        self.conn.administration.user.add(user)
        obj = self.conn.administration.user.get(user_name="xxx")
        obj.last_name = "Kumar"
        self.assertTrue(self.conn.administration.user.update(schema=obj))

    def test_administration_group_delete(self):
        self.assertTrue(
            self.conn.administration.group.delete(
                group_name='hboperator'))

    def test_administration_user_delete(self):
        self.assertTrue(self.conn.administration.user.delete(user_name='xxx'))

    def test_administration_roles_get(self):
        ret = self.conn.administration.role.get(role_name='data-store:write')
        self.assertEqual(ret.role_id, 'xxx-xx-xx-xxx-xxx')

    def _mock_manager(self, *args, **kwargs):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args == () and 'users' in kwargs:
            return []
        elif args[0] == '/user/{userid}/' and args[1] == 'GET':
            from jnpr.healthbot import InlineResponse2004
            return InlineResponse2004(**{'active': True,
                                         'email': '*****@*****.**',
                                         'first_name': 'xxx',
                                         'last_name': 'kr12',
                                         'user_id': 'xxx-xx-xx-xxx-xxxx',
                                         'user_name': 'xxx'})
        elif args[0] == '/user/{userid}/' and args[1] == 'DELETE':
            return None
        elif args[0] == '/user/' and args[1] == 'GET':
            from jnpr.healthbot import InlineResponse2002
            return [InlineResponse2002(**{'active': True,
                                          'email': '*****@*****.**',
                                          'first_name': 'xxx',
                                          'last_name': 'kr12',
                                          'user_id': 'xxx-xx-xx-xxx-xxxx',
                                          'user_name': 'xxx'}),
                    InlineResponse2002(**{'active': True,
                                          'email': '*****@*****.**',
                                          'first_name': 'yyy',
                                          'last_name': 'dan',
                                          'user_id': 'yyy-xx-xx-xxx-yyyy',
                                          'user_name': 'yyy'})
                    ]
        elif args[0] == '/group/' and args[1] == 'GET':
            from jnpr.healthbot import InlineResponse2008
            return [InlineResponse2008(**{'group_description': '',
                                          'group_id': 'xx-xx-xx-xxx-xxxx',
                                          'group_name': 'hboperator',
                                          'roles': None,
                                          'users': None})]
        elif args[0] == '/group/{groupid}/' and args[1] == 'DELETE':
            return None
        elif args[0] == '/group/{groupid}/' and args[1] == 'GET':
            return Groups(**{'group_description': '',
                             'group_name': 'hboperator',
                             'roles': [{'roleId': 'xx-xxx-xxx',
                                        'roleName': 'token:write'},
                                       {'roleId': 'xx-xxy-xxx',
                                        'roleName': 'login:write'},
                                       {'roleId': 'xx-xxz-xxx',
                                        'roleName': 'user-profile:read'},
                                       {'roleId': 'xx-xxi-xxx',
                                        'roleName': 'logout:write'},
                                       {'roleId': 'xx-xxa-xxx',
                                        'roleName': 'first-login:write'}, ],
                             'users': [{'userId': 'xx-yyy-xxx',
                                        'userName': '******'}]})
        elif args[0] == '/role/':
            from jnpr.healthbot import RoleSchemaInner
            return [{'roleId': 'xxx-xx-xx-xxx-xxx',
                     'roleName': 'data-store:write'}]
        return MockResponse(None, 404)
class TestPlaybooks(unittest.TestCase):

    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch('jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login')
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        with patch('jnpr.healthbot.healthbot.HealthBotClient.version',
                   new_callable=PropertyMock) as mock_ver:
            with patch('jnpr.healthbot.healthbot.HealthBotClient.config_url',
                       new_callable=PropertyMock) as mock_cnf:
                mock_ver.return_value = '4.0.0'
                mock_cnf.return_value = "https://1.1.1.1:8080/api/v2/config"
                self.conn = HealthBotClient(
                    server='1.1.1.1',
                    user='******',
                    password='******').open()

    def tearDown(self) -> None:
        self.conn.close()

    def test_add_playbook_using_schema_check_existance(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbs = PlaybookSchema(playbook_name="automation-coredump-pb")
        pbs.description = "HbEZ Demo Examples"
        pbs.synopsis = 'fpc status'
        pbs.rules = ['hbez/hbez-fpc-heap-utilization']
        ret = self.conn.playbook.add(pbs)
        self.assertTrue(ret)

    def test_add_playbook_using_schema(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbs = PlaybookSchema(playbook_name="testing")
        pbs.description = "HbEZ Demo Examples"
        pbs.rules = ['hbez/hbez-fpc-heap-utilization']
        self.assertTrue(self.conn.playbook.add(pbs))

    def test_delete_playbook(self):
        self.assertTrue(
            self.conn.playbook.delete(
                playbook_name="testing"))

    def test_get_playbook(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.playbook.get(
            playbook_name="automation-coredump-pb")
        self.assertEqual(obj.rules, [
            "protocol-automation-coredumps/check-coredumps"
        ])

    def test_update_playbook(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.playbook.get(
            playbook_name="automation-coredump-pb")
        obj.description = "testing"
        self.conn.playbook.update(obj)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['description'],
            "testing")

    def test_get_playbooks(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.playbook.get()
        self.assertGreaterEqual(len(obj), 1)

    def test_playbook_instance_builder_with_no_variable(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn, 'automation-coredump-pb', 'HbEZ-instance',
            'Core')
        pbb.apply()
        self.assertEqual(self.mock_request().mock_calls[5][0], 'put')
        self.assertEqual(
            self.mock_request().mock_calls[5][1][0],
            'https://1.1.1.1:8080/api/v2/config/device-group/Core')

    def test_playbook_instance_builder_delete(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn, 'automation-coredump-pb', 'HbEZ-instance',
            'Core')
        pbb.delete()
        self.assertEqual(self.mock_request().mock_calls[6][0], 'put')
        self.assertEqual(
            self.mock_request().mock_calls[6][1][0],
            'https://1.1.1.1:8080/api/v2/config/device/vmx')
        self.assertEqual(
            self.mock_request().mock_calls[10][1][0],
            'https://1.1.1.1:8080/api/v2/config/device-group/Core')

    def test_playbook_apply_commit(self):
        self.mock_request().get.side_effect = self._mock_manager
        with patch('jnpr.healthbot.healthbot.HealthBotClient.config_url',
                   new_callable=PropertyMock) as mock_cnf:
            mock_cnf.return_value = "https://1.1.1.1:8080/api/v2/config"
            pbb = PlayBookInstanceBuilder(
                self.conn, 'automation-coredump-pb', 'HbEZ-instance',
                'Core')
            pbb.apply(commit=True)
            self.assertEqual(self.mock_request().mock_calls[9][0], 'post')
            self.assertEqual(
                self.mock_request().mock_calls[9][1][0],
                'https://1.1.1.1:8080/api/v2/config/configuration')

    def test_playbook_instance_builder_with_no_device_group(self):
        from jnpr.healthbot.exception import NotFoundError
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn, 'automation-coredump-pb', 'xyz', 'real')
        self.assertRaises(NotFoundError, pbb.apply)

    def test_playbook_instance_builder_with_variable(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn,
            'forwarding-table-summary',
            'HbEZ-instance',
            'Core')
        routesummary_fib_summary = pbb.rule_variables["protocol.routesummary/check-fib-summary"]
        routesummary_fib_summary.route_count_threshold = 200
        routesummary_fib_summary.route_address_family = 'abc'
        pbb.apply()
        self.assertEqual(self.mock_request().mock_calls[6][0], 'put')
        self.assertEqual(
            self.mock_request().mock_calls[6][1][0],
            'https://1.1.1.1:8080/api/v2/config/device-group/Core')

    def test_playbook_instance_builder_with_variable_per_device(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn,
            'forwarding-table-summary',
            'HbEZ-instance',
            'Core')
        routesummary_fib_summary = pbb.rule_variables["protocol.routesummary/check-fib-summary"]
        routesummary_fib_summary.route_count_threshold = 200
        routesummary_fib_summary.route_address_family = 'abc'
        pbb.apply(device_ids=['vmx'])
        self.assertEqual(self.mock_request().mock_calls[7][0], 'put')
        self.assertEqual(
            self.mock_request().mock_calls[7][1][0],
            'https://1.1.1.1:8080/api/v2/config/device/vmx')

    def test_playbook_instance_builder_with_non_existing_device(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn,
            'forwarding-table-summary',
            'HbEZ-instance',
            'Core')
        routesummary_fib_summary = pbb.rule_variables["protocol.routesummary/check-fib-summary"]
        routesummary_fib_summary.route_count_threshold = 200
        routesummary_fib_summary.route_address_family = 'abc'
        self.assertRaises(RuntimeError, pbb.apply, device_ids=['fake'])

    def test_clear(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn,
            'forwarding-table-summary',
            'HbEZ-instance',
            'Core')
        routesummary_fib_summary = pbb.rule_variables["protocol.routesummary/check-fib-summary"]
        routesummary_fib_summary.route_count_threshold = 200
        routesummary_fib_summary.route_address_family = 'abc'
        pbb.clear()
        routesummary_fib_summary = pbb.rule_variables["protocol.routesummary/check-fib-summary"]
        self.assertEqual(
            routesummary_fib_summary.route_count_threshold,
            '10000')

    def test_playbook_schema_setter(self):
        self.mock_request().get.side_effect = self._mock_manager
        pbb = PlayBookInstanceBuilder(
            self.conn,
            'forwarding-table-summary',
            'HbEZ-instance',
            'Core')
        with self.assertRaises(RuntimeError):
            pbb.playbook_schema = 30

    def test_get_playbook_schema_error(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.assertRaises(AttributeError, PlayBookInstanceBuilder, self.conn,
                          'dummy', 'HbEZ-instance', 'Core')

    def _mock_manager(self, *args):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args[0] == 'https://1.1.1.1:8080/api/v2/config/playbook/automation-coredump-pb/?working=true':
            obj = MockResponse({
                "playbook-name": "automation-coredump-pb",
                "rules": [
                    "protocol-automation-coredumps/check-coredumps"
                ]
            }, 200)
            return obj
        if args[0] == 'https://1.1.1.1:8080/api/v2/config/topic/protocol-automation-coredumps/rule/check-coredumps/?working=true':
            obj = MockResponse({"description": "This rule will monitor for the automation coredumps",
                                "field": [{"description": "Actual coredump filename",
                                           "field-name": "coredump-filename",
                                           "formula": {"user-defined-function": {"argument": [{"argument": "message",
                                                                                               "value": "$coredump-message"}],
                                                                                 "function-name": "get-core-filename-from-message"}},
                                           "type": "string"},
                                          {"description": "The actual syslog that appears when a coredump happens",
                                           "field-name": "coredump-message",
                                           "sensor": [{"path": "/junos/events/event/message",
                                                       "sensor-name": "coredump-detectors",
                                                       "where": [{"query": "/junos/events/event/message =~ /.*Core and context for (eventd|cscript).*/"}]}],
                                           "type": "string"},
                                          {"description": "Timestamp of the coredump as registered by the telemetry sensor",
                                           "field-name": "coredump-timestamp",
                                           "sensor": [{"path": "/junos/events/event/timestamp/seconds",
                                                       "sensor-name": "coredump-detectors"}],
                                           "type": "string"}],
                                "keys": ["coredump-message"],
                                "rule-name": "check-coredumps",
                                "sensor": [{"open-config": {"frequency": "0s",
                                                            "sensor-name": "/junos/events/event[id='SYSTEM']"},
                                            "sensor-name": "coredump-detectors"}],
                                "synopsis": "To monitor automation coredumps",
                                "trigger": [{"frequency": "15s",
                                             "term": [{"term-name": "core-generated",
                                                       "then": {"status": {"color": "red",
                                                                           "message": "Coredump was seen: $coredump-message"},
                                                                "user-defined-action": [{"argument": [{"argument": "local_dir_name",
                                                                                                       "value": "coredumps"}],
                                                                                         "function-name": "get-automation-traces"},
                                                                                        {"argument": [{"argument": "local_dir_name",
                                                                                                       "value": "coredump"},
                                                                                                      {"argument": "remote_dir_name",
                                                                                                       "value": "$coredump-filename"}],
                                                                                         "function-name": "get-file-from-device"},
                                                                                        {"argument": [{"argument": "local_dir_name",
                                                                                                       "value": "coredump"},
                                                                                                      {"argument": "remote_dir_name",
                                                                                                       "value": "/var/log/* /var/tmp/*"}],
                                                                                         "function-name": "get-log-file-from-device"}]},
                                                       "when": {"matches-with": [{"left-operand": "$coredump-message",
                                                                                  "right-operand": ".*Core and context.*",
                                                                                  "time-range": "30s"}]}},
                                                      {"term-name": "Core-not-generated",
                                                       "then": {"status": {"color": "green",
                                                                           "message": "No core found"}}}],
                                             "trigger-name": "core-generated"}]},
                               200)
            return obj
        if args[0] == 'https://1.1.1.1:8080/api/v2/config/playbooks/?working=true':
            obj = MockResponse({"playbook": [{"playbook-name": "netsvc-playbook",
                                              "rules": ["chassis.networkservices/netsvc-rule"]},
                                             {"playbook-name": "phyport",
                                              "rules": ["external/interface-info"]},
                                             {"playbook-name": "automation-coredump-pb",
                                              "rules": ["protocol-automation-coredumps/check-coredumps"]},
                                             {"description": "This playbook help to collect eventd debug logs",
                                              "playbook-name": "eventd-debug-collection",
                                              "rules": ["protocol-eventd-debug/collect-debugs"],
                                              "synopsis": "Collect eventd logs"}]},
                               200)
            return obj
        if args[0] == 'https://1.1.1.1:8080/api/v2/config/topic/protocol.routesummary/rule/check-fib-summary/?working=true':
            obj = MockResponse({
                "description": "Collects forwarding-table's total-route-count of each protocol and sets dynamic thresholds and notify anomaly when route count is abnormal",
                "field": [
                    {
                        "description": "Address family name to be monitored",
                        "field-name": "address-family",
                        "sensor": [
                            {
                                "path": "address-family",
                                "sensor-name": "fib-sensor",
                                "where": [
                                    {
                                        "query": "address-family =~ /^{{route-address-family}}$/"
                                    }
                                ]
                            }
                        ],
                        "type": "string"
                    },
                    {
                        "description": "Detects anamoly dynamically using kmeans algorithm",
                        "field-name": "dt-route-count",
                        "formula": {
                            "dynamic-threshold": {
                                "algorithm": "3sigma",
                                "field-name": "$route-count",
                                "learning-period": "7d",
                                "pattern-periodicity": "1h"
                            }
                        },
                        "type": "integer"
                    },
                    {
                        "description": "Route table type to be monitored",
                        "field-name": "route-table-type",
                        "sensor": [
                            {
                                "path": "route-table-type",
                                "sensor-name": "fib-sensor",
                                "where": [
                                    {
                                        "query": "route-table-type =~ /^{{table-type}}$/"
                                    }
                                ]
                            }
                        ],
                        "type": "string"
                    },
                    {
                        "description": "Route table name to be monitored",
                        "field-name": "table-name",
                        "sensor": [
                            {
                                "path": "table-name",
                                "sensor-name": "fib-sensor",
                                "where": [
                                    {
                                        "query": "table-name =~ /^{{route-table-name}}$/"
                                    }
                                ]
                            }
                        ],
                        "type": "string"
                    },
                    {
                        "constant": {
                            "value": "{{route-count-threshold}}"
                        },
                        "description": "Route count static threshold",
                        "field-name": "threshold",
                        "type": "integer"
                    }
                ],
                "keys": [
                    "address-family",
                    "route-table-type",
                    "table-name"
                ],
                "rule-name": "check-fib-summary",
                "sensor": [
                    {
                        "description": "iAgent sensor collect forwarding-table route-count stats from network device",
                        "iAgent": {
                            "file": "fib.yml",
                            "frequency": "10m",
                            "table": "FibSummaryTable"
                        },
                        "sensor-name": "fib-sensor",
                        "synopsis": "FIB iAgent sensor definition"
                    }
                ],
                "synopsis": "Forwarding-table protocols routes statistics analyzer",
                "trigger": [
                    {
                        "frequency": "10m",
                        "term": [
                            {
                                "term-name": "is-route-count-abnormal",
                                "then": {
                                    "status": {
                                        "color": "red",
                                        "message": "Route count of $table-name of $address-family of $route-table-type is ($route-count) abnormal"
                                    }
                                },
                                "when": {
                                    "greater-than-or-equal-to": [
                                        {
                                            "left-operand": "$route-count",
                                            "right-operand": "$threshold",
                                            "time-range": "30m"
                                        }
                                    ]
                                }
                            },
                            {
                                "term-name": "is-route-count-above-dt",
                                "then": {
                                    "status": {
                                        "color": "yellow",
                                        "message": "Route count of $table-name of $address-family of $route-table-type is ($route-count) is above dynamic threshold"
                                    }
                                },
                                "when": {
                                    "equal-to": [
                                        {
                                            "left-operand": "$dt-route-count",
                                            "right-operand": "1",
                                            "time-range": "30m"
                                        }
                                    ]
                                }
                            },
                            {
                                "term-name": "route-count-normal",
                                "then": {
                                    "status": {
                                        "color": "green",
                                        "message": "Route count of $table-name of $address-family of $route-table-type is ($route-count) normal"
                                    }
                                }
                            }
                        ],
                        "trigger-name": "fib-route-count"
                    }
                ],
                "variable": [
                    {
                        "description": "address-family names to monitor, regular expression, eg 'Internet|Internet6|MPLS|VPLS'",
                        "name": "route-address-family",
                        "type": "string",
                        "value": ".+"
                    },
                    {
                        "description": "Forwarding table's each protocol's route count threshold",
                        "name": "route-count-threshold",
                        "type": "int",
                        "value": "10000"
                    },
                    {
                        "description": "route table names to monitor, regular expression, eg 'default.inet|default.inet6|vpn_0.inet'",
                        "name": "route-table-name",
                        "type": "string",
                        "value": ".+"
                    },
                    {
                        "description": "route table types to monitor, regular expression, eg 'perm|intf|user'",
                        "name": "table-type",
                        "type": "string",
                        "value": ".+"
                    }
                ]
            },
                200)
            return obj
        if args[0] == 'https://1.1.1.1:8080/api/v2/config/playbook/forwarding-table-summary/?working=true':
            obj = MockResponse({
                "description": "Playbook monitors forwarding-table's each protocol's route count and notifies anomaly when route count is above static or dynamic threshold",
                "playbook-name": "forwarding-table-summary",
                "rules": [
                    "protocol.routesummary/check-fib-summary"
                ],
                "synopsis": "Forwarding table and protocol routes key performance indicators"
            }, 200)
            return obj
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device-group/Core/?working=true':
            return MockResponse({"description": "testing",
                                 "device-group-name": "Core",
                                 "devices": ["vmx"],
                                 "native-gpb": {"ports": [22000]},
                                 "notification": {},
                                 "playbooks": ["eventd-debug-collection",
                                               "eventd-kpis-playbook",
                                               'automation-coredump-pb'],
                                 "reports": [],
                                 "variable": [{"@": {"changed-seconds": 1564722219},
                                               "instance-id": "HbEZ-instance",
                                               "playbook": "automation-coredump-pb",
                                               "rule": "x/y",
                                               "variable-value": []}]},
                                200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device/vmx/?working=true':
            return MockResponse({
                "authentication": {
                    "password": {
                        "password": "******",
                        "username": "******"
                    }
                },
                "device-id": "vmx",
                "host": "10.221.136.140",
                "open-config": {
                    "port": 32767
                },
                "system-id": "testing",
                "variable": [{"@": {"changed-seconds": 1564722219},
                                               "instance-id": "HbEZ-instance",
                                               "playbook": "automation-coredump-pb",
                                               "rule": "x/y",
                                               "variable-value": []}],
                "vendor": {
                    "juniper": {
                        "operating-system": "junos"
                    }
                }
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/playbook/testing/?working=true':
            obj = MockResponse({
                "detail": "Playbook not found",
                "status": 404
            }, 404)
            return obj
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device/vmx/?working=true':
            return MockResponse({
                "authentication": {
                    "password": {
                        "password": "******",
                        "username": "******"
                    }
                },
                "device-id": "vmx",
                "host": "10.221.xxx.xxx",
                "open-config": {
                    "port": 32767
                },
                "system-id": "testing",
                "variable": [],
                "vendor": {
                    "juniper": {
                        "operating-system": "junos"
                    }
                }
            }, 200)
        return MockResponse(None, 404)
class TestSettings(unittest.TestCase):

    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch('jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login')
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        self.mock_request().get.side_effect = self._mock_manager
        with patch('jnpr.healthbot.healthbot.HealthBotClient.version',
                   new_callable=PropertyMock) as mock_ver:
            with patch('jnpr.healthbot.healthbot.HealthBotClient.config_url',
                       new_callable=PropertyMock) as mock_cnf:
                mock_ver.return_value = '4.0.0'
                mock_cnf.return_value = "https://1.1.1.1:8080/api/v2/config"
                self.conn = HealthBotClient(
                    server='1.1.1.1',
                    user='******',
                    password='******').open()
        self.conn.api_client.call_api = self._mock_manager

    def tearDown(self) -> None:
        self.conn.close()

    def test_add_notification(self):
        ns = NotificationSchema(notification_name='HbEZ-notification')
        ns.description = "example of adding notification via API"
        nss = NotificationSchemaSlack(channel="HbEZ", url='https://testing')
        ns.slack = nss
        self.assertTrue(self.conn.settings.notification.add(ns))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/notification/HbEZ-notification')
        # add without schema
        self.assertTrue(
            self.conn.settings.notification.add(
                notification_name='HbEZ-notification',
                description="example of adding notification via API"))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/notification/HbEZ-notification')

    def test_add_scheduler(self):
        sc = SchedulerSchema(
            name='HbEZ-schedule',
            repeat={
                'every': 'week'},
            start_time="2019-07-22T05:32:23Z")
        self.assertTrue(self.conn.settings.scheduler.add(sc))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/system-settings/scheduler/HbEZ-schedule')
        # add without schema
        self.assertTrue(
            self.conn.settings.scheduler.add(
                name='HbEZ-schedule',
                repeat={
                    'every': 'week'},
                start_time="2019-07-22T05:32:23Z"))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/system-settings/scheduler/HbEZ-schedule')

    def test_add_destinaton(self):
        ds = DestinationSchema(
            name='HbEZ-destination',
            email={
                'id': '*****@*****.**'})
        self.assertTrue(self.conn.settings.destination.add(ds))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/destination/HbEZ-destination')
        # add without schema
        self.assertTrue(self.conn.settings.destination.add(
            name='HbEZ-destination', email={'id': '*****@*****.**'}))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/destination/HbEZ-destination')

    def test_add_report(self):
        rs = ReportSchema(
            name="HbEZ-report",
            destination=['HbEZ-destination'],
            format="html",
            schedule=["HbEZ-schedule"])
        self.assertTrue(self.conn.settings.report.add(rs))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/report/HbEZ-report')
        # add without schema
        self.assertTrue(
            self.conn.settings.report.add(
                name="HbEZ-report",
                destination=['HbEZ-destination'],
                format="html",
                schedule=["HbEZ-schedule"]))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/report/HbEZ-report')

    def test_add_retention_policy(self):
        rps = RetentionPolicySchema(retention_policy_name='HbEZ-testing')
        self.assertTrue(
            self.conn.settings.retention_policy.add(rps))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/retention-policy/HbEZ-testing')
        # without creating schema
        self.assertTrue(
            self.conn.settings.retention_policy.add(
                retention_policy_name='HbEZ-testing'))
        self.assertEqual(self.mock_request().mock_calls[2][0], 'post')
        self.assertEqual(
            self.mock_request().mock_calls[2][1][0],
            'https://1.1.1.1:8080/api/v2/config/retention-policy/HbEZ-testing')

    def test_get_notification(self):
        ns = self.conn.settings.notification.get(
            notification_name='HbEZ-notification')
        self.assertEqual(
            ns.description,
            "example of adding notification via API")
        self.assertEqual(ns.notification_name, "HbEZ-notification")

    def test_get_notification_error(self):
        self.assertRaises(
            ValueError,
            self.conn.settings.notification.get,
            notification_name='error')

    def test_get_scheduler(self):
        sc = self.conn.settings.scheduler.get(name='HbEZ-schedule')
        self.assertEqual(sc.repeat, {
            "every": "week"
        })

    def test_get_destination(self):
        ds = self.conn.settings.destination.get(
            name='HbEZ-destination')
        self.assertEqual(ds.email, {'id': '*****@*****.**'})

    def test_get_report(self):
        rs = self.conn.settings.report.get(name="HbEZ-report")
        self.assertEqual(rs.format, 'html')

    def test_get_retention_policy(self):
        rp = self.conn.settings.retention_policy.get(
            'HbEZ-testing')
        self.assertEqual(rp.retention_policy_name, "HbEZ-testing")

    def test_get_reports(self):
        rs = self.conn.settings.report.get()
        self.assertGreater(len(rs), 0)

    def test_get_notifications(self):
        ns = self.conn.settings.notification.get()
        self.assertGreater(len(ns), 0)

    def test_get_schedulers(self):
        sc = self.conn.settings.scheduler.get()
        self.assertGreater(len(sc), 0)

    def test_get_destinations(self):
        des = self.conn.settings.destination.get()
        self.assertGreater(len(des), 0)

    def test_get_reports(self):
        rep = self.conn.settings.report.get()
        self.assertGreater(len(rep), 0)

    def test_get_retention_policies(self):
        rp = self.conn.settings.retention_policy.get()
        self.assertGreater(len(rp), 0)

    def test_delete_notification(self):
        ret = self.conn.settings.notification.delete(
            notification_name='HbEZ-notification')
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0],
                         'delete')

    def test_delete_scheduler(self):
        ret = self.conn.settings.scheduler.delete(
            name='HbEZ-schedule')
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0],
                         'delete')

    def test_delete_destinaton(self):
        ret = self.conn.settings.destination.delete(
            name='HbEZ-destination')
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0],
                         'delete')

    def test_delete_report(self):
        ret = self.conn.settings.report.delete(name="HbEZ-report")
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0],
                         'delete')

    def test_delete_retention_policy(self):
        ret = self.conn.settings.retention_policy.delete(
            "HbEZ-testing")
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0],
                         'delete')

    def test_update_notification(self):
        ns = self.conn.settings.notification.get(
            notification_name='HbEZ-notification')
        from jnpr.healthbot import NotificationSchemaHttppost
        ns.http_post = NotificationSchemaHttppost(url='https://juniper.net')
        self.conn.settings.notification.update(ns)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['http-post']['url'],
            'https://juniper.net')

    def test_update_scheduler(self):
        sc = self.conn.settings.scheduler.get(name='HbEZ-schedule')
        sc.repeat = {'every': 'daily'}
        self.conn.settings.scheduler.update(sc)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['repeat']['every'],
            'daily')

    def test_update_destination(self):
        ds = self.conn.settings.destination.get(
            name='HbEZ-destination')
        ds.email = {'id': '*****@*****.**'}
        self.conn.settings.destination.update(ds)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['email']['id'],
            '*****@*****.**')

    def test_update_report(self):
        rs = self.conn.settings.report.get(name="HbEZ-report")
        rs.format = 'json'
        self.conn.settings.report.update(rs)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['format'],
            'json')

    def test_update_retention_policy(self):
        rp = self.conn.settings.retention_policy.get(
            'HbEZ-testing')
        rp.duration = '10h'
        self.conn.settings.retention_policy.update(rp)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['duration'],
            '10h')

    def test_license_get(self):
        ret = self.conn.settings.license.get(
            'xxx-xx-xxx')
        self.assertEqual(ret["customer-id"], "xxxx")

    def test_license_get_ids(self):
        ret = self.conn.settings.license.get_ids()
        self.assertEqual(ret, ['xxx-xx-xxx', 'yyy-yy-yyy'])

    def test_license_get_features(self):
        ret = self.conn.settings.license.get_features()
        self.assertEqual(ret.feature_description, "Max G8")

    def test_license_get_all(self):
        ret = self.conn.settings.license.get()
        self.assertEqual(ret[0].validity_type, "countdown")

    def test_license_delete(self):
        self.assertTrue(self.conn.settings.license.delete("xxx-xx-xxx"))

    def _mock_manager(self, *args, **kwargs):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            @property
            def text(self):
                return 'did you just hit an error'

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args[0] == 'https://1.1.1.1:8080/api/v2/config/notification/HbEZ-notification/?working=true':
            return MockResponse({
                "description": "example of adding notification via API",
                "notification-name": "HbEZ-notification",
                "slack": {
                    "channel": "HbEZ",
                    "url": "http://testing"
                }
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/system-settings/scheduler/HbEZ-schedule/?working=true':
            return MockResponse({
                "name": "HbEZ-schedule",
                "repeat": {
                    "every": "week"
                },
                "start-time": "2019-07-22T05:32:23Z"
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/destination/HbEZ-destination/?working=true':
            return MockResponse({
                "email": {
                    "id": "*****@*****.**"
                },
                "name": "HbEZ-destination"
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/report/HbEZ-report/?working=true':
            return MockResponse({
                "destination": [
                    "HbEZ-destination"
                ],
                "format": "html",
                "name": "HbEZ-report",
                "schedule": [
                    "HbEZ-schedule"
                ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/reports/?working=true':
            return MockResponse({
                "report": [
                    {
                        "destination": [
                            "HbEZ-destination"
                        ],
                        "format": "html",
                        "name": "HbEZ-report",
                        "schedule": [
                            "HbEZ-schedule"
                        ]
                    }
                ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/notifications/?working=true':
            return MockResponse({
                "notification": [
                    {
                        "description": "example of adding notification via API",
                        "notification-name": "HbEZ-notification",
                        "slack": {
                            "channel": "HbEZ",
                            "url": "http://testing"
                        }
                    }
                ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/system-settings/schedulers/?working=true':
            return MockResponse({
                "scheduler": [
                    {
                        "name": "HbEZ-schedule",
                        "repeat": {
                            "every": "week"
                        },
                        "start-time": "2019-07-22T05:32:23Z"
                    }
                ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/system-settings/report-generation/destinations/?working=true':
            return MockResponse({
                "destination": [
                    {
                        "email": {
                            "id": "*****@*****.**"
                        },
                        "name": "HbEZ-destination"
                    }
                ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/retention-policy/HbEZ-testing/?working=true':
            return MockResponse({
                "retention-policy-name": "HbEZ-testing"
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/retention-policies/?working=true':
            return MockResponse({
                "retention-policy": [
                    {
                        "retention-policy-name": "HbEZ-testing"
                    }
                ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/notification/error/?working=true':
            obj = MockResponse(None, 404)

            def fn():
                raise ValueError
            obj.raise_for_status = fn
            return obj
        elif args[0] == '/license/key/{license_id}/contents/' and \
                args[2] == {'license_id': 'xxx-xx-xxx'}:
            return {"customer-id": "xxxx",
                    "end-date": "2106-02-0xxx",
                    "features": [{"capacity-flag": False,
                                  "capacity-value": 1,
                                  "feature-description": "Allow a..",
                                  "feature-id": 10001,
                                  "feature-name": "xxxx"},
                                 ],
                    "license-id": "xxx-xx-xxx",
                    "mode": "standalone",
                    "order-type": "commercial",
                    "sku-name": "HBxxx",
                    "start-date": "20xxx",
                    "sw-serial-id": "07xxx",
                    "validity-type": "xxx",
                    "version": 1}
        elif args[0] == '/license/keys/contents/':
            from jnpr.healthbot import LicenseKeySchema
            from jnpr.healthbot import LicenseKeysSchema
            return LicenseKeysSchema([LicenseKeySchema(**{"customer_id": "xxxx",
                    "end_date": "2106-02-0xxx",
                    "features": [{"capacity_flag": False,
                                  "capacity_value": 1,
                                  "feature_description": "Allow a..",
                                  "feature_id": 10001,
                                  "feature_name": "xxxx"},
                                 ],
                    "license_id": "xxx-xx-xxx",
                    "mode": "standalone",
                    "order_type": "commercial",
                    "sku_name": "HBxxx",
                    "start_date": "20xxx",
                    "sw_serial_id": "07xxx",
                    "validity_type": "countdown",
                    "version": 1})])
        elif args[0] == '/license/keys/':
            return ["xxx-xx-xxx", "yyy-yy-yyy"]
        elif args[0] == '/license/status/':
            from jnpr.healthbot import LicenseFeaturesSchema
            from jnpr.healthbot import LicenseFeatureSchema
            return LicenseFeaturesSchema(license_feature= LicenseFeatureSchema(**{'compliance': True,
                     'end_date': 111,
                     'feature_description': 'Max G8',
                     'feature_id': 111,
                     'feature_name': 'xxxx',
                     'license_remaining': 1,
                     'license_requested': 1,
                     'license_total': 1,
                     'license_usage': 1,
                     'max_remaining_days': 1,
                     'mode': 'standalone',
                     'valid_until': 'xxxx',
                     'validity_type': 'countdown'}))
        elif args[0] == '/license/key/{license_id}/' and args[1] == 'DELETE' and\
                args[2] == {'license_id': 'xxx-xx-xxx'}:
            return None
        return MockResponse(None, 404)
Beispiel #6
0
class TestDevices(unittest.TestCase):

    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch('jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login')
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        with patch('jnpr.healthbot.healthbot.HealthBotClient.version',
                   new_callable=PropertyMock) as mock_ver:
            with patch('jnpr.healthbot.healthbot.HealthBotClient.config_url',
                       new_callable=PropertyMock) as mock_cnf:
                mock_ver.return_value = '4.0.0'
                mock_cnf.return_value = "https://1.1.1.1:8080/api/v2/config"
                self.conn = HealthBotClient(
                    server='1.1.1.1',
                    user='******',
                    password='******').open()

    def tearDown(self) -> None:
        self.conn.close()

    def test_add_device(self):
        self.mock_request().post.side_effect = self._mock_manager
        ret = self.conn.device.add('core', 'user', 'password')
        self.assertTrue(ret)

    def test_add_device_existing(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.device.add(
            'vmx', '10.221.136.140', 'user', 'password')
        self.assertTrue(ret)

    def test_add_device_using_schema(self):

        self.mock_request().post.side_effect = self._mock_manager
        from jnpr.healthbot import DeviceSchema

        ds = DeviceSchema(
            device_id='core',
            host='10.221.136.140',
            authentication={
                "password": {
                    "password": "******",
                    "username": "******"}})
        ret = self.conn.device.add(schema=ds)
        self.assertTrue(ret)

    def test_get_device_ids_default_empty(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.device.get_ids()
        self.assertEqual(ret, [])

    def test_delete_device(self):
        self.mock_request().delete.side_effect = self._mock_manager
        ret = self.conn.device.delete(device_id='core')
        self.assertTrue(ret)

    def test_delete_device_force(self):
        self.mock_request().delete.side_effect = self._mock_manager
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.device.delete(device_id='core', force=True)
        self.assertTrue(ret)
        self.assertEqual(self.mock_request().mock_calls[2][0], 'get')
        self.assertEqual(self.mock_request().mock_calls[4][0], 'put')
        self.assertEqual(self.mock_request().mock_calls[2][1][0],
                         'https://1.1.1.1:8080/api/v2/config/device-groups')
        self.assertEqual(self.mock_request().mock_calls[4][1][0],
                         'https://1.1.1.1:8080/api/v2/config/device-group/edge')
        self.assertEqual(self.mock_request().mock_calls[4][2]['json'],
                         {'description': 'testing', 'device-group-name': 'edge',
                          'devices': ['demo'], 'native-gpb': {'ports': [22000]},
                          'notification': {}, 'playbooks': ['eventd-debug-collection',
                                                            'eventd-kpis-playbook'],
                          'reports': [], 'variable': []})

    def test_get_device(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.device.get(device_id='core')
        self.assertIsInstance(ret, DeviceSchema)

    def test_get_devices(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.device.get()
        self.assertGreater(len(ret), 0)

    def test_update_device(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.device.get(device_id='core')
        obj.description = 'test in progress'
        self.conn.device.update(schema=obj)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['description'],
            'test in progress')

    def test_get_device_facts(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.device.get_facts(device_id='core')
        self.assertIn('facts', obj)

    def test_get_devices_facts(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.device.get_facts()
        self.assertNotEqual(len(obj), 0)

    def test_add_device_group(self):
        dgs = DeviceGroupSchema(device_group_name="edge",
                                description="All devices on the edge",
                                devices=['xyz'])
        self.assertTrue(self.conn.device_group.add(dgs))

    def test_add_device_group_wrong_schema(self):
        dgs = DeviceSchema(
            device_id='core',
            host='10.221.136.140',
            authentication={
                "password": {
                    "password": "******",
                    "username": "******"}})
        self.assertRaises(SchemaError, self.conn.device_group.add, dgs)

    def test_delete_device_group(self):
        self.assertTrue(
            self.conn.device_group.delete(
                device_group_name="edge"))

    def test_delete_device_group_force(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.assertTrue(
            self.conn.device_group.delete(
                device_group_name="edge", force=True))

    def test_get_device_group(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.device_group.get('Core')
        self.assertEqual(ret.description, 'testing')

    def test_update_device_group(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.device_group.get('Core')
        obj.description = 'test in progress'
        self.conn.device_group.update(schema=obj)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['description'],
            'test in progress')

    def test_get_device_groups(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.device_group.get()
        self.assertNotEqual(len(obj), 0)

    def test_check_device_in_group(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.assertTrue(
            self.conn.device_group.check_device_in_group(
                'vmx', 'Core'))

    def test_add_device_in_group(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.assertTrue(
            self.conn.device_group.add_device_in_group(
                'test', 'Core'))
        self.assertEqual(
            self.mock_request().mock_calls[4][2]['json']['devices'], [
                'vmx', 'core', 'test'])

    def test_add_device_in_group_with_group_data_none(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.assertTrue(
            self.conn.device_group.add_device_in_group(
                'test', 'alpha'))
        self.assertEqual(
            self.mock_request().mock_calls[4][2]['json'],
            {'device-group-name': 'alpha', 'devices': ['test']})

    def test_add_network_group(self):
        self.mock_request().post.side_effect = self._mock_manager
        self.mock_request().get.side_effect = self._mock_manager
        from jnpr.healthbot.modules.devices import NetworkGroupSchema
        ngs = NetworkGroupSchema(network_group_name="HbEZ")
        ret = self.conn.network_group.add(schema=ngs)
        self.assertTrue(ret)

    def test_add_network_group_existing(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.assertTrue(
            self.conn.network_group.add(
                network_group_name="HbEZ"))

    def test_get_network_group(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.network_group.get(network_group_name="HbEZ")
        self.assertEqual(obj.description, "testing")

    def test_get_network_groups(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.network_group.get()
        self.assertGreater(len(ret), 0)

    def test_update_network_group(self):
        self.mock_request().get.side_effect = self._mock_manager
        obj = self.conn.network_group.get('HbEZ')
        obj.description = 'test in progress'
        self.conn.network_group.update(schema=obj)
        self.assertEqual(
            self.mock_request().mock_calls[3][2]['json']['description'],
            'test in progress')

    def test_delete_network_group(self):
        self.assertTrue(self.conn.network_group.delete(
            network_group_name="HbEZ"))

    def test_get_device_health(self):
        self.mock_request().get.side_effect = self._mock_manager
        health = self.conn.device.health('avro')
        self.assertEqual(health.color, 'red')

    def test_get_device_group_health(self):
        self.mock_request().get.side_effect = self._mock_manager
        health = self.conn.device_group.health('Core')
        self.assertEqual(health.color, 'yellow')

    def test_get_network_group_health(self):
        self.mock_request().get.side_effect = self._mock_manager
        health = self.conn.network_group.health('Core')
        self.assertEqual(health.color, 'yellow')

    def _mock_manager(self, *args, **kwargs):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args[0] == 'https://1.1.1.1:8080/api/v2/config/device/core' and kwargs != {}:
            return MockResponse({}, 200)
        elif args[0] in ['https://1.1.1.1:8080/api/v2/config/device-groups',
                         'https://1.1.1.1:8080/api/v2/config/device-groups/?working=true']:
            return MockResponse({
                "device-group": [
                    {
                        "description": "learning",
                        "device-group-name": "Core",
                        "devices": [
                            "vmx"
                        ],
                        "native-gpb": {
                            "ports": [
                                22000
                            ]
                        },
                        "notification": {},
                        "playbooks": [
                            "eventd-debug-collection",
                            "eventd-kpis-playbook"
                        ],
                        "reports": [],
                        "variable": []
                    },
                    {
                        "description": "All devices on the edge",
                        "device-group-name": "edge",
                        "devices": [
                            "demo",
                            "core"
                        ],
                        "notification": {},
                        "playbooks": [],
                        "reports": []
                    },
                    {
                        "device-group-name": "real",
                        "devices": [
                            "avro"
                        ],
                        "notification": {},
                        "playbooks": [
                            "online-fpc-playbook",
                            "phyport"
                        ],
                        "reports": [],
                        "variable": [
                            {
                                "@": {
                                    "changed-seconds": 1563348601
                                },
                                "instance-id": "ge-1-0-0",
                                "playbook": "phyport",
                                "rule": "external/interface-info",
                                "variable-value": [
                                    {
                                        "name": "interface_name",
                                        "value": "ge-1/0/0"
                                    }
                                ]
                            },
                            {
                                "@": {
                                    "changed-seconds": 1563348601
                                },
                                "instance-id": "ge-1-0-1",
                                "playbook": "phyport",
                                "rule": "external/interface-info",
                                "variable-value": [
                                    {
                                        "name": "interface_name",
                                        "value": "ge-1/0/1"
                                    }
                                ]
                            },
                            {
                                "@": {
                                    "changed-seconds": 1563348601
                                },
                                "instance-id": "xyz",
                                "playbook": "online-fpc-playbook",
                                "rule": "linecard.statistics/update-online-fpc"
                            }
                        ]
                    },
                    {
                        "description": "xyz",
                        "device-group-name": "QFabric",
                        "devices": [
                            "vmx"
                        ],
                        "notification": {},
                        "playbooks": [],
                        "reports": [],
                        "variable": []
                    }
                ]
            }, 200)
        elif args[0] in ['https://1.1.1.1:8080/api/v2/config/device-group/Core/?working=true',
                         'https://1.1.1.1:8080/api/v2/config/device-group/Core']:
            return MockResponse({
                "description": "testing",
                "device-group-name": "Core",
                "devices": [
                    "vmx",
                    "core"
                ],
                "native-gpb": {
                    "ports": [
                        22000
                    ]
                },
                "notification": {},
                "playbooks": [
                    "eventd-debug-collection",
                    "eventd-kpis-playbook"
                ],
                "reports": [],
                "variable": []
            }, 200)
        elif args[0] in ['https://1.1.1.1:8080/api/v2/config/device-group/edge/?working=true',
                         'https://1.1.1.1:8080/api/v2/config/device-group/edge']:
            return MockResponse({
                "description": "testing",
                "device-group-name": "edge",
                "devices": [
                    "vmx",
                    "core"
                ],
                "native-gpb": {
                    "ports": [
                        22000
                    ]
                },
                "notification": {},
                "playbooks": [
                    "eventd-debug-collection",
                    "eventd-kpis-playbook"
                ],
                "reports": [],
                "variable": []
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device-group/QFabric':
            return MockResponse({}, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device/core':
            return MockResponse({}, 204)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device/core/?working=true':
            return MockResponse({
                "authentication": {
                    "password": {
                        "password": "******",
                        "username": "******"
                    }
                },
                "device-id": "vmx",
                "host": "10.221.136.140",
                "open-config": {
                    "port": 32767
                },
                "system-id": "testing",
                "variable": [],
                "vendor": {
                    "juniper": {
                        "operating-system": "junos"
                    }
                }
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/device/core/facts/?working=true':
            return MockResponse({"device-id": "core",
                                 "facts": {"fpc": [],
                                           "hostname": "R1_re0",
                                           "platform": "MX960",
                                           "platform-info": [{"name": "re0",
                                                              "platform": "MX960"}],
                                           "product": "MX",
                                           }},
                                200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/devices/facts/?working=true':
            return MockResponse([{"device-id": "core",
                                  "facts": {"fpc": [],
                                            "hostname": "R1_re0",
                                            "platform": "MX960",
                                            "platform-info": [{"name": "re0",
                                                               "platform": "MX960"}],
                                            "product": "MX",
                                            }}],
                                200)
        if args[0] == 'https://1.1.1.1:8080/api/v2/config/devices/?working=true':
            return MockResponse({"device": [
                {
                    "authentication": {
                        "password": {
                            "password": "******",
                            "username": "******"
                        }
                    },
                    "device-id": "vmx",
                    "host": "10.221.136.140",
                    "open-config": {
                        "port": 32767
                    },
                    "system-id": "testing",
                    "variable": [],
                    "vendor": {
                        "juniper": {
                            "operating-system": "junos"
                        }
                    }
                },
                {
                    "authentication": {
                        "password": {
                            "password": "******",
                            "username": "******"
                        }
                    },
                    "device-id": "avro",
                    "host": "10.209.14.109",
                    "open-config": {
                        "port": 32767
                    },
                    "vendor": {
                        "juniper": {
                            "operating-system": "junos"
                        }
                    }
                },
                {
                    "authentication": {
                        "password": {
                            "password": "******",
                            "username": "******"
                        }
                    },
                    "device-id": "node1",
                    "host": "node1",
                    "open-config": {
                        "port": 32767
                    },
                    "vendor": {
                        "juniper": {
                            "operating-system": "junos"
                        }
                    }
                },
                {
                    "authentication": {
                        "password": {
                            "password": "******",
                            "username": "******"
                        }
                    },
                    "device-id": "demo",
                    "host": "10.221.136.140",
                    "system-id": "Demo:HbEZ"
                }
            ]
            }, 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/network-group/HbEZ/?working=true':
            obj = MockResponse({'description': "testing",
                                'network-group-name': 'HbEZ',
                                'notification': {},
                                'playbooks': [],
                                'reports': [],
                                'variable': None}, 200)
            return obj
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/network-groups/?working=true':
            obj = MockResponse({
                "network-group": [
                    {
                        "network-group-name": "HbEZ",
                        "notification": {},
                        "playbooks": [],
                        "reports": []
                    }
                ]
            }, 200)
            return obj
        elif args[0] == 'https://1.1.1.1:8080/api/v2/config/services/device-group/':
            return MockResponse(["edge"], 200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/health-tree/avro':
            return MockResponse({'children': [{'children': [{'children': [{'children': [{'color': 'red',
                                                                                         'data': 'either is '
                                                                                         'down',
                                                                                         'name': 'check-status',
                                                                                         'timestamp': '2019-07-22T10:28:08Z'}],
                                                                           'color': 'red',
                                                                           'name': '_instance_id: ["ge-1-0-1", '
                                                                           '"ge-1-0-0"], '
                                                                           '_playbook_name: phyport, '
                                                                           'name: ge-1/0/1'},
                                                                          {'children': [{'color': 'red',
                                                                                         'data': 'either is '
                                                                                         'down',
                                                                                         'name': 'check-status',
                                                                                         'timestamp': '2019-07-22T10:28:08Z'}],
                                                                           'color': 'red',
                                                                           'name': '_instance_id: ["ge-1-0-1", '
                                                                           '"ge-1-0-0"], '
                                                                           '_playbook_name: phyport, '
                                                                           'name: ge-1/0/0'}],
                                                             'color': 'red',
                                                             'name': 'external'}],
                                               'color': 'red',
                                               'name': 'real'}],
                                 'color': 'red',
                                 'data': None,
                                 'name': 'avro',
                                 'timestamp': None},
                                200)
        elif args[0] in ['https://1.1.1.1:8080/api/v2/health-tree/device-group/Core',
                         'https://1.1.1.1:8080/api/v2/health-tree/Core']:
            return MockResponse({"children": [{"children": [{"children": [],
                                                             "name": "interface.statistics"},
                                                            {"children": [],
                                                             "name": "linecard.fpc"},
                                                            {"children": [],
                                                             "name": "linecard.ospf"},
                                                            {"children": [],
                                                             "name": "linecard.statistics"},
                                                            {"children": [],
                                                             "name": "system.statistics"}],
                                               "color": "yellow",
                                               "name": "vmx"}],
                                 "color": "yellow",
                                 "name": "Core"},
                                200)
        elif args[0] == 'https://1.1.1.1:8080/api/v2/health-tree/network-group/Core':
            return MockResponse({"children": [{"children": [{"children": [],
                                                             "name": "interface.statistics"},
                                                            {"children": [],
                                                             "name": "linecard.fpc"},
                                                            {"children": [],
                                                             "name": "linecard.ospf"},
                                                            {"children": [],
                                                             "name": "linecard.statistics"},
                                                            {"children": [],
                                                             "name": "system.statistics"}],
                                               "color": "yellow",
                                               "name": "vmx"}],
                                 "color": "yellow",
                                 "name": "Core"},
                                200)
        return MockResponse(None, 404)
class TestProfiles(unittest.TestCase):
    @patch('jnpr.healthbot.healthbot.requests.Session')
    @patch(
        'jnpr.healthbot.swagger.api.authentication_api.AuthenticationApi.user_login'
    )
    def setUp(self, mock_user_login, mock_request):
        self.mock_user_login = _mock_user_login
        self.mock_request = mock_request
        with patch('jnpr.healthbot.healthbot.HealthBotClient.version',
                   new_callable=PropertyMock) as mock_ver:
            with patch('jnpr.healthbot.healthbot.HealthBotClient.config_url',
                       new_callable=PropertyMock) as mock_cnf:
                mock_ver.return_value = '2.1.0'
                mock_cnf.return_value = "https://1.1.1.1:8080/api/v1"
                self.conn = HealthBotClient(server='1.1.1.1',
                                            user='******',
                                            password='******').open()

    def tearDown(self) -> None:
        self.conn.close()

    def test_add_caprofile(self):
        ca_prof_schema = CaProfileSchema(certificate_authority_crt='abc.crt',
                                         name='hbez')
        self.assertTrue(
            self.conn.settings.security.ca_profile.add(ca_prof_schema))
        self.assertTrue(
            self.conn.settings.security.ca_profile.add(
                certificate_authority_crt='abc.crt', name='hbez'))

    def test_get_caprofile(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.profile.security.ca_profile.get()
        self.assertEqual(ret[0].certificate_authority_crt, "test.crt")
        ret = self.conn.profile.security.ca_profile.get("hbez")
        self.assertEqual(ret.certificate_authority_crt, "test.crt")

    def test_update_caprofile(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.profile.security.ca_profile.get("hbez")
        ret.certificate_authority_crt = "changed.crt"
        self.assertTrue(self.conn.profile.security.ca_profile.update(ret))
        self.assertTrue(
            self.conn.profile.security.ca_profile.update(
                certificate_authority_crt='changed.crt', name='hbez'))

    def test_delete_caprofile(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.conn.profile.security.ca_profile.delete("hbez")
        self.assertEqual(self.mock_request().mock_calls[2][0], 'delete')

    def test_add_local_certificate(self):
        local_cert_schema = LocalCertificateSchema(client_crt='abc.crt',
                                                   client_key='pqr.key',
                                                   name='hbez')
        self.assertTrue(
            self.conn.settings.security.local_certificate.add(
                local_cert_schema))
        self.assertTrue(
            self.conn.settings.security.local_certificate.add(
                client_crt='abc.crt', client_key='pqr.key', name='hbez'))

    def test_get_local_certificate(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.profile.security.local_certificate.get()
        self.assertEqual(ret[0].client_crt, "test.crt")
        ret = self.conn.profile.security.local_certificate.get("hbez")
        self.assertEqual(ret.client_crt, "test.crt")

    def test_update_local_certificate(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.profile.security.local_certificate.get("hbez")
        ret.client_crt = "changed.crt"
        self.assertTrue(
            self.conn.profile.security.local_certificate.update(ret))
        self.assertTrue(
            self.conn.profile.security.local_certificate.update(
                client_crt='changed.crt', client_key='pqr.key', name='hbez'))

    def test_delete_local_certificate(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.conn.profile.security.local_certificate.delete("hbez")
        self.assertEqual(self.mock_request().mock_calls[2][0], 'delete')

    def test_add_ssh_key_profile(self):
        ssh_key_prof_schema = SshKeyProfileSchema(
            name='hbez',
            ssh_private_key_file='abc.crt',
            ssh_private_key_passphrase='%$#@#')
        self.assertTrue(
            self.conn.settings.security.ssh_key_profile.add(
                ssh_key_prof_schema))
        self.assertTrue(
            self.conn.settings.security.ssh_key_profile.add(
                name='hbez',
                ssh_private_key_file='abc.crt',
                ssh_private_key_passphrase='%$#@#'))

    def test_get_ssh_key_profile(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.profile.security.ssh_key_profile.get()
        self.assertEqual(ret[0].ssh_private_key_file, "test.key")
        ret = self.conn.profile.security.ssh_key_profile.get("hbez")
        self.assertEqual(ret.ssh_private_key_file, "test.key")

    def test_update_ssh_key_profile(self):
        self.mock_request().get.side_effect = self._mock_manager
        ret = self.conn.profile.security.ssh_key_profile.get("hbez")
        ret.ssh_private_key_file = "changed.crt"
        self.assertTrue(self.conn.profile.security.ssh_key_profile.update(ret))
        self.assertTrue(
            self.conn.profile.security.ssh_key_profile.update(
                name='hbez',
                ssh_private_key_file='changed.crt',
                ssh_private_key_passphrase='%$#@#'))

    def test_delete_ssh_key_profile(self):
        self.mock_request().get.side_effect = self._mock_manager
        self.conn.profile.security.ssh_key_profile.delete("hbez")
        self.assertEqual(self.mock_request().mock_calls[2][0], 'delete')

    def _mock_manager(self, *args):
        class MockResponse(Response):
            def __init__(self, json_data, status_code):
                self.json_data = json_data
                self.status_code = status_code

            @property
            def text(self):
                return 'did you just hit an error'

            def json(self):
                return self.json_data

            def to_dict(self):
                return self.json_data

            def raise_for_status(self):
                return None

        if args[0] == 'https://1.1.1.1:8080/api/v1/profile/security/ca-profiles/?working=true':
            return MockResponse(
                {
                    "ca-profile": [{
                        "certificate-authority-crt": "test.crt",
                        "name": "hbez"
                    }]
                }, 200)
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/profile/security/ca-profile/hbez/?working=true':
            return MockResponse(
                {
                    "certificate-authority-crt": "test.crt",
                    "name": "hbez"
                }, 200)
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/profile/security/local-certificates/?working=true':
            return MockResponse(
                {
                    "local-certificate": [{
                        "client-crt": "test.crt",
                        "client-key": "test.key",
                        "name": "hbez"
                    }]
                }, 200)
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/profile/security/local-certificate/hbez/?working=true':
            return MockResponse(
                {
                    "client-crt": "test.crt",
                    "client-key": "test.key",
                    "name": "hbez"
                }, 200)
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/profile/security/ssh-key-profiles/?working=true':
            return MockResponse(
                {
                    "ssh-key-profile": [{
                        "name":
                        "hbez",
                        "ssh-private-key-file":
                        "test.key",
                        "ssh-private-key-passphrase":
                        "$9$AQhzt1heK87dsWLZUiHmP1RE"
                    }]
                }, 200)
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/profile/security/ssh-key-profile/hbez/?working=true':
            return MockResponse(
                {
                    "name": "hbez",
                    "ssh-private-key-file": "test.key",
                    "ssh-private-key-passphrase": "$9$AQhzt1heK87dsWLZUiHmP1RE"
                }, 200)
        elif args[
                0] == 'https://1.1.1.1:8080/api/v1/notification/error/?working=true':
            obj = MockResponse(None, 404)

            def fn():
                raise ValueError

            obj.raise_for_status = fn
            return obj
        return MockResponse(None, 404)