Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
4bab58c
Added 'upload' command
Jun 21, 2015
f071d22
Changing the command from 'instances' to 'instancedb' for clarity
Jun 28, 2015
25a5ce5
Merge pull request #1 from Molns/master
ahellander Jun 30, 2015
160a899
First commit of the Euca provider
Jul 26, 2015
a67db00
Provider import/export
Jul 27, 2015
a99e51c
Programatic API development
Jul 28, 2015
eefdd0c
Programming API complete
Jul 29, 2015
176d1a4
disable Euca
Jul 29, 2015
2b8e8ef
bug fix
Aug 3, 2015
f0d381d
bug fix
Aug 4, 2015
2a93396
bug fix
Aug 4, 2015
b102e4c
API can set password for controller start
Aug 6, 2015
6298eef
adding questions to the config output
Aug 6, 2015
146b7cf
add question to controller and worker get_config
Aug 10, 2015
330459e
Fixed get_config to use both name and provider_type
Aug 10, 2015
b0630c1
Fixed controller status
Sep 7, 2015
2f876a4
typo
Sep 8, 2015
57babc0
typo
Sep 8, 2015
537c357
Merge branch 'master' of https://github.com/briandrawert/molns into b…
ahellander Sep 9, 2015
b53bf1e
initial function prototypes
Sep 9, 2015
421d992
Fix for #41
Sep 10, 2015
6104f0e
Merge branch 'master' of https://github.com/briandrawert/molns into b…
ahellander Sep 10, 2015
4c286b1
Merge branch 'briandrawert-master'
ahellander Sep 11, 2015
302b08d
Merge branch 'master' of github.com:briandrawert/molns into remote_ex…
Sep 11, 2015
e0f2e48
Exec command data store
Sep 13, 2015
88436f7
Merge pull request #3 from Molns/master
ahellander Sep 15, 2015
9688b24
Remote execution API
Sep 15, 2015
a7e0b60
Access jobs by ID or JobID
Sep 15, 2015
6c33c65
added gillespy, reorganized the install_software list thematically
ahellander Sep 16, 2015
798395f
Update README.md
ahellander Sep 16, 2015
c9dc36a
bug fix, enabled gmsh
ahellander Sep 16, 2015
0a0fa50
Merge branch 'gmsh_and_gillespy' of github.com:ahellander/molns into …
Sep 16, 2015
ae02099
removed the service command
ahellander Sep 17, 2015
abea7d5
Bug fixes and adding ODE solver for GillesPy
Sep 17, 2015
d6bde84
merge
Sep 17, 2015
542c9e4
Use release version of PyURDME
Sep 17, 2015
aa006ee
Merge pull request #5 from briandrawert/gmsh_and_gillespy
ahellander Sep 17, 2015
4492b34
Merge pull request #45 from ahellander/gmsh_and_gillespy
ahellander Sep 19, 2015
959021c
Merge branch 'master' of github.com:briandrawert/molns into remote_ex…
Sep 20, 2015
a356a5c
Fixes for StochSS integration
Sep 21, 2015
dc39579
moved logging
Sep 22, 2015
6ff28ff
Merge branch 'master' of github.com:briandrawert/molns into remote_ex…
Sep 22, 2015
9e6a5de
Addresses #27
Sep 23, 2015
7a42699
update to molns for stability in job execution
Sep 28, 2015
e1bcb73
return JobID
Sep 30, 2015
fd29d43
update for the new molnsutil
Oct 4, 2015
14b0649
use the new molnsutil
Oct 4, 2015
53c53f9
specify the number of CPUs to reserve
Oct 11, 2015
b4fa0cc
More Debug statements
Oct 12, 2015
346aee9
Controller check on exec logs
Oct 13, 2015
58aeb32
job cleanup now will terminate running jobs
Oct 16, 2015
2cf8bc2
Add the ability to set regions
Nov 11, 2015
bedea9f
updated message
Nov 11, 2015
0d44fc3
Fixing installation of ode solver after StocSS 1.7
Apr 22, 2016
c07fefd
add docker provider class skeleton
avtakkar Apr 22, 2016
5186536
fixed merge
Apr 25, 2016
972b25d
add Docker Provider skeleton
avtakkar Apr 27, 2016
5eaff85
add Docker wrapper. work in progress.
avtakkar May 13, 2016
444e5e3
successfully build container
avtakkar May 19, 2016
1b737f5
bug fixes, complete Docker provider
avtakkar May 20, 2016
cc434db
tidy up docker provider
avtakkar May 23, 2016
42de4b5
wip
avtakkar May 24, 2016
e0282cf
fix return status of DockerProvider and some other minor changes
avtakkar Jun 2, 2016
44f452a
add ssh object to providers
avtakkar Jun 3, 2016
284e285
WIP. implement execute_command and connect
avtakkar Jun 3, 2016
b6c4a96
add mock sft to docker provider
avtakkar Jun 5, 2016
11fcc1f
ipython controller starts up
avtakkar Jun 7, 2016
9f2b98c
add volume, set user id in container
avtakkar Jun 8, 2016
73b07a3
initial working version
avtakkar Jun 8, 2016
47988cc
refactor
avtakkar Jun 9, 2016
dc3fa92
Fix userid bug. iPython server starts up now.
avtakkar Sep 27, 2016
76e7b10
Fix typo introduced by PyCharm
avtakkar Sep 29, 2016
fda120b
remove debugging print statements.
avtakkar Sep 29, 2016
2d9e5ee
make warning message clearer
avtakkar Sep 29, 2016
fd2b452
bind host port 8080
avtakkar Oct 4, 2016
6004148
update to latest ode solver
Oct 5, 2016
8daa41d
Fixes to make developing provider types in db not cause failures in o…
Oct 6, 2016
b15d599
Merge branch 'remote_execution' of github.com:briandrawert/molns into…
Oct 6, 2016
c9562aa
refactor'
avtakkar Oct 13, 2016
d61603e
refactor code. enable use of image tags with DockerProvider
avtakkar Oct 13, 2016
dbc4003
map both notebook and web server ports in case of DockerProvider, mod…
avtakkar Oct 14, 2016
29388c9
bug fix if the provider is not defined
Oct 15, 2016
968f145
Removed provider_type from instance obj, for backwards compatability
Oct 15, 2016
6d5e9a6
Merge pull request #1 from briandrawert/docker_provider
aviral26 Oct 16, 2016
1e4a3ae
bug fix
Oct 16, 2016
89159d6
make DockerProvider data available as volume at user provided location
avtakkar Oct 21, 2016
5a052a3
decorate Docker output
avtakkar Oct 25, 2016
083eb23
remove test file
avtakkar Oct 25, 2016
d5248b5
Merge pull request #2 from aviral26/docker_provider
aviral26 Oct 25, 2016
b0d9bc6
ensure sudo mode for docker
avtakkar Nov 9, 2016
b5cde24
correctly incorporate all changes
avtakkar Nov 9, 2016
a9a56af
install molns and cluster_execution
avtakkar Nov 11, 2016
421c483
install paramiko'
avtakkar Nov 11, 2016
fd9a116
Added get command
Nov 11, 2016
504ed83
assume that user is added to docker group
avtakkar Nov 11, 2016
f7fa624
use new test image
avtakkar Nov 12, 2016
04bae20
prepare image with cluster exec
avtakkar Nov 15, 2016
cd1596e
temporarily update molnsutil to latest version in sshDeploy
avtakkar Nov 16, 2016
1e07397
clean up code, use python logging instead of custom logging
avtakkar Nov 23, 2016
6ca26e2
add user friendly message
avtakkar Nov 29, 2016
97f7288
fix to ignore docker providers
Nov 29, 2016
bff44eb
add TODO
avtakkar Nov 29, 2016
84e5c12
fix merge conflicts
avtakkar Dec 1, 2016
d146053
merge briandrawert/master
avtakkar Dec 2, 2016
ae9c251
put_controller, upload_controller, get_controller
avtakkar Dec 2, 2016
f360812
remove type check
avtakkar Dec 2, 2016
4101969
bug fixes
avtakkar Dec 2, 2016
203157f
remove __init__.py
avtakkar Dec 5, 2016
4bc69a4
add __init__
avtakkar Dec 5, 2016
6018104
add dependencies of molns
avtakkar Dec 13, 2016
828afcb
bug fixes'
avtakkar Jan 11, 2017
683d95c
rename Docker to DockerProxy
avtakkar Feb 1, 2017
efd8491
Merge pull request #5 from aviral26/rename_docker
aviral26 Feb 2, 2017
48d7f13
fixes when mounting sshfs
Feb 14, 2017
e7d5564
Merge github.com/aviral26/molns:master
Feb 21, 2017
f2c8376
bug fix
Feb 21, 2017
deb39fb
using an updated gillespy
Feb 28, 2017
209c4d7
Changing name of docker class
Feb 28, 2017
9c18b6c
refactor to remain compatible with updated docker-py
avtakkar Mar 1, 2017
34732f5
Merge pull request #6 from briandrawert/docker_provider2
aviral26 Mar 1, 2017
805b071
install new packages to image
avtakkar Mar 1, 2017
878868b
Merge branch 'develop' into master
aviral26 Mar 1, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
*.pyc
.molns/
molns_install.log
.ec2_creds_molns
.idea/
*.tar.gz
*.tar
notes
qsubscript
/dockerfile_*
\#qsubscript\#
docker_test.py
243 changes: 243 additions & 0 deletions MolnsLib/DockerProvider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
import logging
import os
import tempfile
import time
import DockerProxy
import constants
import installSoftware
from collections import OrderedDict
from DockerSSH import DockerSSH
from constants import Constants
from molns_provider import ProviderBase, ProviderException


