view launcher/src/main/java/com/redhat/thermostat/launcher/CommonCommandOptions.java @ 636:9e4437930235

Add DB connection service This should improve usability of the Thermostat shell. In particular in a remote setup. The current situation is that if a shell is fired up it does not make a connection to storage. So if a user has storage set up to bind to a "public" IP, 192.1.1.129 say, then mongo requires username/password for connections. This results in bad usability of the shell: ./bin/thermostat shell Thermostat > ping Could not connect to db mongodb://192.168.1.14:27518 (creds are missing or incorrect host IP in user prefs) Thermostat > ping --username blah --password blah -d mongodb://example.org (works) Thermostat > list-vms --username blah --password blah -d ... (i.e. a user needs to pass credential info for every command on the shell). This patch introduces a "connect" and "disconnect" command which establishes a DB connection on demand and registers a DbService. The above shell session becomes: ./bin/thermostat shell Thermostat > ping Could not connect to db mongodb://192.168.1.14:27518 Thermostat > connect -d mongodb://192.168.1.14:27518 -u blah -p blah Thermostat > ping agent-id (works) Thermostat > list-vms (works) Thermostat > disconnect (disconnects from mongo storage at 192.168.1.14:27518) Thermostat > ping Could not connect to db mongodb://192.168.1.14:27518 Details of the patch: ----------------------------------------------------------------- 1. It removes AppContextSetup/AppContextSetupImpl 2. Modifies LauncherImpl in order to use the new DbService (i.e. other use cases remain the same) 3. OSGIUtils now returns the ServiceRegistration for registered services. 4. Added a method which allows services to be null to OSGIUtils. Existing getService() throws a NPE if the service reference is null (bundleContext.getServiceReference(clazz)). 5. Adds ConnectCommand ("connect" on shell) 6. Adds DisconnectCommand ("disconnect" on shell) 7. Tests Reviewed-by: omajid Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-September/003341.html PR1164
author Severin Gehwolf <sgehwolf@redhat.com>
date Fri, 21 Sep 2012 18:17:41 +0200
parents ac3d23577264
children 73c182a706fc
line wrap: on
line source


package com.redhat.thermostat.launcher;

import java.util.ArrayList;
import java.util.Collection;

import com.redhat.thermostat.common.cli.ArgumentSpec;
import com.redhat.thermostat.common.cli.Command;
import com.redhat.thermostat.common.cli.SimpleArgumentSpec;

public class CommonCommandOptions {

    public static final String DB_URL_ARG = "dbUrl";
    public static final String USERNAME_ARG = "username";
    public static final String PASSWORD_ARG = "password";

    public static final String DB_URL_DESC = "the URL of the storage to connect to";
    public static final String USERNAME_DESC = "the username to use for authentication";
    public static final String PASSWORD_DESC = "the password to use for authentication";

    public static final String LOG_LEVEL_ARG = "logLevel";
    private static final String LOG_LEVEL_DESC = "log level";

    public Collection<ArgumentSpec> getAcceptedOptionsFor(Command cmd) {

        Collection<ArgumentSpec> acceptedArguments = cmd.getAcceptedArguments();
        acceptedArguments = new ArrayList<>(acceptedArguments);
        addDbUrlOptionForStorageCommand(cmd, acceptedArguments);
        addLogLevelOption(acceptedArguments);
        addOptionalAuthenticationArguments(acceptedArguments);
        return acceptedArguments;
    }

    private void addDbUrlOptionForStorageCommand(Command cmd, Collection<ArgumentSpec> acceptedArguments) {
        if (cmd.isStorageRequired()) {
            acceptedArguments.add(new SimpleArgumentSpec(DB_URL_ARG, "d", DB_URL_DESC, false, true));
        }
    }

    private void addLogLevelOption(Collection<ArgumentSpec> acceptedArguments) {
        acceptedArguments.add(new SimpleArgumentSpec(LOG_LEVEL_ARG, LOG_LEVEL_DESC, false, true));
    }

    private void addOptionalAuthenticationArguments(Collection<ArgumentSpec> acceptedArguments) {
        acceptedArguments.add(new SimpleArgumentSpec(USERNAME_ARG, USERNAME_DESC, false, true));
        acceptedArguments.add(new SimpleArgumentSpec(PASSWORD_ARG, PASSWORD_DESC, false, true));
    }

}