Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(plugins): adding halyard commands for plugins #1386

Merged
merged 4 commits into from
Aug 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 127 additions & 0 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,13 @@
* [**hal deploy details**](#hal-deploy-details)
* [**hal deploy diff**](#hal-deploy-diff)
* [**hal deploy rollback**](#hal-deploy-rollback)
* [**hal plugins**](#hal-plugins)
* [**hal plugins add**](#hal-plugins-add)
* [**hal plugins delete**](#hal-plugins-delete)
* [**hal plugins disable**](#hal-plugins-disable)
* [**hal plugins edit**](#hal-plugins-edit)
* [**hal plugins enable**](#hal-plugins-enable)
* [**hal plugins list**](#hal-plugins-list)
* [**hal shutdown**](#hal-shutdown)
* [**hal spin**](#hal-spin)
* [**hal spin install**](#hal-spin-install)
Expand Down Expand Up @@ -586,6 +593,7 @@ hal [parameters] [subcommands]
* `backup`: Backup and restore (remote or local) copies of your halconfig and all required files.
* `config`: Configure, validate, and view your halconfig.
* `deploy`: Manage the deployment of Spinnaker. This includes where it's deployed, what the infrastructure footprint looks like, what the currently running deployment looks like, etc...
* `plugins`: Show Spinnaker's configured plugins.
* `shutdown`: Shutdown the halyard daemon.
* `spin`: Manage the lifecycle of spin CLI.
* `task`: This set of commands exposes utilities of dealing with Halyard's task engine.
Expand Down Expand Up @@ -10461,6 +10469,125 @@ hal deploy rollback [parameters]
* `--service-names`: (*Default*: `[]`) When supplied, only install or update the specified Spinnaker services.


---
## hal plugins

Show Spinnaker's configured plugins.

#### Usage
```
hal plugins [parameters] [subcommands]
```

#### Parameters
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--no-validate`: (*Default*: `false`) Skip validation.

#### Subcommands
* `add`: Add a plugin
* `delete`: Delete a plugin
* `disable`: Enable or disable all plugins
* `edit`: Edit a plugin
* `enable`: Enable or disable all plugins
* `list`: List all plugins

---
## hal plugins add

Add a plugin

#### Usage
```
hal plugins add PLUGIN [parameters]
```

#### Parameters
`PLUGIN`: The name of the plugin to operate on.
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--enabled`: To enable or disable the plugin.
* `--manifest-location`: (*Required*) The location of the plugin's manifest file.
* `--no-validate`: (*Default*: `false`) Skip validation.


---
## hal plugins delete

Delete a plugin

#### Usage
```
hal plugins delete PLUGIN [parameters]
```

#### Parameters
`PLUGIN`: The name of the plugin to operate on.
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--no-validate`: (*Default*: `false`) Skip validation.


---
## hal plugins disable

Enable or disable all plugins

#### Usage
```
hal plugins disable [parameters]
```

#### Parameters
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--no-validate`: (*Default*: `false`) Skip validation.


---
## hal plugins edit

Edit a plugin

#### Usage
```
hal plugins edit PLUGIN [parameters]
```

#### Parameters
`PLUGIN`: The name of the plugin to operate on.
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--enabled`: To enable or disable the plugin.
* `--manifest-location`: The location of the plugin's manifest file.
* `--no-validate`: (*Default*: `false`) Skip validation.


---
## hal plugins enable

Enable or disable all plugins

#### Usage
```
hal plugins enable [parameters]
```

#### Parameters
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--no-validate`: (*Default*: `false`) Skip validation.


---
## hal plugins list

List all plugins

#### Usage
```
hal plugins list [parameters]
```

#### Parameters
* `--deployment`: If supplied, use this Halyard deployment. This will _not_ create a new deployment.
* `--no-validate`: (*Default*: `false`) Skip validation.


---
## hal shutdown

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public HalCommand() {
registerSubcommand(new TaskCommand());
registerSubcommand(new VersionCommand());
registerSubcommand(new SpinCommand());
registerSubcommand(new PluginCommand());
}

static String getVersion() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright 2019 Armory, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.netflix.spinnaker.halyard.cli.command.v1;

import com.beust.jcommander.Parameters;
import com.netflix.spinnaker.halyard.cli.command.v1.config.AbstractConfigCommand;
import com.netflix.spinnaker.halyard.cli.command.v1.plugins.*;
import lombok.AccessLevel;
import lombok.Getter;

@Parameters(separators = "=")
public class PluginCommand extends AbstractConfigCommand {
@Getter(AccessLevel.PUBLIC)
private String commandName = "plugins";

@Getter(AccessLevel.PUBLIC)
private String shortDescription = "Show Spinnaker's configured plugins.";

public PluginCommand() {
registerSubcommand(new AddPluginCommand());
registerSubcommand(new EditPluginCommand());
registerSubcommand(new DeletePluginCommand());
registerSubcommand(new ListPluginsCommand());
registerSubcommand(new PluginEnableDisableCommandBuilder().setEnable(true).build());
registerSubcommand(new PluginEnableDisableCommandBuilder().setEnable(false).build());
}

@Override
protected void executeThis() {
showHelp();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright 2019 Armory, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.netflix.spinnaker.halyard.cli.command.v1.plugins;

import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import com.netflix.spinnaker.halyard.cli.command.v1.config.AbstractConfigCommand;
import com.netflix.spinnaker.halyard.cli.services.v1.Daemon;
import com.netflix.spinnaker.halyard.cli.services.v1.OperationHandler;
import com.netflix.spinnaker.halyard.config.model.v1.plugins.Plugin;
import java.util.ArrayList;
import java.util.List;

/** An abstract definition for commands that accept plugins as a main parameter */
@Parameters(separators = "=")
public abstract class AbstractHasPluginCommand extends AbstractConfigCommand {
@Parameter(description = "The name of the plugin to operate on.", arity = 1)
private List<String> plugins = new ArrayList<>();

@Override
public String getMainParameter() {
return "plugin";
}

public Plugin getPlugin() {
return new OperationHandler<Plugin>()
.setFailureMesssage("Failed to get plugin")
.setOperation(Daemon.getPlugin(getCurrentDeployment(), plugins.get(0), false))
.get();
}

public String getPluginName() {
switch (plugins.size()) {
case 0:
throw new IllegalArgumentException("No plugin supplied");
case 1:
return plugins.get(0);
default:
throw new IllegalArgumentException("More than one plugin supplied");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Copyright 2019 Armory Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.netflix.spinnaker.halyard.cli.command.v1.plugins;

import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import com.netflix.spinnaker.halyard.cli.services.v1.Daemon;
import com.netflix.spinnaker.halyard.cli.services.v1.OperationHandler;
import com.netflix.spinnaker.halyard.config.model.v1.plugins.Plugin;
import lombok.AccessLevel;
import lombok.Getter;

@Parameters(separators = "=")
public class AddPluginCommand extends AbstractHasPluginCommand {
@Getter(AccessLevel.PUBLIC)
private String commandName = "add";

@Getter(AccessLevel.PUBLIC)
private String shortDescription = "Add a plugin";

@Parameter(
names = "--manifest-location",
description = "The location of the plugin's manifest file.",
required = true)
private String manifestLocation;

@Parameter(names = "--enabled", description = "To enable or disable the plugin.")
private String enabled;

@Override
protected void executeThis() {
String currentDeployment = getCurrentDeployment();
String name = getPluginName();
Plugin plugin =
new Plugin()
.setName(name)
.setEnabled(isSet(enabled) ? Boolean.parseBoolean(enabled) : false)
.setManifestLocation(manifestLocation);

new OperationHandler<Void>()
.setFailureMesssage("Failed to add plugin: " + name + ".")
.setSuccessMessage("Successfully added plugin" + name + ".")
.setOperation(Daemon.addPlugin(currentDeployment, !noValidate, plugin))
.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright 2019 Armory, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.netflix.spinnaker.halyard.cli.command.v1.plugins;

import com.beust.jcommander.Parameters;
import com.netflix.spinnaker.halyard.cli.services.v1.Daemon;
import com.netflix.spinnaker.halyard.cli.services.v1.OperationHandler;
import com.netflix.spinnaker.halyard.config.model.v1.plugins.Plugin;
import lombok.AccessLevel;
import lombok.Getter;

@Parameters(separators = "=")
public class DeletePluginCommand extends AbstractHasPluginCommand {
@Getter(AccessLevel.PUBLIC)
private String commandName = "delete";

@Getter(AccessLevel.PUBLIC)
private String shortDescription = "Delete a plugin";

@Override
protected void executeThis() {
String currentDeployment = getCurrentDeployment();
Plugin plugin = getPlugin();
String name = plugin.getName();

new OperationHandler<Void>()
.setFailureMesssage("Failed to delete plugin " + name + ".")
.setSuccessMessage("Successfully deleted plugin " + name + ".")
.setOperation(Daemon.deletePlugin(currentDeployment, name, !noValidate))
.get();
}
}
Loading