class Syskit::RobyApp::RESTDeploymentManager
Management of the deployments for the REST API
Public Class Methods
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 5 def initialize(conf) @conf = conf @new_deployments = Array.new @overrides = Hash.new end
Public Instance Methods
Clear all overrides and new deployments
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 60 def clear @overrides.delete_if do |original, overriden_by| overriden_by.delete_if do |c| @conf.deregister_configured_deployment(c) true end @conf.register_configured_deployment(original) true end @new_deployments.delete_if do |c| @conf.deregister_configured_deployment(c) true end end
Returns the command line needed to start the given deployment with the given spawn options
The returned command line assumes that the Syskit process runs on the machine where it will be executed
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 177 def command_line(id, tracing: false, name_service_ip: 'localhost', working_directory: @conf.app.log_dir, loader: @conf.app.default_pkgconfig_loader) deployment = find_registered_deployment_by_id(id) || find_overriden_deployment_by_id(id) if !deployment raise NotFound, "#{id} is not a known deployment" elsif !orogen_deployment?(deployment) raise NotOrogen, "#{id} is not an oroGen deployment, cannot generate a command line" end deployment.command_line( working_directory: working_directory, tracing: tracing, name_service_ip: name_service_ip, loader: loader) end
Whether this deployment has been created by this manager
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 81 def created_here?(deployment) @new_deployments.include?(deployment) || used_in_override?(deployment) end
Remove a deployment
@return [Boolean] true if the deployment ID was valid, false otherwise
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 126 def deregister_deployment(id) deployment = find_new_deployment_by_id(id) if !deployment if deployment = find_registered_deployment_by_id(id) if used_in_override?(deployment) raise UsedInOverride, "#{id} has been created for the purpose of an override, cannot deregister it" else raise NotCreatedHere, "#{id} has not been registered through the REST API, cannot deregister it" end else raise NotFound, "#{id} is not a known deployment" end end @conf.deregister_configured_deployment(deployment) @new_deployments.delete(deployment) end
Remove overrides created by {#make_unmanaged}
@return [Boolean] true if the deployment ID was valid, false otherwise
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 147 def deregister_override(id) overriden_deployment = @overrides.keys.find { |c| c.object_id == id } if !overriden_deployment deployment = find_registered_deployment_by_id(id) if !deployment raise NotFound, "#{id} is not an existing deployment" else raise NotOverriden, "#{id} is not an overriden deployment, cannot deregister" end end overrides = @overrides[overriden_deployment] overrides.delete_if do |c| @conf.deregister_configured_deployment(c) true end @overrides.delete(overriden_deployment) true end
Enumerate the deployments that are being overriden
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 76 def each_overriden_deployment(&block) @overrides.each_key(&block) end
Finds a newly defined deployment by ID
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 110 def find_new_deployment_by_id(id) @new_deployments.find { |c| c.object_id == id } end
Finds an overriden deployment by ID
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 105 def find_overriden_deployment_by_id(id) @overrides.keys.find { |c| c.object_id == id } end
Finds a registered deployment by ID
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 99 def find_registered_deployment_by_id(id) @conf.each_configured_deployment. find { |c| c.object_id == id } end
Change the configuration so that all tasks from the given deployment are declared as unmanaged
@param [Models::ConfiguredDeployment] configured_deployment @return [Array,nil] the list of the IDs of the newly created
deployments, or nil if the given ID does not match any registered deployment
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 27 def make_unmanaged(id) overrides = [] configured_deployment = find_registered_deployment_by_id(id) if !configured_deployment if overriden?(id) raise AlreadyOverriden, "#{id} is already overriden, cannot override it again" else raise NotFound, "#{id} is not a known deployment" end elsif used_in_override?(configured_deployment) raise UsedInOverride, "#{id} is already used in an override, cannot override it" end @conf.deregister_configured_deployment(configured_deployment) configured_deployment.each_orogen_deployed_task_context_model do |orogen_m| task_m = Syskit::TaskContext.find_model_by_orogen(orogen_m.task_model) overrides.concat(@conf.use_unmanaged_task(task_m => orogen_m.name)) end @overrides[configured_deployment] = overrides overrides.map(&:object_id) rescue Exception => e overrides.each do |c| @conf.deregister_configured_deployment(c) end if configured_deployment @conf.register_configured_deployment(configured_deployment) end raise end
Whether the given deployment is an oroGen deployment
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 168 def orogen_deployment?(deployment) manager = @conf.process_server_config_for(deployment.process_server_name) manager.client.kind_of?(Orocos::RemoteProcesses::Client) end
Whether the given deployment is already overriden
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 87 def overriden?(id) @overrides.keys.any? { |c| c.object_id == id } end
Define a new deployment
@return [Integer] the new deployment ID
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 117 def use_deployment(*names, **run_options) c = @conf.use_deployment(*names, **run_options).first @new_deployments << c c.object_id end
Whether the given deployment is used as override
# File lib/syskit/roby_app/rest_deployment_manager.rb, line 92 def used_in_override?(deployment) @overrides.each_value.any? do |overrides| overrides.include?(deployment) end end