Skip to content

Commit

Permalink
Extract to includes.py.
Browse files Browse the repository at this point in the history
  • Loading branch information
dnephin authored and Daniel Nephin committed Dec 11, 2014
1 parent 52b7ef6 commit 243679d
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 26 deletions.
33 changes: 33 additions & 0 deletions fig/includes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""Include external projects, allowing services to link to a service
defined in an external `fig.yml` file.
"""
import logging

from fig.packages import six
import requests
import yaml


log = logging.getLogger(__name__)


# TODO: test case for different types
def fetch_external_config(fetch_request):
# TODO: format fetch_request
log.info("Fetching config from %s" % (fetch_request,))

def read_config(content):
return yaml.safe_load(content)

if 'url' in fetch_request:
# TODO: error handling of failed requersts
# TODO: parse username, or does requests handle that?
return read_config(requests.get(fetch_request['url']).text)

if 'path' in fetch_request:
# TODO: error handling
with open(fetch_request['path'], 'r') as fh:
return read_config(fh.read())

# TODO: git?
# TODO: raise config error as fallback
31 changes: 5 additions & 26 deletions fig/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import six
import yaml

from fig import includes
from fig.service import Service
from fig.service import ServiceLink
from fig.container import Container
Expand Down Expand Up @@ -47,42 +48,21 @@ def visit(n):
return sorted_services


# TODO: test case for different types
def fetch_external_config(fetch_request):
log.info("Fetching config from %s" % (fetch_request,))

def read_config(content):
return yaml.safe_load(content)

if 'url' in fetch_request:
# TODO: error handling of failed requersts
# TODO: parse username, or does requests handle that?
return read_config(requests.get(fetch_request['url']).text)

if 'path' in fetch_request:
# TODO: error handling
with open(fetch_request['path'], 'r') as fh:
return read_config(fh.read())

# TODO: git?
# TODO: raise config error as fallback


# TODO: this should be a unique set by project location
def get_external_projects(name, config, client):
"""Recursively fetch included projects.
"""

def get_project(name, fetch_request):
config = fetch_external_config(fetch_request)
config = includes.fetch_external_config(fetch_request)
# TODO: verify each service is available as an image
return Project.from_config(name, config, client)

# TODO: verify project uniqueness by name instead of having
# duplicate projects
includes = config.pop('include', {})
conf_includes = config.pop('include', {})
return [get_project(external_name, fetch_request)
for external_name, fetch_request in six.iteritems(includes)]
for external_name, fetch_request in six.iteritems(conf_includes)]


class Project(object):
Expand Down Expand Up @@ -133,6 +113,7 @@ def get_service(self, name):
Retrieve a service by name. Raises NoSuchService
if the named service does not exist.
"""
# TODO: make this nicer
if '_' in name:
project_name, name = name.rsplit('_', 1)
else:
Expand All @@ -143,7 +124,6 @@ def get_service(self, name):
if service.name == name:
return service

# TODO: move into external_projects module
# TODO: test case
for project in self.external_projects:
if project.name == project_name:
Expand Down Expand Up @@ -172,7 +152,6 @@ def get_services(self, service_names=None, include_links=False):
"""

def _add_linked_services(service):
# TODO: why get names when these are already references?
linked_services = service.get_linked_services()
if not linked_services:
return [service]
Expand Down

0 comments on commit 243679d

Please sign in to comment.