Skip to content

Commit

Permalink
Merge pull request #403 from f-higashi/fix-get-version-from-container…
Browse files Browse the repository at this point in the history
…image

Fix to parse containerImage to get version
  • Loading branch information
bryk committed Feb 25, 2016
2 parents f250a81 + 9de1ccc commit cffd34a
Show file tree
Hide file tree
Showing 4 changed files with 271 additions and 10 deletions.
62 changes: 62 additions & 0 deletions src/app/frontend/common/docker/dockerimagereference.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Copyright 2015 Google Inc. All Rights Reserved.
//
// 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.

/**
* Parser to get TAG from reference of Docker container image
*
* Docker Container image can be set with the following value:
* [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
* REGISTRY can be omitted and NAME can contain '/' as delimiters for NAMESPACE.
*
*/

export default class DockerImageReference {
/**
* Constructs DockerImageReference object.
*
* @param {string} reference
*/
constructor(reference) {
/**
* @private {string}
*/
this.reference_ = reference;
}

/**
* Returns tag
*
* TAG cannot contain ':' and '/'.
* If TAG is not omitted, last block text(separated by '/') contains TAG.
* @return {string}
*/
tag() {
/** @type {number} **/
let index = (this.reference_ || '').lastIndexOf('/');

/** @type {string} **/
let last_block = '';
if (index > -1) {
last_block = this.reference_.substring(index + 1);
} else {
last_block = this.reference_;
}

index = (last_block || '').lastIndexOf(':');
if (index > -1) {
return last_block.substring(index + 1);
}
return '';
}
}
12 changes: 2 additions & 10 deletions src/app/frontend/deploy/deployfromsettings_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
stateName as replicationcontrollerliststate,
} from 'replicationcontrollerlist/replicationcontrollerlist_state';
import {uniqueNameValidationKey} from './uniquename_directive';
import DockerImageReference from '../common/docker/dockerimagereference';

// Label keys for predefined labels
const APP_LABEL_KEY = 'app';
Expand Down Expand Up @@ -345,16 +346,7 @@ export default class DeployFromSettingsController {
* @return {string}
* @private
*/
getContainerImageVersion_() {
/** @type {number} */
let index = (this.containerImage || '').lastIndexOf(':');

if (index > -1) {
return this.containerImage.substring(index + 1);
}

return '';
}
getContainerImageVersion_() { return new DockerImageReference(this.containerImage).tag(); }

/**
* Returns application name.
Expand Down
183 changes: 183 additions & 0 deletions src/test/frontend/common/docker/dockerimagereference_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
// Copyright 2015 Google Inc. All Rights Reserved.
//
// 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.

import DockerImageReference from 'common/docker/dockerimagereference';

describe('DokcerImageReference', () => {

it('should return empty string when containerImage is undefined', () => {
// given
let reference = undefined;

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should return empty string when containerImage is empty', () => {
// given
let reference = "";

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should return empty string when containerImage is not empty and does not contain `:`' +
' delimiter',
() => {
// given
let reference = 'test';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should return part of the string after `:` delimiter', () => {
// given
let reference = 'test:1';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('1');
});

it('should return part of the string after `:` delimiter', () => {
// given
let reference = 'private.registry:5000/test:1';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('1');
});

it('should return empty string when containerImage is not empty and does not containe `:`' +
' delimiter after `/` delimiter',
() => {
// given
let reference = 'private.registry:5000/test';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should return part of the string after `:` delimiter when containerImage is not empty' +
'and containe two `/` delimiters',
() => {
// given
let reference = 'private.registry:5000/namespace/test:1';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('1');
});

it('should return part of the string after last `:` delimiter when containerImage is not empty' +
' and containe two `:` delimiters',
() => {
// given
let reference = 'private.registry:5000/test:image:1';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('1');
});

it('should return empty string when containerImage is only `:` delimiter', () => {
// given
let reference = ':';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should return empty string when containerImage is only `/` delimiter', () => {
// given
let reference = '/';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should return empty string when containerImage is only `/` delimiter' +
' and `:` delimiter',
() => {
// given
let reference = '/:';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should retrun empty when containerImage is `::`', () => {
// given
let reference = '::';

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should retrun empty when containerImage is not empty and ends with `:` delimiter', () => {
// given
let reference = "test:";

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

it('should retrun empty when containerImage is not empty and ends with `/` delimiter', () => {
// given
let reference = "test/";

// when
let result = new DockerImageReference(reference).tag();

// then
expect(result).toEqual('');
});

});
24 changes: 24 additions & 0 deletions src/test/frontend/deploy/deployfromsettings_controller_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,30 @@ describe('DeployFromSettings controller', () => {
expect(result).toEqual('1');
});

it('should return part of the string after `:` delimiter', () => {
// given
ctrl.containerImage = 'private.registry:5000/test:1';

// when
let result = ctrl.getContainerImageVersion_();

// then
expect(result).toEqual('1');
});

it('should return empty string when containerImage is not empty and does not containe `:`' +
' delimiter after `/` delimiter',
() => {
// given
ctrl.containerImage = 'private.registry:5000/test';

// when
let result = ctrl.getContainerImageVersion_();

// then
expect(result).toEqual('');
});

it('should return empty array when labels array is empty', () => {
// given
let labels = [];
Expand Down

0 comments on commit cffd34a

Please sign in to comment.