merge latest updates.

This commit is contained in:
kunw 2016-06-28 23:44:23 +08:00
commit c819049479
11 changed files with 192 additions and 116 deletions

View File

@ -61,6 +61,8 @@ services:
dockerfile: Dockerfile.job dockerfile: Dockerfile.job
env_file: env_file:
- ./config/jobservice/env - ./config/jobservice/env
volumes:
- /data/job_logs:/var/log/jobs
depends_on: depends_on:
- ui - ui
logging: logging:

View File

@ -6,11 +6,15 @@ This module is for those machine running Harbor's old version, such as 0.1.0. If
**WARNING!!** You must backup your data before migrating **WARNING!!** You must backup your data before migrating
###Installation ###Installation
- step 1: change `db_username`, `db_password`, `db_port`, `db_name` in migration.cfg - step 1:
- step 2: build image from dockerfile
```
cd migration
```
- step 2: change `db_username`, `db_password`, `db_port`, `db_name` in migration.cfg
- step 3: build image from dockerfile
``` ```
cd harbor-migration
docker build -t migrate-tool . docker build -t migrate-tool .
``` ```

View File

@ -60,30 +60,33 @@ func RefreshCatalogCache() error {
if err != nil { if err != nil {
return err return err
} }
/*
repos := []string{}
repos := []string{} for _, repo := range rs {
rc, ok := repositoryClients[repo]
if !ok {
rc, err = registry.NewRepositoryWithUsername(repo, endpoint, username)
if err != nil {
log.Errorf("error occurred while initializing repository client used by cache: %s %v", repo, err)
continue
}
repositoryClients[repo] = rc
}
tags, err := rc.ListTag()
if err != nil {
log.Errorf("error occurred while list tag for %s: %v", repo, err)
continue
}
for _, repo := range rs { if len(tags) != 0 {
rc, err := NewRepositoryClient(endpoint, true, username, repos = append(repos, repo)
repo, "repository", repo, "pull", "push", "*") log.Debugf("add %s to catalog cache", repo)
if err != nil { }
log.Errorf("error occurred while initializing repository client used by cache: %s %v", repo, err)
continue
} }
*/
tags, err := rc.ListTag() Cache.Put(catalogKey, rs, 600*time.Second)
if err != nil {
log.Errorf("error occurred while list tag for %s: %v", repo, err)
continue
}
if len(tags) != 0 {
repos = append(repos, repo)
log.Debugf("add %s to catalog cache", repo)
}
}
Cache.Put(catalogKey, repos, 600*time.Second)
return nil return nil
} }

View File

@ -0,0 +1,15 @@
reset_email_hint = Please click this link to reset your password
reset_email_subject = Reset your password
page_title_index = Harbor
page_title_dashboard = Dashboard - Harbor
page_title_account_setting = Account Settings - Harbor
page_title_reset_password = Reset Password - Harbor
page_title_change_password = Change Password - Harbor
page_title_forgot_password = Forgot Password - Harbor
page_title_project = Project - Harbor
page_title_repository = Details - Harbor
page_title_search = Search - Harbor
page_title_sign_up = Sign Up - Harbor
page_title_add_new = Add New - Harbor
page_title_admin_option = Admin Options - Harbor

View File

@ -0,0 +1,15 @@
reset_email_hint = 请点击下面的链接进行重置密码操作
reset_email_subject = 重置您的密码
page_title_index = Harbor
page_title_dashboard = 消息中心 - Harbor
page_title_account_setting = 账户设置 - Harbor
page_title_reset_password = 重置密码 - Harbor
page_title_change_password = 修改密码 - Harbor
page_title_forgot_password = 忘记密码 - Harbor
page_title_project = 项目 - Harbor
page_title_repository = 明细信息 - Harbor
page_title_search = 搜索 - Harbor
page_title_sign_up = 注册 - Harbor
page_title_add_new = 增加用户 - Harbor
page_title_admin_option = 管理员选项 - Harbor

View File

