horizon/openstack_dashboard/static/app/core/keypairs/actions/import.service.js

149 lines
3.8 KiB
JavaScript

/**
* 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.
*/
(function() {
'use strict';
/**
* @ngdoc overview
* @name horizon.app.core.keypairs.import.service
* @description Service for the key pair import modal
*/
angular
.module('horizon.app.core.keypairs.actions')
.factory('horizon.app.core.keypairs.actions.import.service', importService);
importService.$inject = [
'horizon.app.core.keypairs.basePath',
'horizon.app.core.keypairs.resourceType',
'horizon.app.core.openstack-service-api.nova',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.actions.action-result.service',
'horizon.framework.widgets.form.ModalFormService',
'horizon.framework.widgets.toast.service'
];
function importService(
basePath, resourceType, nova, policy, actionResult, modal, toast
) {
var keypairs = [];
var caption = gettext("Import Public Key");
var invalidMsg = gettext("Key pair already exists.");
// schema
var schema = {
type: "object",
properties: {
"name": {
title: gettext("Key Pair Name"),
type: "string",
pattern: "^[A-Za-z0-9 -]+$"
},
"public_key": {
title: gettext("Public Key"),
type: "string"
}
}
};
// form
var form = [
{
type: "section",
htmlClass: "row",
items: [
{
type: "section",
htmlClass: "col-sm-12",
items: [
{
key: "name",
validationMessage: {
keypairExists: invalidMsg
},
$validators: {
keypairExists: function (name) {
return (keypairs.indexOf(name) === -1);
}
},
required: true
},
{
type: "template",
templateUrl: basePath + "actions/import.public-key.html"
}
]
}
]
}
];
// model
var model;
var service = {
perform: perform,
allowed: allowed
};
return service;
//////////////
function allowed() {
return policy.ifAllowed({ rules: [['compute', 'os_compute_api:os-keypairs:create']] });
}
function perform() {
getKeypairs();
model = {
public_key: ""
};
var config = {
"title": caption,
"submitText": caption,
"schema": schema,
"form": form,
"model": model,
"submitIcon": "upload",
"size": "md",
"helpUrl": basePath + "actions/import.description.html"
};
return modal.open(config).then(submit);
}
function submit(context) {
return nova.createKeypair(context.model).then(success);
}
function success(response) {
var successMsg = gettext('Successfully imported key pair %(name)s.');
toast.add('success', interpolate(successMsg, { name: response.data.name }, true));
var result = actionResult.getActionResult().created(resourceType, response.data.name);
return result.result;
}
function getKeypairs() {
nova.getKeypairs().then(function(response) {
keypairs = response.data.items.map(getName);
});
}
function getName(item) {
return item.keypair.name;
}
}
})();