1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

F #4089: Dockerhub-tags table for firecracker (#4691)

This commit is contained in:
Sergio Betanzos 2020-05-11 15:46:30 +02:00 committed by GitHub
parent 896dc83238
commit 55e93f663a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 261 additions and 26 deletions

View File

@ -75,10 +75,12 @@ module OpenNebulaJSON
dsid = params['dsid'] ? params['dsid'].to_i : params['dsid']
name = params['name']
vmtemplate_name = params['vmtemplate_name']
tag ="tag=#{params['tag']}" if !params['tag'].empty?
rc = super({
:dsid => dsid,
:name => name,
:vmtemplate_name => vmtemplate_name
:vmtemplate_name => vmtemplate_name,
:url_args => tag
})
if OpenNebula.is_error?(rc)

View File

@ -24,6 +24,8 @@ require 'OpenNebulaAddons'
require 'OpenNebulaJSON/JSONUtils'
#include JSONUtils
require 'net/http'
class SunstoneServer < CloudServer
# Secs to sleep between checks to see if image upload to repo is finished
@ -476,6 +478,53 @@ class SunstoneServer < CloudServer
return [200, rc.to_json]
end
def get_docker_tags(app_id)
# Get MarketPlaceApp
marketapp = retrieve_resource("marketplaceapp", app_id)
if OpenNebula.is_error?(marketapp)
return [404, marketapp.to_json]
end
# Get MarketPlace
market_id = marketapp["MARKETPLACE_ID"]
market = retrieve_resource("marketplace", market_id)
if OpenNebula.is_error?(market)
return [404, market.to_json]
end
# Check market_mad
# TODO Change message
return [400, "Invalid MARKET_MAD"] if market["MARKET_MAD"] != "dockerhub"
# Get dockerhub tags
url = "https://hub.docker.com/v2/repositories/library/#{marketapp["NAME"]}/tags/?page_size=100"
tags_names = []
loop do
uri = URI(url)
req = Net::HTTP::Get.new(uri.request_uri)
req['User-Agent'] = "OpenNebula"
opts = { :use_ssl => true }
rc = Net::HTTP.start(uri.hostname, uri.port, nil, nil, opts) do |http|
http.request(req)
end
return [rc.code.to_i, rc.msg] unless rc.is_a? Net::HTTPSuccess
body = JSON.parse(rc.body)
(tags_names << body["results"].map { |values| {
name: values["name"],
last_updated: values["last_updated"]
} }).flatten!
break if body["next"].nil? || body["next"].empty?
url = body["next"]
end
return [200, tags_names.to_json]
end
private

View File

@ -462,6 +462,29 @@ define(function(require) {
return ""+id;
},
"getAppTags": function(params, resource){
var callback = params.success;
var callbackError = params.error;
var data = params.data;
var method = "getAppTags";
var request = OpenNebulaHelper.request(resource, method, data);
var url = resource.toLowerCase() + "/" + params.data.id + "/tags";
$.ajax({
url: url,
type: "GET",
dataType: "json",
success: function(response) {
return callback ? callback(request, response) : null;
},
error: function(response) {
return callbackError ?
callbackError(request, OpenNebulaError(response)) : null;
}
});
},
"get_all_cache": function() {
return listCache;
},

View File

@ -121,7 +121,10 @@ define(function(require) {
},
"unlock" : function(params) {
OpenNebulaAction.simple_action(params, RESOURCE, "unlock");
}
},
"tags" : function(params) {
OpenNebulaAction.getAppTags(params, RESOURCE)
},
}
return MarketPlaceApp;

View File

@ -59,7 +59,14 @@ define(function(require) {
EXPORT_DIALOG_ID,
"export",
function(formPanelInstance, context) {
formPanelInstance.setResourceId(context, resourceId, type);
OpenNebulaResource.show({
data: { id: resourceId },
success: function(_, app_json) {
formPanelInstance.setDockerTags(resourceId, app_json);
formPanelInstance.setResourceId(context, app_json, type);
},
error: Notifier.onError
});
}
);
}

