def create_workflow(self, workflow_id, dataflow, is_persist):
        workflow_obj = Workflow(workflow_id, dataflow)

        # Picks out unique component names from all components mentioned in dataflow object
        component_names = list(
            set(
                list(dataflow.keys()) + [
                    component_name for sublist in dataflow.values()
                    for component_name in sublist
                ]))

        # TODO: Verify dataflow - components, converters

        name_to_component = {}
        for component_name in component_names:
            # Skip for dataflow keywords
            if component_name in ["root"]:
                continue

            component = None

            # Reuse component if persist
            if is_persist and component_name in self.persist_name_to_component:
                component = self.persist_name_to_component[component_name]

            # Components that are pre-deployed as persistant
            if component_name in ["mongodb"]:
                component = self.persist_name_to_component[component_name]

            # Deploy component for non-persist case or first time persist
            if component is None:
                component = Component(component_name, is_persist,
                                      self.http_session)

                component.deploy(self.swarm_client)

                if is_persist:
                    self.persist_name_to_component[component_name] = component

            # Add component to map
            name_to_component[component_name] = component

        workflow_obj.name_to_component = name_to_component

        self.workflow_id_to_obj[workflow_id] = workflow_obj
    def __init__(self):
        self.swarm_client = docker.from_env()
        self.http_session = self._create_http_session()
        self.persist_name_to_component = {}
        self.workflow_id_to_obj = {}
        self.request_id_to_component_data = {}

        # Starting mongodb on workflow manager startup
        component = Component("mongodb", True, None)
        component.deploy(self.swarm_client,
                         mounts=[
                             "mongodb_mongo-data-1:/data/db",
                             "mongodb_mongo-config-1:/data/configdb"
                         ])
        self.persist_name_to_component["mongodb"] = component

        mongo_url = "mongodb://10.176.67.87:{port}".format(
            port=component.target_port)
        component.client = MongoClient(mongo_url)