~dpb/pyjuju/dont-proxy-https

« back to all changes in this revision

Viewing changes to juju/control/tests/test_destroy_service.py

Subordinate support in unit agent lifecycle [r=kapil] [f=805585,963355]

This branch lands the support in the unit agent which allows it to deploy 
subordinate services in its own container.

Show diffs side-by-side

added added

removed removed

Lines of Context:
57
57
        yield finished
58
58
        self.assertIn(
59
59
            "Service 'volcano' was not found", self.stderr.getvalue())
 
60
 
 
61
    @inlineCallbacks
 
62
    def test_destroy_subordinate_service(self):
 
63
        log_service = yield self.add_service_from_charm("logging")
 
64
        lu1 = yield log_service.add_unit_state()
 
65
 
 
66
        yield self.add_relation(
 
67
            "juju-info", "container",
 
68
            (self.service_state1, "juju-info", "server"),
 
69
            (log_service, "juju-info", "client"),
 
70
            )
 
71
 
 
72
 
 
73
        finished = self.setup_cli_reactor()
 
74
        topology = yield self.get_topology()
 
75
        service_id = topology.find_service_with_name("logging")
 
76
        self.assertNotEqual(service_id, None)
 
77
 
 
78
        self.setup_exit(0)
 
79
        self.mocker.replay()
 
80
 
 
81
        main(["destroy-service", "logging"])
 
82
        yield finished
 
83
        service_id = topology.find_service_with_name("logging")
 
84
 
 
85
        topology = yield self.get_topology()
 
86
        self.assertTrue(topology.has_service(service_id))
 
87
        exists = yield self.client.exists("/services/%s" % service_id)
 
88
        self.assertTrue(exists)
 
89
        self.assertEquals(
 
90
            "Unsupported attempt to destroy subordinate service 'logging' "
 
91
            "while principal service 'mysql' is related.\n",
 
92
            self.output.getvalue())
 
93
 
 
94
    @inlineCallbacks
 
95
    def test_destroy_principal_with_subordinates(self):
 
96
        log_service = yield self.add_service_from_charm("logging")
 
97
        lu1 = yield log_service.add_unit_state()
 
98
 
 
99
        yield self.add_relation(
 
100
            "juju-info",
 
101
            (self.service_state1, "juju-info", "server"),
 
102
            (log_service, "juju-info", "client"))
 
103
 
 
104
        finished = self.setup_cli_reactor()
 
105
        topology = yield self.get_topology()
 
106
        service_id = topology.find_service_with_name("mysql")
 
107
        logging_id = topology.find_service_with_name("logging")
 
108
 
 
109
        self.assertNotEqual(service_id, None)
 
110
        self.assertNotEqual(logging_id, None)
 
111
 
 
112
        self.setup_exit(0)
 
113
        self.mocker.replay()
 
114
 
 
115
        main(["destroy-service", "mysql"])
 
116
        yield finished
 
117
        service_id = topology.find_service_with_name("mysql")
 
118
 
 
119
        topology = yield self.get_topology()
 
120
        self.assertFalse(topology.has_service(service_id))
 
121
        exists = yield self.client.exists("/services/%s" % service_id)
 
122
        self.assertFalse(exists)
 
123
 
 
124
        # Verify the subordinate state was not removed as well
 
125
        # destroy should allow the destruction of subordinate services
 
126
        # with no relations. This means removing the principal and then
 
127
        # breaking the relation will allow for actual removal from
 
128
        # Zookeeper. see test_destroy_subordinate_without_relations.
 
129
        exists = yield self.client.exists("/services/%s" % logging_id)
 
130
        self.assertTrue(exists)
 
131
 
 
132
        self.assertIn("Service 'mysql' destroyed.", self.output.getvalue())
 
133
 
 
134
    @inlineCallbacks
 
135
    def test_destroy_subordinate_without_relations(self):
 
136
        """Verify we can remove a subordinate w/o relations."""
 
137
        yield self.add_service_from_charm("logging")
 
138
 
 
139
        finished = self.setup_cli_reactor()
 
140
        topology = yield self.get_topology()
 
141
        logging_id = topology.find_service_with_name("logging")
 
142
        self.assertNotEqual(logging_id, None)
 
143
 
 
144
        self.setup_exit(0)
 
145
        self.mocker.replay()
 
146
 
 
147
        main(["destroy-service", "logging"])
 
148
        yield finished
 
149
 
 
150
        topology = yield self.get_topology()
 
151
        self.assertFalse(topology.has_service(logging_id))
 
152
        exists = yield self.client.exists("/services/%s" % logging_id)
 
153
        self.assertFalse(exists)