@ -14,17 +14,26 @@
<advanced-search ng-show="vm.isOpen" is-open="vm.isOpen" op="vm.op" others="vm.others" search='vm.search({op: vm.op, username: vm.username})' from-date="vm.fromDate" to-date="vm.toDate"></advanced-search> <advanced-search ng-show="vm.isOpen" is-open="vm.isOpen" op="vm.op" others="vm.others" search='vm.search({op: vm.op, username: vm.username})' from-date="vm.fromDate" to-date="vm.toDate"></advanced-search>
<div class="pane"> <div class="pane">
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane"> <div class="table-head-container">
<thead> <table class="table table-pane table-header">
<th>// 'username' | tr //</th><th>// 'repository_name' | tr //</th><th>// 'operation' | tr //</th><th>// 'timestamp' | tr //</th> <thead>
</thead> <th width="14%">// 'username' | tr //</th>
<tbody> <th width="32%">// 'repository_name' | tr //</th>
<tr ng-repeat="log in vm.logs"> <th width="14%">// 'operation' | tr //</th>
<td>//log.username//</td><td>//log.repo_name//</td><td>//log.operation//</td><td>//log.op_time | dateL : 'YYYY-MM-DD HH:mm:ss'//</td> <th width="40%">// 'timestamp' | tr //</th>
</tr> </thead>
</tbody> </table>
</table> </div>
<div class="table-body-container" style="height: 300px;">
<table class="table table-pane">
<tbody>
<tr ng-repeat="log in vm.logs">
<td>//log.username//</td><td>//log.repo_name//</td><td>//log.operation//</td><td>//log.op_time | dateL : 'YYYY-MM-DD HH:mm:ss'//</td>
</tr>
</tbody>
</table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -13,16 +13,22 @@
<div class="pane"> <div class="pane">
<modal-dialog modal-title="// vm.modalTitle //" modal-message="// vm.modalMessage //" confirm-only="true"></modal-dialog> <modal-dialog modal-title="// vm.modalTitle //" modal-message="// vm.modalMessage //" confirm-only="true"></modal-dialog>
<add-project-member ng-show="vm.isOpen" is-open="vm.isOpen" project-id="//vm.projectId//" reload='vm.search({projectId: vm.projectId, username: vm.username})'></add-project-member> <add-project-member ng-show="vm.isOpen" is-open="vm.isOpen" project-id="//vm.projectId//" reload='vm.search({projectId: vm.projectId, username: vm.username})'></add-project-member>
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane" > <div class="table-head-container">
<thead> <table class="table table-pane table-header">
<th width="30%">// 'username' | tr //</th><th width="40%">// 'role' | tr //</th><th width="30%">// 'operation' | tr //</th> <thead>
</thead> <th width="30%">// 'username' | tr //</th><th width="45%">// 'role' | tr //</th><th width="25%">// 'operation' | tr //</th>
<tbody> </thead>
<tr ng-repeat="pr in vm.projectMembers" edit-project-member username="pr.username" project-id="vm.projectId" user-id="pr.user_id" delete="vm.deleteProjectMember({projectId: vm.projectId, userId: pr.user_id})" current-user-id="vm.user.user_id" role-name="pr.role_name" reload='vm.search({projectId: vm.projectId, username: vm.username})'></tr> </table>
</tbody> </div>
</table> <div class="table-body-container" style="height: 300px;">
<table class="table table-pane">
<tbody>
<tr ng-repeat="pr in vm.projectMembers" edit-project-member username="pr.username" project-id="vm.projectId" user-id="pr.user_id" delete="vm.deleteProjectMember({projectId: vm.projectId, userId: pr.user_id})" current-user-id="vm.user.user_id" role-name="pr.role_name" reload='vm.search({projectId: vm.projectId, username: vm.username})'></tr>
</tbody>
</table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -11,18 +11,23 @@
<button ng-if="!vm.isOpen" class="btn btn-success" type="button" ng-click="vm.addDestination()" data-toggle="modal" data-target="#createDestinationModal"><span class="glyphicon glyphicon-plus"></span>// 'add_new_destination' | tr //</button> <button ng-if="!vm.isOpen" class="btn btn-success" type="button" ng-click="vm.addDestination()" data-toggle="modal" data-target="#createDestinationModal"><span class="glyphicon glyphicon-plus"></span>// 'add_new_destination' | tr //</button>
<create-destination action="//vm.action//" target-id="//vm.targetId//" reload="vm.retrieve()"></create-destination> <create-destination action="//vm.action//" target-id="//vm.targetId//" reload="vm.retrieve()"></create-destination>
</div> </div>
<div class="pane"> <div class="pane">
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane"> <div class="table-head-container">
<thead> <table class="table table-pane table-header">
<thead>
<th width="20%">// 'name' | tr //</th> <th width="20%">// 'name' | tr //</th>
<th width="40%">// 'endpoint' | tr //</th> <th width="30%">// 'endpoint' | tr //</th>
<th width="20%">// 'creation_time' | tr //</th> <th width="35%">// 'creation_time' | tr //</th>
<th width="20%">// 'actions' | tr //</th> <th width="15%">// 'actions' | tr //</th>
</thead> </thead>
<tbody> </table>
</div>
<div class="table-body-container" style="height: 200px;">
<table class="table table-pane">
<tbody>
<tr ng-if="vm.destinations.length == 0"> <tr ng-if="vm.destinations.length == 0">
<td colspan="7" height="100%" class="empty-hint" ><h3 class="text-muted">// 'no_destinations' | tr //</h3></td> <td colspan="7" height="100%" class="empty-hint" ><h3 class="text-muted">// 'no_destinations' | tr //</h3></td>
</tr> </tr>
<tr ng-if="vm.destinations.length > 0" ng-repeat="r in vm.destinations"> <tr ng-if="vm.destinations.length > 0" ng-repeat="r in vm.destinations">
<td>//r.name//</td> <td>//r.name//</td>
@ -35,9 +40,11 @@
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
<div class="col-xs-4 col-md-12 well well-sm well-custom"><div class="col-md-offset-10">//vm.destinations ? vm.destinations.length : 0// // 'items' | tr //</div></div> </div>
</div>
</div> <div class="col-xs-4 col-md-12 well well-sm well-custom"><div class="col-md-offset-10">//vm.destinations ? vm.destinations.length : 0// // 'items' | tr //</div></div>
</div>
</div>

