def create_worker(self, player_id): pod = Pod( self.api, { 'kind': 'Pod', 'apiVersion': 'v1', 'metadata': { 'generateName': "aimmo-%s-worker-%s-" % (self.game_id, player_id), 'labels': { 'app': 'aimmo-game-worker', 'game': self.game_id, 'player': str(player_id), }, }, 'spec': { 'containers': [ { 'env': [ { 'name': 'DATA_URL', 'value': "%s/player/%d" % (self.game_url, player_id), }, ], 'name': 'aimmo-game-worker', 'image': 'ocadotechnology/aimmo-game-worker:%s' % os.environ.get('IMAGE_SUFFIX', 'latest'), 'ports': [{ 'containerPort': 5000, 'protocol': 'TCP' }], 'resources': { 'limits': { 'cpu': '10m', 'memory': '64Mi', }, }, }, ], }, }) pod.create() iterations = 0 while pod.obj['status']['phase'] == 'Pending': if iterations > 30: raise EnvironmentError( 'Could not start worker %s, details %s' % (player_id, pod.obj)) LOGGER.debug('Waiting for worker %s', player_id) time.sleep(5) pod.reload() iterations += 1 worker_url = "http://%s:5000" % pod.obj['status']['podIP'] LOGGER.info("Worker started for %s, listening at %s", player_id, worker_url) return worker_url
def run_item(self, item_name) -> dict: """ run_item Execute an item job Pod with the spec details from the appropriate OaatType object. """ # TODO: check oaatType spec = self.oaattype.podspec() contspec = spec['container'] del spec['container'] contspec.setdefault('env', []).append({ 'name': 'OAAT_ITEM', 'value': item_name }) for idx in range(len(contspec.get('command', []))): contspec['command'][idx] = (contspec['command'][idx].replace( '%%oaat_item%%', item_name)) for idx in range(len(contspec.get('args', []))): contspec['args'][idx] = (contspec['args'][idx].replace( '%%oaat_item%%', item_name)) for env in contspec['env']: env['value'] = (env.get('value', '').replace('%%oaat_item%%', item_name)) # TODO: currently only supports a single container. Do we want # multi-container? doc = { 'apiVersion': 'v1', 'kind': 'Pod', 'metadata': { 'generateName': self.name + '-' + item_name + '-', 'labels': { 'parent-name': self.name, 'oaat-name': item_name, 'app': 'oaat-operator' } }, 'spec': { 'containers': [contspec], **spec, 'restartPolicy': 'Never' }, } kopf.adopt(doc) pod = Pod(self.api, doc) try: pod.create() except pykube.exceptions.KubernetesError as exc: self.items.mark_failed(item_name) raise ProcessingComplete( error=f'could not create pod {doc}: {exc}', message=f'error creating pod for {item_name}') return pod
def create_worker(self, player_id): pod = Pod( self.api, { 'kind': 'Pod', 'apiVersion': 'v1', 'metadata': { 'generateName': "aimmo-%s-worker-%s-" % (self.game_name, player_id), 'labels': { 'app': 'aimmo-game-worker', 'game': self.game_name, 'player': str(player_id), }, }, 'spec': { 'containers': [ { 'env': [ { 'name': 'DATA_URL', 'value': "%s/player/%d" % (self.game_url, player_id), }, ], 'name': 'aimmo-game-worker', 'image': 'ocadotechnology/aimmo-game-worker:%s' % os.environ.get('IMAGE_SUFFIX', 'latest'), 'ports': [ { 'containerPort': 5000, 'protocol': 'TCP' } ], 'resources': { 'limits': { 'cpu': '10m', 'memory': '64Mi', }, }, }, ], }, } ) pod.create() iterations = 0 while pod.obj['status']['phase'] == 'Pending': if iterations > 30: raise EnvironmentError('Could not start worker %s, details %s' % (player_id, pod.obj)) LOGGER.debug('Waiting for worker %s', player_id) time.sleep(5) pod.reload() iterations += 1 worker_url = "http://%s:5000" % pod.obj['status']['podIP'] LOGGER.info("Worker started for %s, listening at %s", player_id, worker_url) return worker_url
def create_worker(self, player_id): pod = Pod( self.api, { 'kind': 'Pod', 'apiVersion': 'v1', 'metadata': { 'generateName': "aimmo-%s-worker-%s-" % (self.game_name, player_id), 'labels': { 'app': 'aimmo-game-worker', 'game': self.game_name, 'player': str(player_id), }, }, 'spec': { 'containers': [ { 'env': [ { 'name': 'DATA_URL', 'value': "%s/player/%d" % (self.game_url, player_id), }, ], 'name': 'aimmo-game-worker', 'image': 'ocadotechnology/aimmo-game-worker:%s' % os.environ.get('IMAGE_SUFFIX', 'latest'), 'ports': [{ 'containerPort': 5000, 'protocol': 'TCP' }], 'resources': { 'limits': { 'cpu': '10m', 'memory': '64Mi', }, }, }, ], }, }) pod.create() time.sleep(20) pod.reload() worker_url = "http://%s:5000" % pod.obj['status']['podIP'] LOGGER.info("Worker started for %s, listening at %s", player_id, worker_url) return worker_url
def create_worker(self, player_id): pod = Pod( self.api, { 'kind': 'Pod', 'apiVersion': 'v1', 'metadata': { 'generateName': "aimmo-%s-worker-%s-" % (self.game_name, player_id), 'labels': { 'app': 'aimmo-game-worker', 'game': self.game_name, 'player': str(player_id), }, }, 'spec': { 'containers': [ { 'env': [ { 'name': 'DATA_URL', 'value': "%s/player/%d" % (self.game_url, player_id), }, ], 'name': 'aimmo-game-worker', 'image': 'ocadotechnology/aimmo-game-worker:latest', 'ports': [ { 'containerPort': 5000, 'protocol': 'TCP' } ], 'resources': { 'limits': { 'cpu': '10m', 'memory': '64Mi', }, }, }, ], }, } ) pod.create() time.sleep(20) pod.reload() worker_url = "http://%s:5000" % pod.obj['status']['podIP'] LOGGER.info("Worker started for %s, listening at %s", player_id, worker_url) return worker_url