def is_ready_to_terminate(): if not JBox.cfg['cloud_host']['scale_down']: return False num_containers = JBoxContainer.num_active( ) + JBoxContainer.num_stopped() return (num_containers == 0) and CloudHost.can_terminate( is_proposed_cluster_leader())
def publish_anticipated_load(session_name=None): iid = Compute.get_instance_id() if session_name is None: nactive = BaseContainer.num_active(BaseContainer.SFX_INT) else: JBoxSessionProps.attach_instance(Compute.get_install_id(), session_name, iid, "Preparing") nactive = BaseContainer.num_active(BaseContainer.SFX_INT) + 1 cont_load_pct = min(100, max(0, nactive * 100 / SessContainer.MAX_CONTAINERS)) self_load = max(Compute.get_instance_stats(iid, 'Load'), cont_load_pct) Compute.publish_stats("Load", "Percent", self_load) accept = Compute.should_accept_session(is_proposed_cluster_leader()) JBoxInstanceProps.set_props(Compute.get_install_id(), iid, load=self_load, accept=accept)
def get_api_status(): api_status = dict() for c in BaseContainer.api_containers(allcontainers=True): name = c["Names"][0] if (("Names" in c) and (c["Names"] is not None)) else c["Id"][0:12] api_name = APIContainer.get_api_name_from_container_name(name) if api_name is None: continue cnt = api_status.get(api_name, 0) api_status[api_name] = cnt + 1 self_load = Compute.get_instance_stats(Compute.get_instance_id(), 'Load') accept = Compute.should_accept_session(is_proposed_cluster_leader()) return {'load': self_load, 'accept': accept, 'api_status': api_status}
def publish_instance_state(): iid = Compute.get_instance_id() api_status = dict() for c in BaseContainer.api_containers(allcontainers=True): name = c["Names"][0] if (("Names" in c) and (c["Names"] is not None)) else c["Id"][0:12] api_name = APIContainer.get_api_name_from_container_name(name) if api_name is None: continue cnt = api_status.get(api_name, 0) api_status[api_name] = cnt + 1 self_load = Compute.get_instance_stats(iid, 'Load') accept = Compute.should_accept_session(is_proposed_cluster_leader()) JBoxInstanceProps.set_props(Compute.get_install_id(), iid, load=self_load, accept=accept, api_status=api_status)
def is_terminating(): if not JBoxCfg.get('cloud_host.scale_down'): return False num_active = BaseContainer.num_active() terminate = (num_active == 0) and Compute.can_terminate(is_proposed_cluster_leader()) if terminate: JBoxd.log_warn("terminating to scale down") try: Compute.deregister_instance_dns() except: JBoxd.log_error("Error deregistering instance dns") Compute.terminate_instance() return terminate
def try_launch_container(cls, user_id): sessname = unique_sessname(user_id) cont = JBoxContainer.get_by_name(sessname) cls.log_debug("have existing container for %s: %r", sessname, None != cont) if cont is not None: cls.log_debug("container running: %r", cont.is_running()) is_leader = is_proposed_cluster_leader() if ((cont is None) or (not cont.is_running())) and ( not CloudHost.should_accept_session(is_leader)): if cont is not None: cont.async_backup_and_cleanup() return False JBoxContainer.async_launch_by_name(sessname, user_id, True) return True
def try_launch_container(cls, user_id, max_hop=False): sessname = unique_sessname(user_id) cont = JBoxContainer.get_by_name(sessname) cls.log_debug("have existing container for %s: %r", sessname, None != cont) if cont is not None: cls.log_debug("container running: %r", cont.is_running()) if max_hop: self_load = CloudHost.get_instance_stats(CloudHost.instance_id(), 'Load') if self_load < 100: JBoxContainer.async_launch_by_name(sessname, user_id, True) return True is_leader = is_proposed_cluster_leader() if ((cont is None) or (not cont.is_running())) and (not CloudHost.should_accept_session(is_leader)): if cont is not None: cont.async_backup_and_cleanup() return False JBoxContainer.async_launch_by_name(sessname, user_id, True) return True
def is_ready_to_terminate(): if not JBox.cfg['cloud_host']['scale_down']: return False num_containers = JBoxContainer.num_active() + JBoxContainer.num_stopped() return (num_containers == 0) and CloudHost.can_terminate(is_proposed_cluster_leader())