View File

@ -9,47 +9,54 @@
</div> </div>
<create-policy reload="vm.retrieve()" action="vm.action" modal-title="//vm.modalTitle//" policy-id="//vm.policyId//"></create-policy> <create-policy reload="vm.retrieve()" action="vm.action" modal-title="//vm.modalTitle//" policy-id="//vm.policyId//"></create-policy>
</div> </div>
<div class="pane"> <div class="pane">
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane"> <div class="table-head-container">
<thead> <table class="table table-pane table-header">
<th width="14%">// 'name' | tr //</th> <thead>
<th width="18%">// 'description' | tr //</th> <th width="14%">// 'name' | tr //</th>
<th width="14%">// 'projects' | tr //</th> <th width="18%">// 'description' | tr //</th>
<th width="12%">// 'destination' | tr //</th> <th width="14%">// 'projects' | tr //</th>
<th width="18%">// 'start_time' | tr //</th> <th width="12%">// 'destination' | tr //</th>
<th width="12%">// 'activation' | tr //</th> <th width="18%">// 'start_time' | tr //</th>
<th width="12%">// 'actions' | tr //</th> <th width="12%">// 'activation' | tr //</th>
</thead> <th width="12%">// 'actions' | tr //</th>
<tbody> </thead>
<tr ng-if="vm.replications.length == 0"> </table>
<td colspan="7" height="100%" class="empty-hint" ><h3 class="text-muted">// 'no_replications' | tr //</h3></td> </div>
</tr> <div class="table-body-container" style="height: 200px;">
<tr ng-if="vm.replications.length > 0" ng-repeat="r in vm.replications"> <table class="table table-pane">
<td><a href="repository#/replication?project_id=//r.project_id//">//r.name//</a></td> <tbody>
<td>//r.description//</td> <tr ng-if="vm.replications.length == 0">
<td>//r.project_name//</td> <td colspan="7" height="100%" class="empty-hint" ><h3 class="text-muted">// 'no_replications' | tr //</h3></td>
<td>//r.target_name//</td> </tr>
<td>//r.start_time | dateL : 'YYYY-MM-DD HH:mm:ss'//</td> <tr ng-if="vm.replications.length > 0" ng-repeat="r in vm.replications">
<td ng-switch on="//r.enabled//"> <td><a href="repository#/replication?project_id=//r.project_id//">//r.name//</a></td>
<span ng-switch-when="1">// 'enabled' | tr //</span> <td>//r.description//</td>
<span ng-switch-when="0">// 'disabled' | tr //</span> <td>//r.project_name//</td>
</td> <td>//r.target_name//</td>
<td> <td>//r.start_time | dateL : 'YYYY-MM-DD HH:mm:ss'//</td>
<div class="display-inline-block" ng-switch on="//r.enabled//"> <td ng-switch on="//r.enabled//">
<a href="javascript:void(0);" ng-click="vm.togglePolicy(r.id, 0)"><span ng-switch-when="1" class="glyphicon glyphicon-stop color-danger"></span></a> <span ng-switch-when="1">// 'enabled' | tr //</span>
<a href="javascript:void(0);" ng-click="vm.togglePolicy(r.id, 1)"><span ng-switch-when="0" class="glyphicon glyphicon-play color-success"></span></a> <span ng-switch-when="0">// 'disabled' | tr //</span>
</div> </td>
&nbsp; <td>
<a href="javascript:void(0);" data-toggle="modal" data-target="#createPolicyModal" ng-click="vm.editReplication(r.id)"><span class="glyphicon glyphicon-pencil"></span></a> <div class="display-inline-block" ng-switch on="//r.enabled//">
&nbsp; <a href="javascript:void(0);" ng-click="vm.togglePolicy(r.id, 0)"><span ng-switch-when="1" class="glyphicon glyphicon-stop color-danger"></span></a>
<!--a href="javascript:void(0);"><span class="glyphicon glyphicon-trash"></span></a--> <a href="javascript:void(0);" ng-click="vm.togglePolicy(r.id, 1)"><span ng-switch-when="0" class="glyphicon glyphicon-play color-success"></span></a>
</td> </div>
</tr> &nbsp;
</tbody> <a href="javascript:void(0);" data-toggle="modal" data-target="#createPolicyModal" ng-click="vm.editReplication(r.id)"><span class="glyphicon glyphicon-pencil"></span></a>
</table> &nbsp;
<!--a href="javascript:void(0);"><span class="glyphicon glyphicon-trash"></span></a-->
</td>
</tr>
</tbody>
</table>
</div>
</div> </div>
</div> </div>
<div class="col-xs-4 col-md-12 well well-sm well-custom"><div class="col-md-offset-10">//vm.replications ? vm.replications.length : 0// // 'items' | tr //</div></div> </div>
<div class="col-xs-4 col-md-12 well well-sm well-custom"><div class="col-md-offset-10">//vm.replications ? vm.replications.length : 0// // 'items' | tr //</div></div>
</div> </div>
</div> </div>

