Merge branch 'master' of https://github.com/vmware/harbor into breadScrumb

This commit is contained in:
Fuhui Peng (c) 2018-04-19 15:34:20 +08:00
commit 9082b50bb9
11 changed files with 35 additions and 16 deletions

BIN
docs/img/read_only.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

View File

@ -15,6 +15,7 @@ This guide walks you through the fundamentals of using Harbor. You'll learn how
* [Manage project creation.](#managing-project-creation) * [Manage project creation.](#managing-project-creation)
* [Manage self-registration.](#managing-self-registration) * [Manage self-registration.](#managing-self-registration)
* [Manage email settings.](#managing-email-settings) * [Manage email settings.](#managing-email-settings)
* [Manage registry read only.](#managing-registry-read-only)
* [Pull and push images using Docker client.](#pulling-and-pushing-images-using-docker-client) * [Pull and push images using Docker client.](#pulling-and-pushing-images-using-docker-client)
* [Add description to repositories](#add-description-to-repositories) * [Add description to repositories](#add-description-to-repositories)
* [Delete repositories and images.](#deleting-repositories) * [Delete repositories and images.](#deleting-repositories)
@ -225,6 +226,20 @@ You can manage whether a user can sign up for a new account. This option is not
You can change Harbor's email settings, the mail server is used to send out responses to users who request to reset their password. You can change Harbor's email settings, the mail server is used to send out responses to users who request to reset their password.
![browse project](img/new_config_email.png) ![browse project](img/new_config_email.png)
### Managing registry read only
You can change Harbor's registry read only settings, read only mode will allow 'docker pull' while preventing 'docker push' and the deletion of repository and tag.
![browse project](img/read_only.png)
If it set to true, deleting repository, tag and pushing image will be disabled.
![browse project](img/read_only_enable.png)
```
$ docker push 10.117.169.182/demo/ubuntu:14.04
The push refers to a repository [10.117.169.182/demo/ubuntu]
0271b8eebde3: Preparing
denied: The system is in read only mode. Any modification is prohibited.
```
## Pulling and pushing images using Docker client ## Pulling and pushing images using Docker client
**NOTE: Harbor only supports Registry V2 API. You need to use Docker client 1.6.0 or higher.** **NOTE: Harbor only supports Registry V2 API. You need to use Docker client 1.6.0 or higher.**

View File

@ -1,6 +1,6 @@
{ {
"name": "harbor-ui", "name": "harbor-ui",
"version": "0.7.1", "version": "0.7.2",
"description": "Harbor shared UI components based on Clarity and Angular4", "description": "Harbor shared UI components based on Clarity and Angular4",
"scripts": { "scripts": {
"start": "ng serve --host 0.0.0.0 --port 4500 --proxy-config proxy.config.json", "start": "ng serve --host 0.0.0.0 --port 4500 --proxy-config proxy.config.json",

View File

@ -1,6 +1,6 @@
{ {
"name": "harbor-ui", "name": "harbor-ui",
"version": "0.7.1", "version": "0.7.2",
"description": "Harbor shared UI components based on Clarity and Angular4", "description": "Harbor shared UI components based on Clarity and Angular4",
"author": "VMware", "author": "VMware",
"module": "index.js", "module": "index.js",

View File

@ -36,16 +36,20 @@ export const REPOSITORY_GRIDVIEW_STYLE = `
width: 100px; width: 100px;
} }
.card-media-block {
margin-top: 12px;
margin-bottom: 12px;
}
.card-media-block > img { .card-media-block > img {
height: 45px; height: 45px;
width: 45px; width: 45px;
} }
.card-media-title {
overflow: hidden;
height: 24px;
}
.card-media-text {
overflow: hidden;
height: 21px
}
.card-media-description { .card-media-description {
height: 45px; height: 45px;
} }

View File

@ -50,12 +50,10 @@ export const REPOSITORY_GRIDVIEW_TEMPLATE = `
<ng-template let-item="item"> <ng-template let-item="item">
<a class="card clickable" (click)="watchRepoClickEvt(item)"> <a class="card clickable" (click)="watchRepoClickEvt(item)">
<div class="card-header"> <div class="card-header">
<div [ngClass]="{'card-media-block': withAdmiral, 'card-media-block wrap': !withAdmiral }"> <div [ngClass]="{'card-media-block': true, 'wrap': !withAdmiral }">
<img *ngIf="withAdmiral" [src]="getImgLink(item)"/> <img *ngIf="withAdmiral" [src]="getImgLink(item)"/>
<div class="card-media-description"> <div class="card-media-description">
<span class="card-media-title"> <span class="card-media-title">{{item.name}}</span>
{{ (item.name?.length>29) ? (item.name | slice:0:29) + '...' : (item.name)}}
</span>
<p class="card-media-text">{{registryUrl}}</p> <p class="card-media-text">{{registryUrl}}</p>
</div> </div>
</div> </div>

View File

@ -32,6 +32,7 @@ export class RepositoryGridviewComponent implements OnChanges, OnInit {
@Input() urlPrefix: string; @Input() urlPrefix: string;
@Input() hasSignedIn: boolean; @Input() hasSignedIn: boolean;
@Input() hasProjectAdminRole: boolean; @Input() hasProjectAdminRole: boolean;
@Input() mode = 'admiral';
@Output() repoClickEvent = new EventEmitter<RepositoryItem>(); @Output() repoClickEvent = new EventEmitter<RepositoryItem>();
@Output() repoProvisionEvent = new EventEmitter<RepositoryItem>(); @Output() repoProvisionEvent = new EventEmitter<RepositoryItem>();
@Output() addInfoEvent = new EventEmitter<RepositoryItem>(); @Output() addInfoEvent = new EventEmitter<RepositoryItem>();
@ -87,7 +88,7 @@ export class RepositoryGridviewComponent implements OnChanges, OnInit {
} }
public get withAdmiral(): boolean { public get withAdmiral(): boolean {
return this.systemInfo ? this.systemInfo.with_admiral : false; return this.mode === 'admiral'
} }
public get showDBStatusWarning(): boolean { public get showDBStatusWarning(): boolean {
@ -106,7 +107,7 @@ export class RepositoryGridviewComponent implements OnChanges, OnInit {
.then(systemInfo => this.systemInfo = systemInfo) .then(systemInfo => this.systemInfo = systemInfo)
.catch(error => this.errorHandler.error(error)); .catch(error => this.errorHandler.error(error));
if (this.withAdmiral) { if (this.mode === 'admiral') {
this.isCardView = true; this.isCardView = true;
} else { } else {
this.isCardView = false; this.isCardView = false;

View File

@ -30,7 +30,7 @@
"clarity-icons": "0.10.24", "clarity-icons": "0.10.24",
"clarity-ui": "0.10.24", "clarity-ui": "0.10.24",
"core-js": "^2.4.1", "core-js": "^2.4.1",
"harbor-ui": "0.6.83", "harbor-ui": "0.7.2",
"intl": "^1.2.5", "intl": "^1.2.5",
"mutationobserver-shim": "^0.3.2", "mutationobserver-shim": "^0.3.2",
"ngx-cookie": "^1.0.0", "ngx-cookie": "^1.0.0",

View File

@ -1,5 +1,5 @@
<div style="margin-top: 4px;"> <div style="margin-top: 4px;">
<hbr-repository-gridview [projectId]="projectId" [projectName]="projectName" [hasSignedIn]="hasSignedIn" <hbr-repository-gridview [projectId]="projectId" [projectName]="projectName" [hasSignedIn]="hasSignedIn"
[hasProjectAdminRole]="hasProjectAdminRole" [hasProjectAdminRole]="hasProjectAdminRole" [mode]="mode"
(repoClickEvent)="watchRepoClickEvent($event)"></hbr-repository-gridview> (repoClickEvent)="watchRepoClickEvent($event)"></hbr-repository-gridview>
</div> </div>

View File

@ -28,6 +28,7 @@ export class RepositoryPageComponent implements OnInit {
hasProjectAdminRole: boolean; hasProjectAdminRole: boolean;
hasSignedIn: boolean; hasSignedIn: boolean;
projectName: string; projectName: string;
mode = 'standalone';
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,