def docker_provider_default_key_name():
user = os.environ.get('USER') or 'USER'
return "{0}_molns_docker_sshkey_{1}".format(user, hex(int(time.time())).replace('0x', ''))


class DockerBase(ProviderBase):
""" Base class for Docker. """

SSH_KEY_EXTENSION = ".pem"
PROVIDER_TYPE = 'Docker'

def __init__(self, name, config=None, config_dir=None, **kwargs):
ProviderBase.__init__(self, name, config, config_dir, **kwargs)
self.docker = DockerProxy.DockerProxy()
self.ssh = DockerSSH(self.docker)

def _get_container_status(self, container_id):
self.docker.container_status(container_id)

def start_instance(self, num=1):
""" Start given number of (or 1) containers. """
started_containers = []
for i in range(num):
container_id = self.docker.create_container(self.provider.config["molns_image_name"], name=self.name,
port_bindings={
Constants.DEFAULT_PUBLIC_WEBSERVER_PORT:
('127.0.0.1', self.config['web_server_port']),
Constants.DEFAULT_PRIVATE_NOTEBOOK_PORT:
('127.0.0.1', self.config['notebook_port'])},
working_directory=self.config["working_directory"])
stored_container = self.datastore.get_instance(provider_instance_identifier=container_id,
ip_address=self.docker.get_container_ip_address(container_id)
, provider_id=self.provider.id, controller_id=self.id,
provider_type=constants.Constants.DockerProvider)
started_containers.append(stored_container)
if num == 1:
return started_containers[0]
return started_containers

