mirror of
https://github.com/portainer/portainer.git
synced 2025-07-22 23:09:41 +02:00
fix(app): registry push-pull features overhaul (#3393)
* feat(registry): registry or direct url selector
* feat(app): push pull container creation
* feat(app): push pull container duplicate
* feat(app): push pull container details recreate
* feat(app): push pull container details commit
* feat(app): push pull images
* feat(app): push pull image tag
* feat(app): push pull image push
* feat(app): push pull image pull
* feat(app): push pull service creation
* feat(app): push pull templates create container
* feat(app): push pull templates create stacks
* feat(app): push pull template edit
* feat(app): push pull service details update
* fix(app): refactor registry selector + registry auto select
* feat(app): remove autocomplete on registry selector
* style(image-registry): reword simple/advanced mode
* Revert "feat(app): remove autocomplete on registry selector"
This reverts commit 97ec2ddd62
.
* refactor(registry-selector): reverse registry and image fields
* feat(app): autocomplete on registry selector
* feat(registry-selector): change gitlab registry autocomplete
* feat(registry-selector): autocomplete for dockerhub
* feat(registry-selector): gitlab url based on locked value instead of name
* fix(registry-selector): gitlab registries URL are not modified anymore
* fix(registry-selector): change gitlab image autofill on duplicate
* fix(registry-selector): gitlab registries now only suggest their own images and not all from gitlab
* fix(registry-selector): psuh pull issues with gitlab registries
* fix(registry-selector): dockerhub registry selection on duplicate for dockerhub images
* fix(templates): registry retrieval for template
* feat(images): add autocomplete on image pull panel
* fix(registry-selector): add latest tag when no tag is specified
* fix(registry-selector): latest tag now applied for non gitlab registries
This commit is contained in:
parent
61c38534a7
commit
e19bc8abc7
32 changed files with 525 additions and 349 deletions
|
@ -1,4 +1,5 @@
|
|||
import _ from 'lodash-es';
|
||||
import { RegistryTypes } from 'Extensions/registry-management/models/registryTypes';
|
||||
|
||||
angular.module('portainer.docker')
|
||||
.factory('ImageHelper', [function ImageHelperFactory() {
|
||||
|
@ -7,74 +8,65 @@ angular.module('portainer.docker')
|
|||
var helper = {};
|
||||
|
||||
helper.isValidTag = isValidTag;
|
||||
helper.createImageConfigForContainer = createImageConfigForContainer;
|
||||
helper.getImagesNamesForDownload = getImagesNamesForDownload;
|
||||
helper.removeDigestFromRepository = removeDigestFromRepository;
|
||||
helper.imageContainsURL = imageContainsURL;
|
||||
|
||||
function isValidTag(tag) {
|
||||
return tag.match(/^(?![\.\-])([a-zA-Z0-9\_\.\-])+$/g);
|
||||
}
|
||||
|
||||
helper.extractImageAndRegistryFromRepository = function(repository) {
|
||||
var slashCount = _.countBy(repository)['/'];
|
||||
var registry = null;
|
||||
var image = repository;
|
||||
if (slashCount >= 1) {
|
||||
// assume something/something[/...]
|
||||
registry = repository.substr(0, repository.indexOf('/'));
|
||||
// assume valid DNS name or IP (contains at least one '.')
|
||||
if (_.countBy(registry)['.'] > 0) {
|
||||
image = repository.substr(repository.indexOf('/') + 1);
|
||||
} else {
|
||||
registry = null;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
registry: registry,
|
||||
image: image
|
||||
};
|
||||
};
|
||||
|
||||
helper.getImagesNamesForDownload = function(images) {
|
||||
function getImagesNamesForDownload(images) {
|
||||
var names = images.map(function(image) {
|
||||
return image.RepoTags[0] !== '<none>:<none>' ? image.RepoTags[0] : image.Id;
|
||||
});
|
||||
return {
|
||||
names: names
|
||||
};
|
||||
};
|
||||
|
||||
function extractNameAndTag(imageName, registry) {
|
||||
var imageNameAndTag = imageName.split(':');
|
||||
var image = imageNameAndTag[0];
|
||||
var tag = imageNameAndTag[1] ? imageNameAndTag[1] : 'latest';
|
||||
if (registry) {
|
||||
image = registry + '/' + imageNameAndTag[0];
|
||||
}
|
||||
|
||||
return {
|
||||
image: image,
|
||||
tag: tag
|
||||
};
|
||||
}
|
||||
|
||||
helper.createImageConfigForCommit = function(imageName, registry) {
|
||||
var imageAndTag = extractNameAndTag(imageName, registry);
|
||||
return {
|
||||
repo: imageAndTag.image,
|
||||
tag: imageAndTag.tag
|
||||
/**
|
||||
*
|
||||
* @param {PorImageRegistryModel} registry
|
||||
*/
|
||||
function createImageConfigForContainer(registry) {
|
||||
const data = {
|
||||
fromImage: ''
|
||||
};
|
||||
};
|
||||
let fullImageName = '';
|
||||
|
||||
helper.createImageConfigForContainer = function (imageName, registry) {
|
||||
var imageAndTag = extractNameAndTag(imageName, registry);
|
||||
return {
|
||||
fromImage: imageAndTag.image,
|
||||
tag: imageAndTag.tag
|
||||
};
|
||||
};
|
||||
if (registry.UseRegistry) {
|
||||
if (registry.Registry.Type === RegistryTypes.GITLAB) {
|
||||
const slash = _.startsWith(registry.Image, ':') ? '' : '/';
|
||||
fullImageName = registry.Registry.URL + '/' + registry.Registry.Gitlab.ProjectPath + slash + registry.Image;
|
||||
} else {
|
||||
const url = registry.Registry.URL ? registry.Registry.URL + '/' : '';
|
||||
fullImageName = url + registry.Image;
|
||||
}
|
||||
if (!_.includes(registry.Image, ':')) {
|
||||
fullImageName += ':latest';
|
||||
}
|
||||
} else {
|
||||
fullImageName = registry.Image;
|
||||
}
|
||||
|
||||
helper.removeDigestFromRepository = function(repository) {
|
||||
data.fromImage = fullImageName;
|
||||
return data;
|
||||
}
|
||||
|
||||
function imageContainsURL(image) {
|
||||
const split = _.split(image, '/');
|
||||
const url = split[0];
|
||||
if (split.length > 1) {
|
||||
return _.includes(url, '.') || _.includes(url, ':');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function removeDigestFromRepository(repository) {
|
||||
return repository.split('@sha')[0];
|
||||
};
|
||||
}
|
||||
|
||||
return helper;
|
||||
}]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue