def test_scheduler_recovery_failure_before_launch(self): scheduler_key = gen_encryption_key() scheduler1 = MysosScheduler( self._state, self._state_provider, self._framework_user, "./executor.pex", "cmd.sh", self._zk_client, self._zk_url, Amount(5, Time.SECONDS), "/etc/mysos/admin_keyfile.yml", scheduler_key) scheduler1.registered(self._driver, self._framework_id, object()) _, password = scheduler1.create_cluster("cluster1", "mysql_user", 3) # Simulate restart before the task is successfully launched. scheduler2 = MysosScheduler( self._state, self._state_provider, self._framework_user, "./executor.pex", "cmd.sh", self._zk_client, self._zk_url, Amount(5, Time.SECONDS), "/etc/mysos/admin_keyfile.yml", scheduler_key) assert len(scheduler2._launchers) == 0 # No launchers are recovered. # Scheduler always receives registered() with the same FrameworkID after failover. scheduler2.registered(self._driver, self._framework_id, object()) assert len(scheduler2._launchers) == 1 assert scheduler2._launchers["cluster1"].cluster_name == "cluster1" password_box = PasswordBox(scheduler_key) assert password_box.match( password, scheduler2._launchers["cluster1"]._cluster.encrypted_password) # Now offer the resources for this task. scheduler2.resourceOffers(self._driver, [self._offer]) # One task is launched for the offer. assert len(scheduler2._launchers["cluster1"]._cluster.active_tasks) == 1 # Scheduler has recovered the cluster so it doesn't accept another of the same name. with pytest.raises(MysosScheduler.ClusterExists): scheduler2.create_cluster("cluster1", "mysql_user", 3)
def test_cluster_state(self): password_box = PasswordBox(gen_encryption_key()) expected = MySQLCluster('cluster1', 'cluster_user', password_box.encrypt('cluster_password'), 3, DEFAULT_TASK_CPUS, DEFAULT_TASK_MEM, DEFAULT_TASK_DISK) expected.tasks['task1'] = MySQLTask('cluster1', 'task1', 'slave1', 'host1', 10000) self._state_provider.dump_cluster_state(expected) actual = self._state_provider.load_cluster_state('cluster1') assert expected.user == actual.user assert isinstance(actual.num_nodes, int) assert expected.num_nodes == actual.num_nodes assert len(expected.tasks) == len(actual.tasks) assert expected.tasks['task1'].port == actual.tasks['task1'].port assert expected.encrypted_password == actual.encrypted_password assert password_box.match('cluster_password', actual.encrypted_password)
def setup(self, request): self._driver = FakeDriver() self._storage = FakeStorage(SequentialThreadingHandler()) self._zk_client = FakeClient(storage=self._storage) self._zk_client.start() self._offer = mesos_pb2.Offer() self._offer.id.value = "offer_id_0" self._offer.framework_id.value = "framework_id_0" self._offer.slave_id.value = "slave_id_0" self._offer.hostname = "localhost" # Enough resources to fit three tasks. resources = create_resources( cpus=DEFAULT_TASK_CPUS * 3, mem=DEFAULT_TASK_MEM * 3, disk=DEFAULT_TASK_DISK * 3, ports=set([10000, 10001, 10002])) self._offer.resources.extend(resources) self._framework_user = "******" # Some tests use the default launcher; some don't. self._zk_url = "zk://host/mysos/test" self._scheduler_key = gen_encryption_key() self._password_box = PasswordBox(self._scheduler_key) self._cluster = MySQLCluster( "cluster0", "user", self._password_box.encrypt("pass"), 3, DEFAULT_TASK_CPUS, DEFAULT_TASK_MEM, DEFAULT_TASK_DISK) # Construct the state provider based on the test parameter. if request.param == LocalStateProvider: tmpdir = tempfile.mkdtemp() self._state_provider = LocalStateProvider(tmpdir) request.addfinalizer(lambda: shutil.rmtree(tmpdir, True)) # Clean up after ourselves. elif request.param == ZooKeeperStateProvider: self._state_provider = ZooKeeperStateProvider(self._zk_client, "/mysos/test") self._launcher = MySQLClusterLauncher( self._driver, self._cluster, self._state_provider, self._zk_url, self._zk_client, self._framework_user, "./executor.pex", "cmd.sh", Amount(5, Time.SECONDS), "/etc/mysos/admin_keyfile.yml", self._scheduler_key, query_interval=Amount(150, Time.MILLISECONDS)) # Short interval. self._elected = threading.Event() self._launchers = [self._launcher] # See teardown(). request.addfinalizer(self.teardown)