def setup_metadata_controller(): """ Pulls in a local bundle or via charmstore api and sets up our controller. You can also further customize the bundle by providing a local bundle-custom.yaml that will be deep merged over whatever bundle is referenced. """ spell_dir = Path(app.config['spell-dir']) bundle_filename = spell_dir / 'bundle.yaml' bundle_custom_filename = spell_dir / 'bundle-custom.yaml' if bundle_filename.exists(): # Load bundle data early so we can merge any additional charm options bundle_data = yaml.load(bundle_filename.read_text()) else: bundle_name = app.config['metadata'].get('bundle-name', None) if bundle_name is None: raise Exception( "Could not determine a bundle to download, please make sure " "the spell contains a 'bundle-name' field.") bundle_channel = app.argv.channel app.log.debug("Pulling bundle for {} from channel: {}".format( bundle_name, bundle_channel)) bundle_data = charm.get_bundle(bundle_name, bundle_channel) if bundle_custom_filename.exists(): bundle_custom = yaml.load(slurp(bundle_custom_filename)) bundle_data = merge_dicts(bundle_data, bundle_custom) bundle = Bundle(bundle_data=bundle_data) app.metadata_controller = MetadataController(bundle, Config('bundle-cfg'))
def setup_metadata_controller(): bundle_filename = os.path.join(app.config['spell-dir'], 'bundle.yaml') if not os.path.isfile(bundle_filename): if 'bundle-location' not in app.config['metadata']: raise Exception( "Could not determine bundle location: no local bundle " "was found and bundle-location not set in spell metadata.") bundle_filename = charm.get_bundle( app.config['metadata']['bundle-location'], True) # Load bundle data early so we can merge any additional charm options with open(bundle_filename) as f: bundle_data = yaml.load(f) bundle_custom_filename = os.path.join(app.config['spell-dir'], 'bundle-custom.yaml') if os.path.isfile(bundle_custom_filename): with open(bundle_custom_filename) as f: bundle_custom = yaml.load(f) bundle_data = merge_dicts(bundle_data, bundle_custom) bundle = Bundle(bundle_data=bundle_data) bundleplacer_cfg = Config('bundle-placer', { 'bundle_filename': bundle_filename, 'bundle_key': None, }) app.metadata_controller = MetadataController(bundle, bundleplacer_cfg)
def setup_metadata_controller(): """ Pulls in a local bundle or via charmstore api and sets up our controller. You can also further customize the bundle by providing a local bundle-custom.yaml that will be deep merged over whatever bundle is referenced. """ spell_dir = Path(app.config['spell-dir']) bundle_filename = spell_dir / 'bundle.yaml' bundle_custom_filename = spell_dir / 'bundle-custom.yaml' if bundle_filename.exists(): # Load bundle data early so we can merge any additional charm options bundle_data = yaml.load(bundle_filename.read_text()) else: bundle_name = app.config['metadata'].get('bundle-name', None) if bundle_name is None: raise Exception( "Could not determine a bundle to download, please make sure " "the spell contains a 'bundle-name' field." ) bundle_channel = app.argv.channel app.log.debug("Pulling bundle for {} from channel: {}".format( bundle_name, bundle_channel)) bundle_data = charm.get_bundle(bundle_name, bundle_channel) if bundle_custom_filename.exists(): bundle_custom = yaml.load(slurp(bundle_custom_filename)) bundle_data = merge_dicts(bundle_data, bundle_custom) for name in app.selected_addons: addon = app.addons[name] bundle_data = merge_dicts(bundle_data, addon.bundle) steps = list(chain(app.steps, chain.from_iterable(app.addons[addon].steps for addon in app.selected_addons))) for step in steps: if not (step.bundle_add or step.bundle_remove): continue if step.bundle_remove: fragment = yaml.safe_load(step.bundle_remove.read_text()) _normalize_bundle(bundle_data, fragment) bundle_data = subtract_dicts(bundle_data, fragment) if step.bundle_add: fragment = yaml.safe_load(step.bundle_add.read_text()) _normalize_bundle(bundle_data, fragment) bundle_data = merge_dicts(bundle_data, fragment) if app.argv.bundle_remove: fragment = yaml.safe_load(app.argv.bundle_remove.read_text()) _normalize_bundle(bundle_data, fragment) bundle_data = subtract_dicts(bundle_data, fragment) if app.argv.bundle_add: fragment = yaml.safe_load(app.argv.bundle_add.read_text()) _normalize_bundle(bundle_data, fragment) bundle_data = merge_dicts(bundle_data, fragment) bundle = Bundle(bundle_data=bundle_data) app.metadata_controller = MetadataController(bundle, Config('bundle-cfg'))
def setup_metadata_controller(): bundle_filename = os.path.join(app.config['spell-dir'], 'bundle.yaml') bundle = Bundle(filename=bundle_filename) bundleplacer_cfg = Config('bundle-placer', { 'bundle_filename': bundle_filename, 'bundle_key': None, }) app.metadata_controller = MetadataController(bundle, bundleplacer_cfg)
def setup_metadata_controller(): bundle_filename = os.path.join(app.config['spell-dir'], 'bundle.yaml') if not os.path.isfile(bundle_filename): if 'bundle-location' not in app.config['metadata']: raise Exception( "Could not determine bundle location: no local bundle " "was found and bundle-location not set in spell metadata.") bundle_filename = charm.get_bundle( app.config['metadata']['bundle-location'], True) bundle = Bundle(filename=bundle_filename) bundleplacer_cfg = Config('bundle-placer', { 'bundle_filename': bundle_filename, 'bundle_key': None, }) app.metadata_controller = MetadataController(bundle, bundleplacer_cfg)
def render(self): # TODO: demo specific should be changed afterwards if self.provider.name == "maas": DEMO_BUNDLE = os.path.join(Config.share_path(), "data-analytics-with-sql-like.yaml") DEMO_METADATA = os.path.join( Config.share_path(), "data-analytics-with-sql-like-metadata.yaml") bundleplacer_cfg = Config('bundle-placer', { 'bundle_filename': DEMO_BUNDLE, 'metadata_filename': DEMO_METADATA }) placement_controller = PlacementController( config=bundleplacer_cfg, maas_state=FakeMaasState()) mainview = PlacerView(placement_controller, bundleplacer_cfg) self.common['ui'].set_header( title="Bundle Editor: {}".format( self.common['config']['summary']), excerpt="Choose where your services should be " "placed in your available infrastructure") self.common['ui'].set_subheader("Machine Placement") self.common['ui'].set_body(mainview) mainview.update()
def main(): if os.getenv("BUNDLE_EDITOR_TESTING"): test_args = True else: test_args = False opts = parse_options(sys.argv[1:], test_args) config = Config('bundle-placer', opts.__dict__) config.save() setup_logger(cfg_path=config.cfg_path) log = logging.getLogger('bundleplacer') log.debug(opts.__dict__) log.info("Editing file: {}".format(opts.bundle_filename)) if opts.maas_ip and opts.maas_cred: creds = dict(api_host=opts.maas_ip, api_key=opts.maas_cred) maas, maas_state = connect_to_maas(creds) elif 'fake_maas' in opts and opts.fake_maas: maas = None maas_state = FakeMaasState() else: maas = None maas_state = None try: placement_controller = PlacementController(config=config, maas_state=maas_state) except Exception as e: print("Error: " + e.args[0]) return def cb(): if maas: maas.tag_name(maas.nodes) bw = BundleWriter(placement_controller) if opts.out_filename: outfn = opts.out_filename else: outfn = opts.bundle_filename if os.path.exists(outfn): shutil.copy2(outfn, outfn + '~') bw.write_bundle(outfn) async.shutdown() raise urwid.ExitMainLoop() has_maas = (maas_state is not None) mainview = PlacerView(placement_controller, config, cb, has_maas=has_maas) ui = PlacerUI(mainview) def unhandled_input(key): if key in ['q', 'Q']: async.shutdown() raise urwid.ExitMainLoop() EventLoop.build_loop(ui, STYLES, unhandled_input=unhandled_input) mainview.loop = EventLoop.loop mainview.update() EventLoop.run()