class Syskit::RobyApp::RESTDeploymentManager

Management of the deployments for the REST API

Public Class Methods

new(conf) click to toggle source
# 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() click to toggle source

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
command_line(id, tracing: false, name_service_ip: 'localhost', working_directory: @conf.app.log_dir, loader: @conf.app.default_pkgconfig_loader) click to toggle source

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
created_here?(deployment) click to toggle source

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
deregister_deployment(id) click to toggle source

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
deregister_override(id) click to toggle source

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
each_overriden_deployment(&block) click to toggle source

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
find_new_deployment_by_id(id) click to toggle source

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
find_overriden_deployment_by_id(id) click to toggle source

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
find_registered_deployment_by_id(id) click to toggle source

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
make_unmanaged(id) click to toggle source

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
orogen_deployment?(deployment) click to toggle source

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
overriden?(id) click to toggle source

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
use_deployment(*names, **run_options) click to toggle source

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
used_in_override?(deployment) click to toggle source

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