Skip to content

Commit

Permalink
Merge pull request #72 from /issues/67
Browse files Browse the repository at this point in the history
More consistent handling of apps, orgas and addons ids / names
  • Loading branch information
divarvel committed Jun 13, 2016
2 parents 82bf6cc + 18915fb commit 5bec0ec
Show file tree
Hide file tree
Showing 10 changed files with 258 additions and 138 deletions.
76 changes: 23 additions & 53 deletions bin/clever.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,54 +77,23 @@ var open = lazyRequiref("../src/commands/open.js");
var makeDefault = lazyRequiref("../src/commands/makeDefault.js");

var Application = lr("../src/models/application.js");
var Parsers = require("../src/parsers.js");

function run() {

// ARGUMENTS
var appNameArgument = cliparse.argument("app-name", { description: "Application name" });
var appIdArgument = cliparse.argument("app-id", { description: "Application ID (or name, if unambiguous)" });
var appNameCreationArgument = cliparse.argument("app-name", { description: "Application name" });
var appIdOrNameArgument = cliparse.argument("app-id", { description: "Application ID (or name, if unambiguous)", parser: Parsers.appIdOrName });
var aliasArgument = cliparse.argument("app-alias", { description: "Application alias" });
var envVariableName = cliparse.argument("variable-name", { description: "Name of the environment variable" });
var envVariableValue = cliparse.argument("variable-value", { description: "Value of the environment variable" });
var fqdnArgument = cliparse.argument("fqdn", { description: "Domain name of the Clever Cloud application" });
var addonIdArgument = cliparse.argument("addon-id", { description: "Addon ID" });
var addonIdOrNameArgument = cliparse.argument("addon-id", { description: "Addon ID (or name, if unambiguous)", parser: Parsers.addonIdOrName });
var addonNameArgument = cliparse.argument("addon-name", { description: "Addon name" });
var addonProviderArgument = cliparse.argument("addon-provider", { description: "Addon provider" });

//PARSERS
var flavorParser = function(flavor) {
var flavors = Application("listAvailableFlavors")();

if(flavors.indexOf(flavor) == -1) {
return cliparse.parsers.error("Invalid value: " + flavor);
} else {
return cliparse.parsers.success(flavor);
}
};

var instancesParser = function(instances) {
var parsedInstances = parseInt(instances, 10);
if (isNaN(parsedInstances)) {
return cliparse.parsers.error("Invalid number: " + instances);
} else {
if (parsedInstances < 1 || parsedInstances > 20) {
return cliparse.parsers.error("The number of instances must be between 1 and 20");
} else {
return cliparse.parsers.success(parsedInstances);
}
}
};

var dateParser = function(dateString) {
var date = new Date(dateString);
if(isNaN(date.getTime())) {
return cliparse.parsers.error("Invalid date: " + dateString + " (timestamps or IS0 8601 dates are accepted)")
} else {
return cliparse.parsers.success(date);
}
}

// OPTIONS
var orgaOption = cliparse.option("orga", { aliases: ["o"], description: "Organisation ID" });
var orgaIdOrNameOption = cliparse.option("org", { aliases: ["o"], description: "Organisation ID (or name, if unambiguous)", parser: Parsers.orgaIdOrName });
var aliasCreationOption = cliparse.option("alias", {
aliases: ["a"],
metavar: "alias",
Expand Down Expand Up @@ -186,55 +155,55 @@ function run() {
var onlyAliasesOption = cliparse.flag("only-aliases", { aliases: [], description: "List only application aliases" });
var minFlavorOption = cliparse.option("min-flavor", {
metavar: "minflavor",
parser: flavorParser,
parser: Parsers.flavor,
description: "The minimum scale for your application",
complete: function() {return cliparse.autocomplete.words(Application("listAvailableFlavors")())}
});
var maxFlavorOption = cliparse.option("max-flavor", {
metavar: "maxflavor",
parser: flavorParser,
parser: Parsers.flavor,
description: "The maximum scale for your application",
complete: function() {return cliparse.autocomplete.words(Application("listAvailableFlavors")())}
});
var flavorOption = cliparse.option("flavor", {
metavar: "flavor",
parser: flavorParser,
parser: Parsers.flavor,
description: "The scale of your application",
complete: function() {return cliparse.autocomplete.words(Application("listAvailableFlavors")())}
});
var minInstancesOption = cliparse.option("min-instances", {
metavar: "mininstances",
parser: instancesParser,
parser: Parsers.instances,
description: "The minimum number of parallels instances"
});
var maxInstancesOption = cliparse.option("max-instances", {
metavar: "maxinstances",
parser: instancesParser,
parser: Parsers.instances,
description: "The maximum number of parallels instances"
});
var instancesOption = cliparse.option("instances", {
metavar: "instances",
parser: instancesParser,
parser: Parsers.instances,
description: "The number of parallels instances"
});
var beforeOption = cliparse.option("before", {
metavar: "before",
parser: dateParser,
parser: Parsers.date,
description: "Fetch logs before this date"
});
var afterOption = cliparse.option("after", {
metavar: "after",
parser: dateParser,
parser: Parsers.date,
description: "Fetch logs after this date"
});

// CREATE COMMAND
var appCreateCommand = cliparse.command("create", {
description: "Create a Clever Cloud application",
args: [appNameArgument],
args: [appNameCreationArgument],
options: [
instanceTypeOption,
orgaOption,
orgaIdOrNameOption,
aliasCreationOption,
regionOption,
githubOption
Expand All @@ -244,9 +213,10 @@ function run() {
// LINK COMMAND
var appLinkCommand = cliparse.command("link", {
description: "Link this repo to an existing Clever Cloud application",
args: [appIdArgument],
args: [appIdOrNameArgument],
options: [
aliasCreationOption
aliasCreationOption,
orgaIdOrNameOption
]
}, link);

Expand Down Expand Up @@ -406,14 +376,14 @@ function run() {
var addonLinkCommand = cliparse.command("link", {
description: "Link an existing addon to this application",
args: [
addonIdArgument
addonIdOrNameArgument,
]
}, addon("link"));

var addonUnlinkCommand = cliparse.command("unlink", {
description: "Unlink an addon from this application",
args: [
addonIdArgument
addonIdOrNameArgument
]
}, addon("unlink"));

Expand All @@ -423,14 +393,14 @@ function run() {
confirmAddonDeletionOption,
],
args: [
addonIdArgument
addonIdOrNameArgument
]
}, addon("delete"));

var addonRenameCommand = cliparse.command("rename", {
description: "Rename an addon",
args: [
addonIdArgument,
addonIdOrNameArgument,
addonNameArgument
]
}, addon("rename"));
Expand Down
32 changes: 32 additions & 0 deletions spec/parsers.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
var _ = require("lodash");
var Bacon = require("baconjs");
var expect = require('chai').expect;

var Parsers = require('../src/parsers.js');

describe("parsers", function() {

it("should parse dates", function() {
expect(Parsers.date(1465842774000).success.getTime()).to.equal(new Date(1465842774000).getTime());
expect(Parsers.date("2016-01-01T00:00:00+02:00").success.getTime()).to.equal(new Date("2016-01-01T00:00:00+02:00").getTime());
expect(Parsers.date("yolo").success).to.equal(undefined);
});
it("should parse appIds", function() {
expect(Parsers.appIdOrName("app_65b3b15d-3a35-4369-ab8f-28b0293e7b69").success).to.deep.equal({ app_id: "app_65b3b15d-3a35-4369-ab8f-28b0293e7b69" });
});
it("should parse app names", function() {
expect(Parsers.appIdOrName("My great app").success).to.deep.equal({ app_name: "My great app" });
});
it("should parse orgaIds", function() {
expect(Parsers.orgaIdOrName("orga_65b3b15d-3a35-4369-ab8f-28b0293e7b69").success).to.deep.equal({ orga_id: "orga_65b3b15d-3a35-4369-ab8f-28b0293e7b69" });
});
it("should parse orga names", function() {
expect(Parsers.orgaIdOrName("My great organisation").success).to.deep.equal({ orga_name: "My great organisation" });
});
it("should parse addonIds", function() {
expect(Parsers.addonIdOrName("addon_65b3b15d-3a35-4369-ab8f-28b0293e7b69").success).to.deep.equal({ addon_id: "addon_65b3b15d-3a35-4369-ab8f-28b0293e7b69" });
});
it("should parse addon names", function() {
expect(Parsers.addonIdOrName("My great addon").success).to.deep.equal({ addon_name: "My great addon" });
});
});
24 changes: 12 additions & 12 deletions src/commands/addon.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,67 +65,67 @@ var create = addon.create = function(api, params) {

var link = addon.link = function(api, params) {
var alias = params.options.alias;
var addonId = params.args[0];
var addonIdOrName = params.args[0];

var s_appData = AppConfig.getAppData(alias);

var s_result = s_appData.flatMap(function(appData) {
return Addon.link(api, appData.app_id, appData.org_id, addonId);
return Addon.link(api, appData.app_id, appData.org_id, addonIdOrName);
});

s_result.onValue(function() {
Logger.println("Addon " + addonId + " sucessfully linked");
Logger.println("Addon " + (addonIdOrName.addon_id || addonIdOrName.addon_name) + " sucessfully linked");
});
s_result.onError(Logger.error);
};

var unlink = addon.unlink = function(api, params) {
var alias = params.options.alias;
var addonId = params.args[0];
var addonIdOrName = params.args[0];

var s_appData = AppConfig.getAppData(alias);

var s_result = s_appData.flatMap(function(appData) {
return Addon.unlink(api, appData.app_id, appData.org_id, addonId);
return Addon.unlink(api, appData.app_id, appData.org_id, addonIdOrName);
});

s_result.onValue(function() {
Logger.println("Addon " + addonId + " sucessfully unlinked");
Logger.println("Addon " + (addonIdOrName.addon_id || addonIdOrName.addon_name) + " sucessfully unlinked");
});
s_result.onError(Logger.error);
};

var adelete = addon.delete = function(api, params) {
var alias = params.options.alias;
var skipConfirmation = params.options.yes;
var addonId = params.args[0];
var addonIdOrName = params.args[0];

var s_appData = AppConfig.getAppData(alias);


var s_result = s_appData.flatMap(function(appData) {
return Addon.delete(api, appData.org_id, addonId, skipConfirmation);
return Addon.delete(api, appData.org_id, addonIdOrName, skipConfirmation);
});

s_result.onValue(function() {
Logger.println("Addon " + addonId + " sucessfully deleted");
Logger.println("Addon " + (addonIdOrName.addon_id || addonIdOrName.addon_name) + " sucessfully deleted");
});
s_result.onError(Logger.error);
};

var rename = addon.rename = function(api, params) {
var alias = params.options.alias;
var addonId = params.args[0];
var addonIdOrName = params.args[0];
var newName = params.args[1];

var s_appData = AppConfig.getAppData(alias);

var s_result = s_appData.flatMap(function(appData) {
return Addon.rename(api, appData.org_id, addonId, newName);
return Addon.rename(api, appData.org_id, addonIdOrName, newName);
});

s_result.onValue(function() {
Logger.println("Addon " + addonId + " sucessfully renamed to " + newName);
Logger.println("Addon " + (addonIdOrName.addon_id || addonIdOrName.addon_name) + " sucessfully renamed to " + newName);
});
s_result.onError(Logger.error);
};
Expand Down
6 changes: 3 additions & 3 deletions src/commands/create.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ var Git = require("../models/git.js")(path.resolve("."));

var create = module.exports = function(api, params) {
var name = params.args[0];
var orga = params.options.orga;
var orgaIdOrName = params.options.org;
var alias = params.options.alias;
var region = params.options.region;
var github;
Expand All @@ -26,10 +26,10 @@ var create = module.exports = function(api, params) {

var s_app = s_type
.flatMapLatest(function(type) {
return Application.create(api, name, type, region, orga, github);
return Application.create(api, name, type, region, orgaIdOrName, github);
})
.flatMapLatest(function(app) {
return Application.linkRepo(api, app.id, alias);
return Application.linkRepo(api, { app_id: app.id }, null, alias);
});

s_app.onValue(function(app) {
Expand Down
9 changes: 7 additions & 2 deletions src/commands/link.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@ var Application = require("../models/application.js");
var Git = require("../models/git.js")(path.resolve("."));

var link = module.exports = function(api, params) {
var appId = params.args[0];
var appIdOrName = params.args[0];
var orgaIdOrName = params.options.org;
var alias = params.options.alias;

var s_app = Application.linkRepo(api, appId, alias);
if(appIdOrName.app_id && orgaIdOrName) {
Logger.warn("You've specified a unique application ID, organisation option will be ignored");
}

var s_app = Application.linkRepo(api, appIdOrName, orgaIdOrName, alias);

s_app.onValue(function(app) {
Logger.println("Your application has been successfully linked!");
Expand Down
Loading

0 comments on commit 5bec0ec

Please sign in to comment.