/** * Submit a topology 1. Instantiate necessary resources 2. Valid whether it is legal to submit a * topology 3. Call LauncherRunner */ public void submitTopology() throws TopologySubmissionException { // 1. Do prepare work // create an instance of state manager String statemgrClass = Context.stateManagerClass(config); IStateManager statemgr; // Create an instance of the launcher class String launcherClass = Context.launcherClass(config); ILauncher launcher; // create an instance of the uploader class String uploaderClass = Context.uploaderClass(config); IUploader uploader; // create an instance of state manager try { statemgr = ReflectionUtils.newInstance(statemgrClass); } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { throw new TopologySubmissionException( String.format("Failed to instantiate state manager class '%s'", statemgrClass), e); } // create an instance of launcher try { launcher = ReflectionUtils.newInstance(launcherClass); } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { throw new LauncherException( String.format("Failed to instantiate launcher class '%s'", launcherClass), e); } // create an instance of uploader try { uploader = ReflectionUtils.newInstance(uploaderClass); } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { throw new UploaderException( String.format("Failed to instantiate uploader class '%s'", uploaderClass), e); } // Put it in a try block so that we can always clean resources try { // initialize the state manager statemgr.initialize(config); // TODO(mfu): timeout should read from config SchedulerStateManagerAdaptor adaptor = new SchedulerStateManagerAdaptor(statemgr, 5000); validateSubmit(adaptor, topology.getName()); // 2. Try to submit topology if valid // invoke method to submit the topology LOG.log(Level.FINE, "Topology {0} to be submitted", topology.getName()); // Firstly, try to upload necessary packages URI packageURI = uploadPackage(uploader); // Secondly, try to submit a topology // build the runtime config Config runtime = Config.newBuilder() .putAll(LauncherUtils.getInstance().getPrimaryRuntime(topology, adaptor)) .put(Keys.topologyPackageUri(), packageURI) .put(Keys.launcherClassInstance(), launcher) .build(); callLauncherRunner(runtime); } catch (LauncherException | PackingException e) { // we undo uploading of topology package only if launcher fails to // launch topology, which will throw LauncherException or PackingException uploader.undo(); throw e; } finally { SysUtils.closeIgnoringExceptions(uploader); SysUtils.closeIgnoringExceptions(launcher); SysUtils.closeIgnoringExceptions(statemgr); } }