View File

@ -0,0 +1,119 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */
/* */
/* 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. */
/* -------------------------------------------------------------------------- */
define(function(require) {
/*
DEPENDENCIES
*/
var Sunstone = require('sunstone');
var OpenNebula = require('opennebula');
var TabDataTable = require('utils/tab-datatable');
var Locale = require('utils/locale');
var Humanize = require('utils/humanize');
/*
CONSTANTS
*/
var RESOURCE = "MarketPlaceApp";
var TAB_ID = require('../tabId');
/*
CONSTRUCTOR
*/
function Table(dataTableId, conf) {
this.conf = conf || {};
this.tabId = TAB_ID;
this.dataTableId = dataTableId;
this.resource = RESOURCE;
this.appId = conf.appId;
this.dataTableOptions = {
bAutoWidth: false,
bSortClasses : false,
bDeferRender: true,
aoColumnDefs: [
{ sType: "string", aTargets: [0, 1], aDataSort: [0, 1] },
{ sType: "date", aTargets: [2], aDataSort: [2] },
],
aLengthMenu: [ [5, 10, 20, -1], [5, 10, 20, "All"] ],
iDisplayLength: 5,
};
this.columns = [
Locale.tr("Name"),
Locale.tr("Last updated")
];
this.selectOptions = {
"id_index": 0,
"name_index": 0,
"select_resource": Locale.tr("Please select a dockerhub tag from the list (default latest)"),
"you_selected": Locale.tr("You selected the following dockerhub tags:")
}
TabDataTable.call(this);
}
Table.prototype = Object.create(TabDataTable.prototype);
Table.prototype.constructor = Table;
Table.prototype.elementArray = _elementArray;
Table.prototype.updateFn = _updateFn;
return Table;
/*
FUNCTION DEFINITIONS
*/
function _elementArray(element) {
var lastUpdated = "";
if (element.last_updated) {
var date = new Date(element.last_updated);
lastUpdated = date.toLocaleDateString();
}
return [ element.name, element.name, lastUpdated ];
}
function _updateFn() {
var that = this;
$("#refresh_button_exportMarketPlaceAppFormdocketagsTable").addClass("fa-spin");
var success_func = function (_, resource_list) {
var list_array = [];
$.each(resource_list, function() {
list_array.push(that.elementArray(this));
});
that.updateView(null, list_array, true);
Sunstone.enableFormPanelSubmit(TAB_ID);
$("#refresh_button_exportMarketPlaceAppFormdocketagsTable").removeClass("fa-spin");
}
OpenNebula[this.resource].tags({
data: { id: this.appId },
success: success_func,
error: function(request, error_json, container) {
success_func(request, []);
Notifier.onError(request, error_json, container);
}
});
}
});

View File