def resume_instance(self, instances):
instance_ids = []
if isinstance(instances, list):
for instance in instances:
instance_ids.append(instance.provider_instance_identifier)
else:
instance_ids.append(instances.provider_instance_identifier)
self.docker.start_containers(instance_ids)

def stop_instance(self, instances):
instance_ids = []
if isinstance(instances, list):
for instance in instances:
instance_ids.append(instance.provider_instance_identifier)
else:
instance_ids.append(instances.provider_instance_identifier)
self.docker.stop_containers(instance_ids)

def terminate_instance(self, instances):
instance_ids = []
if isinstance(instances, list):
for instance in instances:
instance_ids.append(instance.provider_instance_identifier)
else:
instance_ids.append(instances.provider_instance_identifier)
self.docker.terminate_containers(instance_ids)

def exec_command(self, container_id, command):
self.docker.execute_command(container_id, command)


class DockerProvider(DockerBase):
""" Provider handle for local Docker based service. """

OBJ_NAME = 'DockerProvider'

CONFIG_VARS = OrderedDict([
('ubuntu_image_name',
{'q': 'Base Ubuntu image to use', 'default': constants.Constants.DOCKER_DEFAULT_IMAGE,
'ask': True}),
('molns_image_name',
{'q': 'Local MOLNs image (Docker image ID or image tag) to use ', 'default': None, 'ask': True}),
('key_name',
{'q': 'Docker Key Pair name', 'default': "docker-default", 'ask': False}), # Unused.
('group_name',
{'q': 'Docker Security Group name', 'default': 'molns', 'ask': False}), # Unused.
('login_username',
{'default': 'ubuntu', 'ask': False}), # Unused.
('provider_type',
{'default': constants.Constants.DockerProvider, 'ask': False})
])

def get_config_credentials(self):
return None

@staticmethod
def __get_new_dockerfile_name():
import uuid
filename = constants.Constants.DOCKERFILE_NAME + str(uuid.uuid4())
return filename