View File

@ -1,16 +1,24 @@
<h4 class="page-header title-color underlined">// 'popular_repositories' | tr //</h4> <h4 class="page-header title-color underlined">// 'popular_repositories' | tr //</h4>
<div class="col-xs-4 col-md-12 up-table-pane"> <div class="col-xs-4 col-md-12 up-table-pane">
<table class="table"> <div class="table-head-container" style="width: 650px">
<thead> <table class="table table-pane table-header">
<th>// 'repository_name' | tr //</th><th>// 'count' | tr //</th><th>// 'creator' | tr //</th> <thead>
</thead> <th width="60%">// 'repository_name' | tr //</th>
<tbody> <th width="15%">// 'count' | tr //</th>
<tr> <th width="25%">// 'creator' | tr //</th>
<td colspan="5" height="120px" class="empty-hint" ng-if="vm.top10Repositories.length === 0"><h3 class="text-muted">// 'no_top_repositories' | tr //</h3></td> </thead>
</tr> </table>
<tr ng-if="vm.top10Repositories.length > 0" ng-repeat="t in vm.top10Repositories"> </div>
<td>//t.name//</td><td>//t.count//</td><td>//t.creator === '' ? 'N/A' : t.creator //</td> <div class="table-body-container" style="height: 120px; width: 650px">
</tr> <table class="table table-pane">
</tbody> <tbody>
</table> <tr>
</div> <td colspan="5" height="120px" class="empty-hint" ng-if="vm.top10Repositories.length === 0"><h3 class="text-muted">// 'no_top_repositories' | tr //</h3></td>
</tr>
<tr ng-if="vm.top10Repositories.length > 0" ng-repeat="t in vm.top10Repositories">
<td>//t.name//</td><td>//t.count//</td><td>//t.creator === '' ? 'N/A' : t.creator //</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -11,7 +11,7 @@
function TopRepositoryController(ListTopRepositoryService) { function TopRepositoryController(ListTopRepositoryService) {
var vm = this; var vm = this;
ListTopRepositoryService(10) ListTopRepositoryService(5)
.success(listTopRepositorySuccess) .success(listTopRepositorySuccess)
.error(listTopRepositoryFailed); .error(listTopRepositoryFailed);
@ -38,4 +38,4 @@
return directive; return directive;
} }
})(); })();