@ -22,14 +22,10 @@ define(function(require) {
var BaseFormPanel = require("utils/form-panels/form-panel");
var Sunstone = require("sunstone");
var Locale = require("utils/locale");
var Notifier = require("utils/notifier");
var Tips = require("utils/tips");
var DataStoresTable = require("tabs/datastores-tab/datatable");
var DockerTagsTable = require("./docker-tags");
var DataStore = require("opennebula/datastore");
var OpenNebulaMarketPlaceApp = require("opennebula/marketplaceapp");
var Config = require("sunstone-config");
var OpenNebula = require("opennebula");
var TemplateUtils = require("utils/template-utils");
/*
TEMPLATES
@ -63,6 +59,14 @@ define(function(require) {
return r;
}
function _getDockerTagsTable(formPanelId, resourceId){
return (formPanelId)
? new DockerTagsTable(
formPanelId + "docketagsTable",
{ appId: resourceId, select: true }
) : null;
}
function FormPanel() {
this.formPanelId = FORM_PANEL_ID;
this.tabId = TAB_ID;
@ -85,6 +89,7 @@ define(function(require) {
FormPanel.prototype.htmlWizard = _htmlWizard;
FormPanel.prototype.submitWizard = _submitWizard;
FormPanel.prototype.setResourceId = _setResourceId;
FormPanel.prototype.setDockerTags = _setDockerTags;
FormPanel.prototype.onShow = _onShow;
FormPanel.prototype.setup = _setup;
@ -104,14 +109,17 @@ define(function(require) {
function _onShow(context) {
var placeDataStore = "#placeDatatableDatastore";
Sunstone.disableFormPanelSubmit(TAB_ID);
if(this.type === "VMTEMPLATE" ){
if (this.type === "VMTEMPLATE") {
this.datastoresTable.dataTable.parents(placeDataStore).remove();
}else{
}
else {
if(!($(placeDataStore).length)){
$("#exportMarketPlaceAppFormWizard").append(this.datastoresTable.dataTableHTML);
this.datastoresTable = getDataStore(FORM_PANEL_ID);
this.datastoresTable.initialize();
}
this.datastoresTable.resetResourceTableSelect();
}
$("#NAME", context).focus();
@ -132,22 +140,31 @@ define(function(require) {
});
}
function _setResourceId(context, resourceId, type) {
function _setResourceId(context, appJson, type) {
this.type = type;
$("input#NAME", context).val(appJson.MARKETPLACEAPP.NAME).trigger("input");
if (appJson.MARKETPLACEAPP.TEMPLATE.VMTEMPLATE64 != undefined){
$(".vmname", context).show();
}
}
function _setDockerTags(resourceId, appJson) {
this.resourceId = resourceId;
this.type = type;
OpenNebula.MarketPlaceApp.show({
data : {
id: resourceId
},
success: function(request,app_json){
$("input#NAME", context).val(app_json.MARKETPLACEAPP.NAME).trigger("input");
if (app_json.MARKETPLACEAPP.TEMPLATE.VMTEMPLATE64 != undefined){
$(".vmname", context).show();
}
Sunstone.enableFormPanelSubmit(TAB_ID);
},
error: Notifier.onError
});
if (appJson.MARKETPLACEAPP &&
appJson.MARKETPLACEAPP.MARKETPLACE != undefined &&
String(appJson.MARKETPLACEAPP.MARKETPLACE).toLowerCase() === "dockerhub"
) {
this.dockertagsTable = _getDockerTagsTable(FORM_PANEL_ID, resourceId);
$("#placeDatatableDockerTags").show().append(this.dockertagsTable.dataTableHTML);
this.dockertagsTable.initialize();
this.dockertagsTable.resetResourceTableSelect();
}
else {
$("#placeDatatableDockerTags").hide()
Sunstone.enableFormPanelSubmit(TAB_ID);
}
}
function _submitWizard(context) {
@ -157,6 +174,10 @@ define(function(require) {
"dsid" : this.datastoresTable.idInput().val()
};
if (this.dockertagsTable) {
$.extend(marketPlaceAppObj, { "tag": this.dockertagsTable.idInput().val() });
}
Sunstone.runAction("MarketPlaceApp.export", [this.resourceId], marketPlaceAppObj);
return false;
}

View File

@ -38,6 +38,10 @@
</div>
<fieldset id="placeDatatableDatastore">
<legend>{{tr "Select the Datastore to store the resource"}}</legend>
{{{datastoresTableHTML}}}
{{{ datastoresTableHTML }}}
</fieldset>
<fieldset id="placeDatatableDockerTags" style="display: none;">
<legend>{{tr "Select the Dockerhub tag"}}</legend>
{{{ dockertagsTableHTML }}}
</fieldset>
</form>

View File

@ -1014,6 +1014,13 @@ get '/marketplaceapp/:id/download' do
end
end
##############################################################################
# Retrive DockerHub tags
##############################################################################
get '/marketplaceapp/:id/tags' do
@SunstoneServer.get_docker_tags(params[:id])
end
##############################################################################
# Create a new Resource
##############################################################################