def check_ssh_key(self):
""" Returns true. (Implementation does not use SSH.) """
return True

def create_ssh_key(self):
""" Returns true. """
ssh_key_dir = os.path.join(self.config_dir, self.name)
with open(ssh_key_dir, 'w') as fp:
fp.write("This is a dummy key.")
os.chmod(ssh_key_dir, 0o600)

def check_security_group(self):
""" Returns true. (Implementation does not use SSH.) """
return True

def create_seurity_group(self):
""" Returns true. (Implementation does not use SSH.) """
return True

def create_molns_image(self):
""" Create a molns image, save it on localhost and return DockerImage ID of created image. """
file_to_remove = None
try:
dockerfile, file_to_remove = self._create_dockerfile(installSoftware.InstallSW.get_command_list())
image_id = self.docker.build_image(dockerfile)
return image_id
except Exception as e:
logging.exception(e)
raise ProviderException("Failed to create molns image: {0}".format(e))
finally:
if file_to_remove is not None:
os.remove(file_to_remove)

def check_molns_image(self):
""" Check if the molns image exists. """
if 'molns_image_name' in self.config and self.config['molns_image_name'] is not None \
and self.config['molns_image_name'] != '':
return self.docker.image_exists(self.config['molns_image_name'])
return False

def _create_dockerfile(self, commands):
""" Create Dockerfile from given commands. """
import Utils

user_id = Utils.get_sudo_user_id()
dockerfile = '''FROM ubuntu:14.04\nRUN apt-get update\n\n# Add user ubuntu.\nRUN useradd -u {0} -ms /bin/bash ubuntu\n
# Set up base environment.\nRUN apt-get install -yy \ \n software-properties-common \ \n
python-software-properties \ \n wget \ \n curl \ \n git \ \n ipython \ \n sudo \ \n
screen \ \n iptables \nRUN echo "ubuntu ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
\nWORKDIR /home/ubuntu\n\nUSER ubuntu\nENV HOME /home/ubuntu'''.format(user_id)

flag = False

for entry in commands:
if isinstance(entry, list):
dockerfile += '''\n\nRUN '''
first = True
flag = False
for sub_entry in entry:
if first is True:
dockerfile += self._preprocess(sub_entry)
first = False
else:
dockerfile += ''' && \ \n ''' + self._preprocess(sub_entry)
else:
if flag is False:
dockerfile += '''\n\nRUN '''
flag = True
dockerfile += self._preprocess(entry)
else:
dockerfile += ''' && \ \n ''' + self._preprocess(entry)

dockerfile += '''\n\n\n'''

dockerfile_file = DockerProvider.__get_new_dockerfile_name()
with open(dockerfile_file, 'w') as Dockerfile:
Dockerfile.write(dockerfile)
named_dockerfile = tempfile.NamedTemporaryFile()
named_dockerfile.write(dockerfile)
named_dockerfile.seek(0)

return named_dockerfile, dockerfile_file

@staticmethod
def _preprocess(command):
""" Prepends "shell only" commands with '/bin/bash -c'. """
for shell_command in DockerProxy.DockerProxy.shell_commands:
if shell_command in command:
replace_string = "/bin/bash -c \"" + shell_command
command = command.replace(shell_command, replace_string)
command += "\""
return command


def get_default_working_directory(config=None):
if config is None:
raise Exception("Config should not be None.")
return os.path.realpath(os.path.join(config.config_dir, "docker_controller_working_dirs", config.name))


class DockerController(DockerBase):
""" Provider handle for a Docker controller. """

OBJ_NAME = 'DockerController'
CONFIG_VARS = OrderedDict([
('web_server_port',
{'q': 'Port to use for web server', 'default': "8080",
'ask': True}),
('notebook_port',
{'q': 'Port to use for jupyter notebook', 'default': "8081",
'ask': True}),
('working_directory',
{'q': 'Working directory for this controller', 'default': get_default_working_directory, 'ask': True}),
('ssh_key_file',
{'q': 'SSH key to a qsub and docker enabled cluster', 'default': "None", 'ask': True})
])

def get_instance_status(self, instance):
return self.docker.container_status(instance.provider_instance_identifier)


class DockerWorkerGroup(DockerController):
""" Provider handle for Docker worker group. """

OBJ_NAME = 'DockerWorkerGroup'

CONFIG_VARS = OrderedDict([
('num_vms',
{'q': 'Number of containers in group', 'default': '1', 'ask': True}),
])
Loading