mirror of https://github.com/rancher/ui.git
commit
6a6916deff
17
app/app.js
17
app/app.js
|
|
@ -28,10 +28,12 @@ const App = Application.extend({
|
|||
'access',
|
||||
'authn-store',
|
||||
'authz-store',
|
||||
'cluster-store',
|
||||
'catalog',
|
||||
'endpoint',
|
||||
'github',
|
||||
'intl',
|
||||
'modal',
|
||||
'router',
|
||||
'resource-actions',
|
||||
'scope',
|
||||
|
|
@ -43,14 +45,13 @@ const App = Application.extend({
|
|||
'user-theme',
|
||||
],
|
||||
externalRoutes: {
|
||||
index: 'index',
|
||||
failWhale: 'failWhale',
|
||||
authenticated: 'authenticated',
|
||||
'authenticated.clusters': 'authenticated.clusters',
|
||||
'authenticated.clusters.cluster': 'authenticated.clusters.cluster',
|
||||
'authenticated.clusters.project': 'authenticated.clusters.project',
|
||||
'authenticated.prefs': 'authenticated.prefs',
|
||||
'logout': 'logout'
|
||||
index: 'index',
|
||||
failWhale: 'failWhale',
|
||||
authenticated: 'authenticated',
|
||||
'authenticated.cluster': 'authenticated.cluster',
|
||||
'authenticated.project': 'authenticated.project',
|
||||
'authenticated.prefs': 'authenticated.prefs',
|
||||
'logout': 'logout'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export default Route.extend({
|
|||
let catalog = this.get('catalog');
|
||||
let deps = [];
|
||||
|
||||
let cluster = this.modelFor('authenticated.clusters.cluster').clone();
|
||||
let cluster = this.modelFor('authenticated.cluster').clone();
|
||||
if ( cluster.systemStacks === null ) {
|
||||
let def = JSON.parse(this.get(`settings.${C.SETTING.CLUSTER_TEMPLATE}`)) || {};
|
||||
cluster.set('systemStacks', (def.systemStacks||[]).map((stack) => {
|
||||
|
|
@ -2,7 +2,7 @@ import { alias } from '@ember/object/computed';
|
|||
import Controller, { inject as controller } from '@ember/controller';
|
||||
|
||||
export default Controller.extend({
|
||||
clusterController: controller('authenticated.clusters.cluster'),
|
||||
clusterController: controller('authenticated.cluster'),
|
||||
cluster: alias('clusterController.model'),
|
||||
|
||||
queryParams : ['backTo', 'driver', 'hostId'],
|
||||
|
|
@ -7,7 +7,7 @@ export default Controller.extend({
|
|||
|
||||
actions: {
|
||||
launch(model) {
|
||||
this.transitionToRoute('authenticated.clusters.cluster.host-templates.launch', this.get('currentClusterId'), model.id);
|
||||
this.transitionToRoute('authenticated.cluster.host-templates.launch', this.get('currentClusterId'), model.id);
|
||||
},
|
||||
},
|
||||
|
||||
|
|
@ -14,7 +14,7 @@ export default Route.extend({
|
|||
|
||||
setupController(controller, model) {
|
||||
this._super(controller, model);
|
||||
let cluster = this.modelFor('authenticated.clusters.cluster');
|
||||
let cluster = this.modelFor('authenticated.cluster');
|
||||
controller.set('currentClusterId', cluster.get('id'));
|
||||
},
|
||||
|
||||
|
|
@ -29,14 +29,14 @@ export default Route.extend({
|
|||
});
|
||||
|
||||
if (!activeDrivers.get('length')) {
|
||||
this.transitionTo('authenticated.clusters.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
|
||||
this.transitionTo('authenticated.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
|
||||
backTo: this.get('backTo'),
|
||||
driver: 'custom'
|
||||
}});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.transitionTo('authenticated.clusters.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
|
||||
this.transitionTo('authenticated.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
|
||||
backTo: this.get('backTo')
|
||||
}});
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
{{host-template-list
|
||||
model=model
|
||||
currentClusterId=currentClusterId
|
||||
launch=(action (action 'launch'))
|
||||
}}
|
||||
launch=(action 'launch')
|
||||
}}
|
||||
|
|
@ -16,7 +16,7 @@ export default Route.extend({
|
|||
hostTemplateId: template.id
|
||||
};
|
||||
return this.get('clusterStore').find('cluster', null, {url: 'clusters', forceReload: true, removeMissing: true}).then((clusters) => {
|
||||
let clusterToCreateOn = get(transistion, 'params')['authenticated.clusters.cluster']['cluster_id'];
|
||||
let clusterToCreateOn = get(transistion, 'params')['authenticated.cluster']['cluster_id'];
|
||||
return {
|
||||
template: template,
|
||||
config: config,
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<div class="right-buttons">
|
||||
{{#if scope.current.canAddHost}}
|
||||
{{#link-to "authenticated.clusters.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
|
||||
{{#link-to "authenticated.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -40,7 +40,7 @@
|
|||
{{empty-table
|
||||
resource="container"
|
||||
showNew=scope.current.canAddHost
|
||||
newRoute="authenticated.clusters.cluster.host-templates"
|
||||
newRoute="authenticated.cluster.host-templates"
|
||||
newTranslationKey="nav.hosts.addHost" ctx="clusterId"}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
|
@ -6,7 +6,7 @@ import Controller, { inject as controller } from '@ember/controller';
|
|||
export default Controller.extend({
|
||||
scope: service(),
|
||||
settings: service(),
|
||||
clusterController: controller('authenticated.clusters.cluster'),
|
||||
clusterController: controller('authenticated.cluster'),
|
||||
cluster: alias('clusterController.model'),
|
||||
|
||||
loading: alias('cluster.isTransitioning'),
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<section class="header clearfix">
|
||||
<h1 class="pull-left">"{{model.displayName}}" Dashboard</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<button class="btn bg-primary icon-btn hide" {{action "dashboard"}}>
|
||||
<span class="darken"><i class="icon icon-external-link"></i></span>
|
||||
<span>{{t 'k8sPage.dashboard.button'}}</span>
|
||||
</button>
|
||||
|
||||
<button class="btn bg-primary icon-btn ml-10" onClick={{action "kubectl" allowedKeys="meta"}}>
|
||||
<span class="darken"><i class="icon icon-terminal"></i></span>
|
||||
<span>{{t 'k8sPage.shell.button'}}</span>
|
||||
</button>
|
||||
|
||||
<button class="btn bg-primary icon-btn ml-10" {{action "kubeconfig"}}>
|
||||
<span class="darken"><i class="icon icon-download"></i></span>
|
||||
<span>{{t 'k8sPage.configFile.button'}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="text-center">
|
||||
<img style="width: 90%;" src="{{app.baseAssets}}assets/images/legitimate-dashboard.png"/>
|
||||
</section>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
import { inject as service } from '@ember/service';
|
||||
import Route from '@ember/routing/route';
|
||||
|
||||
export default Route.extend({
|
||||
authzStore: service('authz-store'),
|
||||
scope: service(),
|
||||
model: function () {
|
||||
return this.get('userStore').findAll('namespace', { filter: { clusterId: this.get('scope.currentCluster.id') } });
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<section class="header clearfix">
|
||||
<h1 class="pull-left">{{t 'namespacesPage.header'}}</h1>
|
||||
<div class="vertical-middle"></div>
|
||||
|
||||
<div class="right-buttons">
|
||||
{{#link-to "authenticated.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
<span class="darken">
|
||||
<i class="icon icon-plus"></i>
|
||||
</span>
|
||||
<span>{{t 'namespacesPage.addNamespace'}}</span>
|
||||
{{/link-to}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
<div class="vertical-middle"></div>
|
||||
|
||||
<div class="right-buttons">
|
||||
{{#link-to "authenticated.clusters.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
{{#link-to "authenticated.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
<span class="darken">
|
||||
<i class="icon icon-folder"></i>
|
||||
</span>
|
||||
|
|
@ -11,4 +11,4 @@
|
|||
{{/link-to}}
|
||||
</div>
|
||||
</section>
|
||||
{{project-table model=model.projects}}
|
||||
{{project-table model=model.projects}}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
import Route from '@ember/routing/route';
|
||||
|
||||
export default Route.extend({
|
||||
redirect() {
|
||||
this.transitionTo('authenticated.clusters.cluster.projects');
|
||||
},
|
||||
});
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
import EmberObject from '@ember/object';
|
||||
import { hash } from 'rsvp';
|
||||
import { inject as service } from '@ember/service';
|
||||
import Route from '@ember/routing/route';
|
||||
|
||||
export default Route.extend({
|
||||
clusterStore: service('cluster-store'),
|
||||
k8s: service(),
|
||||
|
||||
model() {
|
||||
return EmberObject.create({
|
||||
stacks: [],
|
||||
});
|
||||
/*
|
||||
return hash({
|
||||
stacks: this.get('clusterStore').find('stack'),
|
||||
}).then((hash) => {
|
||||
return EmberObject.create(hash);
|
||||
});
|
||||
*/
|
||||
},
|
||||
});
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
{{#if projectController.showClusterWelcome}}
|
||||
{{cluster-welcome}}
|
||||
{{else}}
|
||||
<section class="header clearfix">
|
||||
<h1>{{t 'k8sPage.header'}}</h1>
|
||||
</section>
|
||||
|
||||
<div class="row">
|
||||
<div class="col span-4 text-center option option-primary">
|
||||
<h2>{{t 'k8sPage.dashboard.title'}}</h2>
|
||||
<div class="box" style="min-height: 250px;">
|
||||
<p>{{t 'k8sPage.dashboard.detail' htmlSafe=true}}</p>
|
||||
|
||||
<div class="links" style="top: auto; bottom: 47px;">
|
||||
<button class="btn bg-primary icon-btn" {{action "dashboard"}}>
|
||||
<span class="darken"><i class="icon icon-external-link"></i></span>
|
||||
<span>{{t 'k8sPage.dashboard.button'}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-dashboard.svg" class="mt-5" /></div>
|
||||
</div>
|
||||
|
||||
<div class="col span-4 text-center option option-primary">
|
||||
<h2>{{t 'k8sPage.shell.title'}}</h2>
|
||||
<div class="box" style="min-height: 250px;">
|
||||
<p>{{t 'k8sPage.shell.detail' htmlSafe=true}}</p>
|
||||
|
||||
<div class="links" style="top: auto; bottom: 47px;">
|
||||
<button class="btn bg-primary icon-btn ml-10" onClick={{action "kubectl" allowedKeys="meta"}}>
|
||||
|
||||
<span class="darken"><i class="icon icon-terminal"></i></span>
|
||||
<span>{{t 'k8sPage.shell.button'}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-shell.svg" class="mt-5" /></div>
|
||||
</div>
|
||||
|
||||
<div class="col span-4 text-center option option-primary">
|
||||
<h2>{{t 'k8sPage.configFile.title'}}</h2>
|
||||
<div class="box" style="min-height: 250px;">
|
||||
<p>{{t 'k8sPage.configFile.detail' htmlSafe=true}}</p>
|
||||
|
||||
<div class="links" style="top: auto; bottom: 47px;">
|
||||
<button class="btn bg-primary icon-btn ml-10" {{action "kubeconfig"}}>
|
||||
<span class="darken"><i class="icon icon-download"></i></span>
|
||||
<span>{{t 'k8sPage.configFile.button'}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-config.svg" class="mt-5" /></div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
<div class="vertical-middle"></div>
|
||||
|
||||
<div class="right-buttons">
|
||||
{{#link-to "authenticated.clusters.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
{{#link-to "authenticated.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
<span class="darken">
|
||||
<i class="icon icon-folder"></i>
|
||||
</span>
|
||||
|
|
@ -11,4 +11,4 @@
|
|||
{{/link-to}}
|
||||
</div>
|
||||
</section>
|
||||
{{project-table model=model.projects}}
|
||||
{{project-table model=model.projects}}
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ export default Route.extend({
|
|||
} else {
|
||||
this.get('scope').setPageScope('cluster');
|
||||
if (cluster) {
|
||||
this.replaceWith('authenticated.clusters.cluster', cluster.get('id'));
|
||||
this.replaceWith('authenticated.cluster', cluster.get('id'));
|
||||
} else {
|
||||
this.replaceWith('authenticated.clusters');
|
||||
this.replaceWith('global-admin.clusters');
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
<h3>{{t 'helpPage.host.header'}}</h3>
|
||||
<hr/>
|
||||
<p>{{t 'helpPage.host.content' appName=settings.appName minVersion=settings.minDockerVersion}} <a href="{{docsLink}}/hosts/" target="_blank">{{t 'helpPage.host.contentLink'}}</a></p>
|
||||
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'helpPage.host.addHostLink'}}{{/link-to}}
|
||||
{{#link-to "authenticated.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'helpPage.host.addHostLink'}}{{/link-to}}
|
||||
</div>
|
||||
|
||||
<div class="col span-4">
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
{{/if}}
|
||||
|
||||
{{#if scope.current.canAddHost}}
|
||||
{{#link-to "authenticated.clusters.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
|
||||
{{#link-to "authenticated.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -67,7 +67,7 @@
|
|||
{{empty-table
|
||||
resource="container"
|
||||
showNew=scope.current.canAddHost
|
||||
newRoute="authenticated.clusters.cluster.host-templates"
|
||||
newRoute="authenticated.cluster.host-templates"
|
||||
newTranslationKey="nav.hosts.addHost" ctx="clusterId"}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
|
|
|||
|
|
@ -65,41 +65,86 @@ const rootNav = [
|
|||
},
|
||||
|
||||
// Cluster
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-k8s',
|
||||
localizedLabel: 'nav.cluster.dashboard',
|
||||
route: 'authenticated.cluster.index',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-projects',
|
||||
localizedLabel: 'nav.cluster.projects',
|
||||
route: 'authenticated.clusters.cluster.projects.index',
|
||||
route: 'authenticated.cluster.projects.index',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-namespaces',
|
||||
localizedLabel: 'nav.cluster.namespaces',
|
||||
route: 'authenticated.cluster.namespaces.index',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-hosts',
|
||||
localizedLabel: 'nav.cluster.hosts',
|
||||
route: 'authenticated.clusters.cluster.hosts',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-k8s',
|
||||
localizedLabel: 'nav.cluster.k8s',
|
||||
route: 'authenticated.clusters.cluster.k8s',
|
||||
route: 'authenticated.cluster.hosts',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-networking',
|
||||
localizedLabel: 'nav.cluster.networking',
|
||||
route: 'authenticated.clusters.cluster.networking',
|
||||
route: 'authenticated.cluster.networking',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
{
|
||||
scope: 'cluster',
|
||||
id: 'cluster-storage',
|
||||
localizedLabel: 'nav.cluster.storage',
|
||||
route: 'authenticated.clusters.cluster.storage',
|
||||
route: 'authenticated.cluster.storage',
|
||||
ctx: [getClusterId],
|
||||
},
|
||||
|
||||
// Global
|
||||
{
|
||||
scope: 'global',
|
||||
id: 'global-clusters',
|
||||
localizedLabel: 'nav.admin.clusters',
|
||||
route: 'global-admin.clusters',
|
||||
},
|
||||
{
|
||||
scope: 'global',
|
||||
id: 'global-accounts',
|
||||
localizedLabel: 'nav.admin.accounts',
|
||||
route: 'global-admin.accounts',
|
||||
},
|
||||
{
|
||||
scope: 'global',
|
||||
id: 'global-machines',
|
||||
localizedLabel: 'nav.admin.machines',
|
||||
route: 'global-admin.machines',
|
||||
},
|
||||
{
|
||||
scope: 'global',
|
||||
id: 'global-roles',
|
||||
localizedLabel: 'nav.admin.roles',
|
||||
route: 'global-admin.roles',
|
||||
},
|
||||
{
|
||||
scope: 'global',
|
||||
id: 'global-podsecurity',
|
||||
localizedLabel: 'nav.admin.podSecurityPolicies',
|
||||
route: 'global-admin.policies',
|
||||
},
|
||||
{
|
||||
scope: 'global',
|
||||
id: 'global-advanced',
|
||||
localizedLabel: 'nav.admin.settings.advanced',
|
||||
route: 'global-admin.settings.advanced',
|
||||
},
|
||||
]
|
||||
|
||||
export function initialize(/*appInstance*/) {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import { equal } from '@ember/object/computed';
|
|||
import { inject as service } from '@ember/service';
|
||||
import Resource from 'ember-api-store/models/resource';
|
||||
import PolledResource from 'ui/mixins/cattle-polled-resource';
|
||||
import { hasMany } from 'ember-api-store/utils/denormalize';
|
||||
|
||||
var Cluster = Resource.extend(PolledResource, {
|
||||
authzStore: service('authz-store'),
|
||||
|
|
@ -10,11 +11,12 @@ var Cluster = Resource.extend(PolledResource, {
|
|||
scope: service(),
|
||||
router: service(),
|
||||
|
||||
type: 'cluster',
|
||||
namespaces: hasMany('id', 'namespace', 'clusterId'),
|
||||
projects: hasMany('id', 'project', 'clusterId'),
|
||||
|
||||
actions: {
|
||||
edit() {
|
||||
this.get('router').transitionTo('authenticated.clusters.cluster.edit', this.get('id'));
|
||||
this.get('router').transitionTo('authenticated.cluster.edit', this.get('id'));
|
||||
},
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ var Project = Resource.extend(PolledResource, {
|
|||
|
||||
actions: {
|
||||
edit: function () {
|
||||
this.get('router').transitionTo('authenticated.clusters.cluster.projects.edit', this.get('id'));
|
||||
this.get('router').transitionTo('authenticated.cluster.projects.edit', this.get('id'));
|
||||
},
|
||||
|
||||
activate: function () {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ var Workload = Resource.extend(DisplayImage, StateCounts, EndpointPorts, {
|
|||
router: service(),
|
||||
|
||||
namespace: reference('namespaceId'),
|
||||
pods: hasMany('id', 'pod','workloadId'),
|
||||
pods: hasMany('id', 'pod', 'workloadId'),
|
||||
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
|
|
|
|||
|
|
@ -37,36 +37,33 @@ Router.map(function() {
|
|||
|
||||
this.route('prefs');
|
||||
|
||||
// Clusters
|
||||
this.route('clusters', {path: '/clusters'}, function() {
|
||||
// Per-Cluster
|
||||
this.route('cluster', {path: '/c/:cluster_id'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('new', {path: '/add'}, function() {
|
||||
this.route('rke');
|
||||
this.route('edit');
|
||||
|
||||
this.route('import');
|
||||
|
||||
this.route('storage');
|
||||
this.route('networking');
|
||||
|
||||
this.route('hosts');
|
||||
this.route('host-new', {path: '/add-host'});
|
||||
this.route('host-templates', {path: '/launch-host'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('launch', {path: '/:template_id'});
|
||||
});
|
||||
this.route('new-project', {path: '/add-project'});
|
||||
this.route('project', {path: '/p/:project_id'});
|
||||
|
||||
this.route('cluster', {path: '/:cluster_id'}, function() {
|
||||
this.route('edit');
|
||||
this.route('projects', {path: '/projects'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('edit', {path: '/:project_id'});
|
||||
this.route('new', {path: '/add'});
|
||||
});
|
||||
|
||||
this.route('import');
|
||||
this.route('k8s', {path: '/kubernetes'});
|
||||
|
||||
this.route('storage');
|
||||
this.route('networking');
|
||||
|
||||
this.route('hosts');
|
||||
this.route('host-new', {path: '/add-host'});
|
||||
this.route('host-templates', {path: '/launch-host'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('launch', {path: '/:template_id'});
|
||||
});
|
||||
|
||||
this.route('projects', {path: '/projects'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('edit', {path: '/:project_id'});
|
||||
this.route('new', {path: '/add'});
|
||||
});
|
||||
this.route('namespaces', {path: '/namespaces'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('edit', {path: '/:namespace_id'});
|
||||
this.route('new', {path: '/add'});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -9,27 +9,29 @@
|
|||
<div class="box-sm">
|
||||
<p>{{t 'clustersPage.indexPage.cloud.desc'}}</p>
|
||||
<div class="links" style="top: auto; bottom: 30px;">
|
||||
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
{{#link-to "machines.templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/cluster-key.svg" class="mt-5" /></div>
|
||||
</div>
|
||||
|
||||
<div class="col span-4 text-center option option-primary">
|
||||
<h2>{{t 'clustersPage.indexPage.rke.header'}}</h2>
|
||||
<div class="box-sm">
|
||||
<p>{{t 'clustersPage.indexPage.rke.desc'}}</p>
|
||||
<div class="links" style="top: auto; bottom: 30px;">
|
||||
{{#link-to "authenticated.clusters.new.rke" class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
{{#link-to "clusters.new.rke" class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-standard.svg" class="mt-5" /></div>
|
||||
</div>
|
||||
|
||||
<div class="col span-4 text-center option option-disabled">
|
||||
<h2>{{t 'clustersPage.indexPage.import.header'}}</h2>
|
||||
<div class="box-sm">
|
||||
<p>{{t 'clustersPage.indexPage.import.desc'}}</p>
|
||||
<div class="links" style="top: auto; bottom: 30px;">
|
||||
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
{{#link-to "machines.templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-import.svg" class="mt-5" /></div>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -14,7 +14,7 @@ export default Ember.Route.extend({
|
|||
auth: 'x509'
|
||||
};
|
||||
let config = clusterStore.createRecord(def);
|
||||
let models = this.modelFor('authenticated.clusters.new');
|
||||
let models = this.modelFor('clusters.new');
|
||||
let cluster = get(models, 'cluster')
|
||||
let hostTemplates = get(models, 'hostTemplates');
|
||||
let machineDrivers = get(models, 'machineDrivers');
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
import EmberObject from '@ember/object';
|
||||
import { inject as service } from '@ember/service';
|
||||
import Route from '@ember/routing/route';
|
||||
import C from 'ui/utils/constants';
|
||||
import { hash/* , all */ } from 'rsvp';
|
||||
|
||||
export default Route.extend({
|
||||
clusterStore: service('cluster-store'),
|
||||
catalog: service(),
|
||||
settings: service(),
|
||||
|
||||
model() {
|
||||
let store = this.get('clusterStore');
|
||||
|
||||
let def = JSON.parse(this.get(`settings.${C.SETTING.CLUSTER_TEMPLATE}`)) || {};
|
||||
def.type = 'cluster';
|
||||
|
||||
let cluster = store.createRecord(def);
|
||||
|
||||
return hash({
|
||||
hosts: store.findAll('machine'), // this should eventually be all host with out cluster id
|
||||
hostTemplates: store.findAll('machinetemplate'),
|
||||
machineDrivers: store.findAll('machinedriver'),
|
||||
}).then((hash) => {
|
||||
return EmberObject.create({
|
||||
cluster: cluster,
|
||||
hosts: hash.hosts, // this should eventually be all host with out cluster id
|
||||
hostTemplates: hash.hostTemplates,
|
||||
machineDrivers: hash.machineDrivers,
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,8 +0,0 @@
|
|||
import EnvHeader from 'shared/components/page-header-environment/component';
|
||||
import layout from './template';
|
||||
import { inject as service } from '@ember/service';
|
||||
|
||||
export default EnvHeader.extend({
|
||||
layout,
|
||||
clusterStore: service('cluster-store'),
|
||||
});
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
<a class="dropdown-toggle {{if twoLine 'two-line'}} text-white" aria-haspopup="true" aria-expanded="false" aria-label="{{t 'nav.environment.cluster'}}" data-toggle="environment">
|
||||
{{#if (eq scope "project")}}
|
||||
<div class="clip">
|
||||
<i class="icon icon-cluster icon-fw"></i>
|
||||
{{project.cluster.displayName}}
|
||||
</div>
|
||||
<div class="pl-15 clip text-muted">
|
||||
<i class="{{project.icon}} project-icon icon-fw"></i>
|
||||
{{project.displayName}}
|
||||
</div>
|
||||
{{else if (eq scope "cluster")}}
|
||||
<div class="clip">
|
||||
<i class="icon icon-cluster icon-fw"></i>
|
||||
{{project.cluster.displayName}}
|
||||
</div>
|
||||
{{else if (eq scope "clusters")}}
|
||||
<div class="clip">
|
||||
{{t 'nav.environment.manage'}}
|
||||
</div>
|
||||
{{else if (eq scope "admin")}}
|
||||
<div class="clip">
|
||||
{{t 'nav.admin.tab'}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="clip">
|
||||
<i class="icon icon-question icon-fw"></i>
|
||||
{{scope}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<i class="icon icon-chevron-down chevron"></i>
|
||||
<span class="sr-only">{{t 'nav.srToggleDropdown'}}</span>
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu cluster-menu" role="menu" data-dropdown-id="environment">
|
||||
{{#if isAdmin}}
|
||||
<li class="{{if (eq scope "admin") 'active selected'}}">
|
||||
{{#link-to "index"}}
|
||||
<i class="icon icon-globe icon-fw"></i>
|
||||
{{t 'nav.admin.tab' appName=settings.appName}}
|
||||
{{/link-to}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if (and isOwner projects.current)}}
|
||||
<li>{{#link-to-external "authenticated.clusters.project" projects.current.id class="clip"}}{{t 'nav.environment.edit' name=projects.current.displayName}}{{/link-to-external}}</li>
|
||||
<li role="presentation" class="divider"></li>
|
||||
{{/if}}
|
||||
|
||||
|
||||
{{#if projectIsMissing}}
|
||||
<li role="presentation" class="dropdown-header">{{t 'nav.environment.selected'}}</li>
|
||||
<li class="{{if (and (eq scope "project") project.active) 'active selected'}}">
|
||||
<a href="#" {{action "switchProject" project.id}} class="clip">
|
||||
<i class="icon {{project.icon}}"></i>
|
||||
|
||||
{{project.displayName}}
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation" class="divider"></li>
|
||||
{{/if}}
|
||||
|
||||
{{#each byCluster as |entry idx|}}
|
||||
{{#if (gt idx 0)}}
|
||||
<li role="presentation" class="divider"></li>
|
||||
{{/if}}
|
||||
<li class="header {{if entry.active (if (eq scope 'cluster') 'active selected') 'inactive'}}">
|
||||
{{#link-to-external "authenticated.clusters.cluster" entry.cluster.id}}
|
||||
<i class="icon icon-cluster icon-fw"></i>
|
||||
|
||||
{{entry.cluster.displayName}}
|
||||
{{/link-to-external}}
|
||||
</li>
|
||||
{{#each entry.projects as |p|}}
|
||||
<li class="{{if (and (eq scope "project") p.active) 'active selected' (unless entry.active 'inactive')}} subitem text-muted">
|
||||
<a href="#" {{action "switchProject" p.id}} class="clip project-link">
|
||||
<i class="icon {{p.icon}} icon-fw"></i>
|
||||
{{#if p.isDefault}}
|
||||
<i class="icon icon-star-fill default-project nested"/>
|
||||
{{/if}}
|
||||
|
||||
{{p.displayName}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
import PageHeader from 'shared/components/page-header/component';
|
||||
import layout from './template';
|
||||
|
||||
export default PageHeader.extend({
|
||||
layout,
|
||||
});
|
||||
|
|
@ -1,129 +0,0 @@
|
|||
<nav class="clearfix responsive-nav" role="navigation" id="js-responsive-nav">
|
||||
<a class="nav-logo logo-{{app.mode}} btn bg-transparent"><span class="sr-only">{{settings.appName}}</span></a>
|
||||
|
||||
<ul class="nav-main nav-list no-inline-space">
|
||||
{{page-header-environment
|
||||
scope=scope
|
||||
isOwner=isOwner
|
||||
switchProject="switchProject"
|
||||
switchNamespace="switchNamespace"}}
|
||||
|
||||
|
||||
{{#each navTree as |item|}}
|
||||
{{#if item.submenu.length}}
|
||||
{{! Has a submenu }}
|
||||
<li class="dropdown nav-item">
|
||||
{{#if item.route}}
|
||||
{{#link-to-as-attrs
|
||||
item.route
|
||||
models=item.ctx
|
||||
qp=item.qp
|
||||
moreCurrentWhen=item.moreCurrentWhen
|
||||
activeParent=true
|
||||
class="dropdown-toggle"
|
||||
role="button"
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false"
|
||||
}}
|
||||
{{maybe-t item.localizedLabel item.label}}
|
||||
<span class="icon icon-chevron-down"/>
|
||||
{{/link-to-as-attrs}}
|
||||
|
||||
{{else}}
|
||||
<a class="dropdown-toggle" role="button" aria-haspopup="true" aria-expanded="false" aria-label={{maybe-t item.localizedLabel item.label}}>
|
||||
{{maybe-t item.localizedLabel item.label}}
|
||||
<span class="icon icon-chevron-down"/>
|
||||
</a>
|
||||
{{/if}}
|
||||
|
||||
<ul class="dropdown-menu" data-dropdown-id={{item.id}}>
|
||||
{{#each item.submenu as |subitem|}}
|
||||
{{#if subitem.route}}
|
||||
<li>
|
||||
{{#link-to-as-attrs
|
||||
subitem.route
|
||||
models=subitem.ctx
|
||||
qp=subitem.qp
|
||||
activeParent=true
|
||||
moreCurrentWhen=subitem.moreCurrentWhen
|
||||
submenuItem=true
|
||||
}}
|
||||
<i class="{{subitem.icon}}"/> {{maybe-t subitem.localizedLabel subitem.label}}
|
||||
{{/link-to-as-attrs}}
|
||||
</li>
|
||||
{{else if subitem.divider}}
|
||||
<li class="divider"></li>
|
||||
{{else}}
|
||||
{{! Just a label }}
|
||||
<li class="dropdown-header">
|
||||
<i class="{{subitem.icon}}"/> {{maybe-t subitem.localizedLabel subitem.label}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
</li>
|
||||
{{else if item.route}}
|
||||
{{! No submenu }}
|
||||
<li class="nav-item">
|
||||
{{#link-to-as-attrs
|
||||
item.route
|
||||
models=item.ctx
|
||||
qp=item.qp
|
||||
activeParent=true
|
||||
moreCurrentWhen=item.moreCurrentWhen
|
||||
class="nav-link"
|
||||
}}
|
||||
{{maybe-t item.localizedLabel item.label}}
|
||||
{{/link-to-as-attrs}}
|
||||
</li>
|
||||
{{else}}
|
||||
{{! Just a label }}
|
||||
<li class="dropdown-header">
|
||||
{{maybe-t item.localizedLabel item.label}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
|
||||
<ul class="nav-user dropdown">
|
||||
<li>
|
||||
<a class="btn dropdown-toggle" role="button" aria-haspopup="true" aria-expanded="false" aria-label="{{t 'nav.user.label' username=session.user}}" data-toggle="header-user-menu">
|
||||
{{#if accessEnabled}}
|
||||
{{identity-avatar link=false identity=access.identity}}
|
||||
{{else}}
|
||||
<div class="gh-avatar">
|
||||
<div class="gh-placeholder">
|
||||
<i class="icon icon-user"></i>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
<span class="sr-only">{{t 'nav.srToggleDropdown'}}</span>
|
||||
<i class="icon icon-chevron-down"></i>
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu dropdown-menu-right" data-dropdown-id="header-user-menu">
|
||||
<li class="{{if (eq scope "clusters") 'active selected'}}">
|
||||
{{#link-to-external "authenticated.clusters"}}{{t 'nav.environment.manage'}}{{/link-to-external}}
|
||||
</li>
|
||||
|
||||
{{#if accessEnabled}}
|
||||
<li role="presentation" class="user-auth">
|
||||
{{identity-block avatar=false identity=access.identity}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if isCaas}}
|
||||
<li role="separator" class="divider"></li>
|
||||
<li>{{#link-to-external "authenticated.clusters"}}{{t 'nav.environment.manage'}}{{/link-to-external}}</li>
|
||||
{{/if}}
|
||||
|
||||
<li>{{#link-to-external "authenticated.prefs"}}{{t 'nav.userPreferences.link'}}{{/link-to-external}}</li>
|
||||
|
||||
{{#if accessEnabled}}
|
||||
<li role="separator" class="divider"></li>
|
||||
<li>{{#link-to-external "logout" class="user-logout"}}<i class="icon icon-logout"></i> {{t 'nav.user.logout'}}{{/link-to-external}}</li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
|
@ -82,14 +82,14 @@ export default Controller.extend({
|
|||
launchOnCluster(model) {
|
||||
let authenticated = getOwner(this).lookup('route:authenticated');
|
||||
if (this.get('scope.current.id') === model.get('defaultProject.id')) {
|
||||
this.transitionToRoute('authenticated.clusters.cluster.host-templates', model.get('id'), {queryParams: {backTo: 'clusters'}});
|
||||
this.transitionToRoute('authenticated.cluster.host-templates', model.get('id'), {queryParams: {backTo: 'clusters'}});
|
||||
} else {
|
||||
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.clusters.cluster.host-templates', [model.id, {queryParams: {backTo: 'clusters'}}]);
|
||||
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.cluster.host-templates', [model.id, {queryParams: {backTo: 'clusters'}}]);
|
||||
}
|
||||
},
|
||||
useKubernetes(model) {
|
||||
let authenticated = getOwner(this).lookup('route:authenticated');
|
||||
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.clusters.cluster.import', [model.id, {queryParams: {backTo: 'clusters'}}]);
|
||||
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.cluster.import', [model.id, {queryParams: {backTo: 'clusters'}}]);
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -11,14 +11,16 @@ const Eng = Engine.extend({
|
|||
dependencies: {
|
||||
services: [
|
||||
'access',
|
||||
'router',
|
||||
'authn-store',
|
||||
'authz-store',
|
||||
'resource-actions',
|
||||
'catalog',
|
||||
'cluster-store',
|
||||
'endpoint',
|
||||
'github',
|
||||
'intl',
|
||||
'modal',
|
||||
'resource-actions',
|
||||
'router',
|
||||
'scope',
|
||||
'session',
|
||||
'settings',
|
||||
|
|
@ -31,9 +33,8 @@ const Eng = Engine.extend({
|
|||
'index',
|
||||
'failWhale',
|
||||
'authenticated',
|
||||
'authenticated.clusters',
|
||||
'authenticated.clusters.cluster',
|
||||
'authenticated.clusters.project',
|
||||
'authenticated.cluster',
|
||||
'authenticated.project',
|
||||
'authenticated.prefs',
|
||||
'logout'
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,9 +1,15 @@
|
|||
import EmberObject from '@ember/object';
|
||||
import config from '../config/environment';
|
||||
|
||||
const copyKeys = ['baseAssets'];
|
||||
|
||||
export function initialize(application) {
|
||||
// Inject the contents of ENV.APP in config/environment.js into all the things as an 'app' property
|
||||
let app = EmberObject.extend(config.APP);
|
||||
const data = EmberObject.create();
|
||||
copyKeys.forEach((key) => {
|
||||
data[key] = window.Ui[key]; // @TODO-2.0 blech
|
||||
});
|
||||
|
||||
const app = EmberObject.extend(data);
|
||||
|
||||
application.register('config:app', app);
|
||||
|
||||
application.inject('controller','app', 'config:app');
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@ export default buildRoutes(function() {
|
|||
this.route('new', {path: '/add'});
|
||||
});
|
||||
|
||||
this.route('clusters', {path: '/clusters'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('new', {path: '/add'}, function() {
|
||||
this.route('rke');
|
||||
});
|
||||
});
|
||||
|
||||
this.route('roles', {path: '/roles'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('edit', {path: '/:role_id'});
|
||||
|
|
@ -18,6 +25,11 @@ export default buildRoutes(function() {
|
|||
this.route('new', {path: '/add'});
|
||||
});
|
||||
|
||||
this.route('machines', {path: '/machines'}, function() {
|
||||
this.route('index', {path: '/'});
|
||||
this.route('templates');
|
||||
});
|
||||
|
||||
this.route('audit-logs');
|
||||
this.route('catalog');
|
||||
|
||||
|
|
|
|||
|
|
@ -7,16 +7,9 @@ export default Route.extend({
|
|||
userStore: service('user-store'),
|
||||
settings: service(),
|
||||
scope: service(),
|
||||
activate() {
|
||||
if (this.get('scope.current')) {
|
||||
this.get('scope').setPageScope('project');
|
||||
} else if (this.get('scope.currentCluster')) {
|
||||
this.get('scope').setPageScope('cluster');
|
||||
}
|
||||
},
|
||||
|
||||
redirect() {
|
||||
this.transitionTo('accounts');
|
||||
activate() {
|
||||
this.get('scope').setPageScope('global');
|
||||
},
|
||||
|
||||
beforeModel() {
|
||||
|
|
@ -30,6 +23,7 @@ export default Route.extend({
|
|||
model() {
|
||||
let settings = this.get('settings');
|
||||
|
||||
// @TODO-2.0
|
||||
return EmberObject.create({
|
||||
host: '',
|
||||
catalog: '',
|
||||
|
|
|
|||
|
|
@ -1,13 +1,8 @@
|
|||
import Route from '@ember/routing/route';
|
||||
import { inject as service } from '@ember/service';
|
||||
import { inject as service } from "@ember/service";
|
||||
|
||||
export default Route.extend({
|
||||
scope: service(),
|
||||
|
||||
activate() {
|
||||
this._super();
|
||||
this.get('scope').setPageScope('clusters');
|
||||
},
|
||||
clusterStore: service('cluster-store'),
|
||||
|
||||
model() {
|
||||
var clusterStore = this.get('clusterStore');
|
||||
|
|
@ -2,6 +2,6 @@ import Route from '@ember/routing/route';
|
|||
|
||||
export default Route.extend({
|
||||
redirect: function() {
|
||||
this.transitionTo('accounts');
|
||||
this.transitionTo('clusters');
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,15 +1 @@
|
|||
<section>
|
||||
<section class="header has-tabs clearfix p-0">
|
||||
<ul class="tab-nav">
|
||||
<li>{{#link-to "accounts"}}{{t 'nav.admin.accounts'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "roles.index" (query-params type="project")}}{{t 'nav.admin.projectRoles'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "roles.index" (query-params type="cluster")}}{{t 'nav.admin.clusterRoles'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "policies.index"}}{{t 'nav.admin.podSecurityPolicies'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "audit-logs"}}{{t 'nav.admin.audit'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "settings.auth"}}{{t 'nav.admin.settings.auth'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "settings.machine"}}{{t 'nav.admin.settings.machine'}}{{/link-to}}</li>
|
||||
<li>{{#link-to "settings.advanced"}}{{t 'nav.admin.settings.advanced'}}{{/link-to}}</li>
|
||||
</ul>
|
||||
</section>
|
||||
{{outlet}}
|
||||
</section>
|
||||
{{outlet}}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<h1 class="pull-left">{{t 'clustersPage.header'}}</h1> <div class="vertical-middle"></div>
|
||||
|
||||
<div class="right-buttons">
|
||||
{{#link-to "authenticated.clusters.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
{{#link-to "clusters.new" class="btn bg-primary btn-sm icon-btn"}}
|
||||
<span class="darken"><i class="icon icon-cluster"></i></span>
|
||||
<span>{{t 'clustersPage.newCluster'}}</span>
|
||||
{{/link-to}}
|
||||
|
|
@ -0,0 +1 @@
|
|||
Machines
|
||||
|
|
@ -1,3 +1,11 @@
|
|||
<section class="header clearfix">
|
||||
<h1>{{t 'podSecurityPoliciesPage.header'}}</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
{{#link-to "policies.new" classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'podSecurityPoliciesPage.addPodSecurityPolicy'}} {{/link-to}}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="instances">
|
||||
{{#sortable-table
|
||||
classNames="grid sortable-table"
|
||||
|
|
@ -6,7 +14,6 @@
|
|||
headers=headers
|
||||
searchText=searchText
|
||||
body=filtered
|
||||
rightActions=true
|
||||
as |sortable kind row dt|
|
||||
}}
|
||||
{{#if (eq kind "row")}}
|
||||
|
|
@ -30,8 +37,6 @@
|
|||
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'podSecurityPoliciesPage.index.table.noMatch'}}</td>
|
||||
{{else if (eq kind "norows")}}
|
||||
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'podSecurityPoliciesPage.index.table.noData'}}</td>
|
||||
{{else if (eq kind "right-actions")}}
|
||||
{{#link-to "policies.new" classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'podSecurityPoliciesPage.addPodSecurityPolicy'}} {{/link-to}}
|
||||
{{/if}}
|
||||
{{/sortable-table}}
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,18 @@
|
|||
<section class="header has-tabs clearfix p-0">
|
||||
<ul class="tab-nav">
|
||||
<li>{{#link-to (query-params type="project")}}{{t 'rolesPage.index.projectRoles'}}{{/link-to}}</li>
|
||||
<li>{{#link-to (query-params type="cluster")}}{{t 'rolesPage.index.clusterRoles'}}{{/link-to}}</li>
|
||||
</ul>
|
||||
|
||||
<div class="right-buttons">
|
||||
{{#if (eq type "project")}}
|
||||
{{#link-to "roles.new" (query-params type="project") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addProjectRole'}} {{/link-to}}
|
||||
{{else if (eq type "cluster")}}
|
||||
{{#link-to "roles.new" (query-params type="cluster") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addClusterRole'}} {{/link-to}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="instances">
|
||||
{{#sortable-table
|
||||
classNames="grid sortable-table"
|
||||
|
|
@ -6,7 +21,6 @@
|
|||
headers=headers
|
||||
searchText=searchText
|
||||
body=filtered
|
||||
rightActions=true
|
||||
as |sortable kind row dt|
|
||||
}}
|
||||
{{#if (eq kind "row")}}
|
||||
|
|
@ -30,12 +44,6 @@
|
|||
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'rolesPage.index.table.noMatch'}}</td>
|
||||
{{else if (eq kind "norows")}}
|
||||
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'rolesPage.index.table.noData'}}</td>
|
||||
{{else if (eq kind "right-actions")}}
|
||||
{{#if (eq type "project")}}
|
||||
{{#link-to "roles.new" (query-params type="project") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addProjectRole'}} {{/link-to}}
|
||||
{{else if (eq type "cluster")}}
|
||||
{{#link-to "roles.new" (query-params type="cluster") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addClusterRole'}} {{/link-to}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/sortable-table}}
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
{{badge-state model=model}}
|
||||
</td>
|
||||
<td data-title="{{dt.name}}">
|
||||
<a href="{{href-to 'authenticated.clusters.cluster' model.id}}">{{model.displayName}}</a>
|
||||
{{#link-to-external 'authenticated.cluster' model.id}}{{model.displayName}}{{/link-to-external}}
|
||||
</td>
|
||||
{{#if (eq model.state "inactive")}}
|
||||
<td colspan="4" class="text-center">
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
{{t 'clusterWelcome.embeddedDescription' appName=settings.appName htmlSafe=true}}
|
||||
{{#if canCreate}}
|
||||
<div class="links" style="top: auto; bottom: 30px;">
|
||||
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
{{#link-to "authenticated.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
|
@ -51,7 +51,7 @@
|
|||
|
||||
{{#if canImport}}
|
||||
<div class="links" style="top: auto; bottom: 30px;">
|
||||
{{#link-to "authenticated.clusters.cluster.import" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
{{#link-to "authenticated.cluster.import" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -294,6 +294,7 @@ export default Component.extend(NewOrEdit, {
|
|||
} else if ( this.get('namespace') ) {
|
||||
namespacePromise = this.get('namespace').save().then((newNamespace) => {
|
||||
pr.set('namespaceId', newNamespace.get('id'));
|
||||
return newNamespace.waitForState('active');
|
||||
});
|
||||
} else {
|
||||
// This shouldn't happen since willSave checked it...
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<div class="{{rowClass}} gutless">
|
||||
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}" style="padding-right: 1%">
|
||||
<div class="{{rowClass}}">
|
||||
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}">
|
||||
|
||||
<label for="{{concat elementId '-form-name'}}" class="pb-5 acc-label">{{t nameLabel}}{{#if nameRequired}}{{field-required}}{{/if}}</label>
|
||||
{{#if (and descriptionShown (not descriptionExpanded))}}
|
||||
|
|
@ -12,13 +12,13 @@
|
|||
{{#if nameHelpText}}<p class="text-info">{{nameHelpText}}</p>{{/if}}
|
||||
</div>
|
||||
{{#if hasBlock}}
|
||||
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}" style="padding-left: 1%;">
|
||||
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}">
|
||||
{{yield}}
|
||||
</div>
|
||||
{{/if }}
|
||||
|
||||
{{#if (and descriptionShown descriptionExpanded)}}
|
||||
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}" style="padding-right: 1%;">
|
||||
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}">
|
||||
<div>
|
||||
<label for="{{concat elementId '-form-description'}}" class="pb-5 acc-label desc-label">{{t descriptionLabel}}{{#if descriptionRequired}}{{field-required}}{{/if}}</label>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
<div class="itemwrap m-10"><p>{{t 'hostTemplatesPage.new.helpText'}}</p></div>
|
||||
<div class="footer">
|
||||
<button role="button" class="ml-10 btn btn-sm bg-transparent" {{action (action add)}}>{{t 'hostTemplatesPage.new.btn'}}</button>
|
||||
{{!-- {{#link-to "authenticated.clusters.cluster.host-new" classNames="btn bg-default"}}{{t 'hostTemplatesPage.new.btn'}}{{/link-to}} --}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -36,7 +35,7 @@
|
|||
{{host.description}}
|
||||
</div>
|
||||
{{else if (eq section 'footer')}}
|
||||
<button role="button" class="btn bg-primary" {{action (action launch host)}}>{{t 'hostTemplatesPage.templateBox.button'}}</button>
|
||||
<button role="button" class="btn bg-primary" {{action launch host}}>{{t 'hostTemplatesPage.templateBox.button'}}</button>
|
||||
{{/if}}
|
||||
{{/catalog-box}}
|
||||
{{/each}}
|
||||
|
|
@ -44,6 +43,6 @@
|
|||
{{#unless app.isCaas}}
|
||||
<div class="text-center">
|
||||
<a href="#" class="ml-10 btn btn-sm bg-transparent">{{t 'hostTemplatesPage.custom'}}</a>
|
||||
{{!-- {{#link-to "authenticated.clusters.cluster.host-new" (query-params driver="custom") classNames="ml-10 btn btn-sm bg-transparent"}}{{t 'hostTemplatesPage.custom'}}{{/link-to}} --}}
|
||||
{{!-- {{#link-to "authenticated.cluster.host-new" (query-params driver="custom") classNames="ml-10 btn btn-sm bg-transparent"}}{{t 'hostTemplatesPage.custom'}}{{/link-to}} --}}
|
||||
</div>
|
||||
{{/unless}}
|
||||
{{/unless}}
|
||||
|
|
|
|||
|
|
@ -17,14 +17,17 @@ export default Component.extend(ModalBase, {
|
|||
launchHostDriver: null,
|
||||
launchHost: null,
|
||||
addHostModel: null,
|
||||
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
set(this, 'mode', 'hostTemplate');
|
||||
},
|
||||
|
||||
actions: {
|
||||
completed(cb) {
|
||||
this.get('modalService').toggleModal();
|
||||
},
|
||||
|
||||
launch(template) {
|
||||
let driver = get(this, 'drivers').findBy('name', get(template, 'driver'));
|
||||
this.setProperties({
|
||||
|
|
@ -33,12 +36,14 @@ export default Component.extend(ModalBase, {
|
|||
launchHostDriver: driver,
|
||||
});
|
||||
},
|
||||
|
||||
// cancel() {},
|
||||
//
|
||||
goBack() {
|
||||
this.get('modalService').toggleModal();
|
||||
},
|
||||
|
||||
add() {
|
||||
let mOut =
|
||||
this.setProperties({
|
||||
mode: 'add',
|
||||
addHostModel: {
|
||||
|
|
|
|||
|
|
@ -17,4 +17,4 @@
|
|||
}}
|
||||
{{else if (eq mode 'add')}}
|
||||
{{add-host allowCustom=(not app.isCaas) model=addHostModel.model driver=driver cluster=cluster hostId=hostId inModal=true completed=(action 'completed') goBack=(action 'goBack') cancel=(action 'goBack')}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ export default Component.extend(NewOrEdit, {
|
|||
},
|
||||
|
||||
goBack: function () {
|
||||
this.get('router').transitionTo('authenticated.clusters.cluster.projects.index');
|
||||
this.get('router').transitionTo('authenticated.cluster.projects.index');
|
||||
},
|
||||
|
||||
doesNameExist() {
|
||||
|
|
|
|||
|
|
@ -15,12 +15,10 @@
|
|||
nameRequired=true
|
||||
nameDisabled=editing
|
||||
namePlaceholder="projectsPage.new.form.name.placeholder"
|
||||
colClass="col span-7"
|
||||
descriptionShown=false
|
||||
}}
|
||||
</section>
|
||||
|
||||
{{#accordion-list as | al expandFn | }}
|
||||
{{#accordion-list showExpandAll=false as | al expandFn | }}
|
||||
{{#accordion-list-item
|
||||
title="Members"
|
||||
detail="Who has access to this project and what level of access they have to manipulate it."
|
||||
|
|
@ -64,16 +62,6 @@
|
|||
</button>
|
||||
</div>
|
||||
{{/accordion-list-item}}
|
||||
|
||||
{{#accordion-list-item
|
||||
title="Namespaces"
|
||||
detail="The Kubernetes namespaces that are managed by this project."
|
||||
expandAll=al.expandAll
|
||||
expand=(action expandFn)
|
||||
expandOnInit=true
|
||||
}}
|
||||
Namespaces...
|
||||
{{/accordion-list-item}}
|
||||
{{/accordion-list}}
|
||||
|
||||
{{top-errors errors=errors}}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export default Component.extend({
|
|||
actions: {
|
||||
switchCluster(cluster) {
|
||||
this.get('projects').setCurrentCluster(cluster).then(() => {
|
||||
this.sendAction('switchCluster', cluster.id, 'authenticated.clusters.cluster', [cluster.id]);
|
||||
this.sendAction('switchCluster', cluster.id, 'authenticated.cluster', [cluster.id]);
|
||||
});
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -17,8 +17,9 @@
|
|||
<div class="clip">
|
||||
{{t 'nav.environment.manage'}}
|
||||
</div>
|
||||
{{else if (eq scope "admin")}}
|
||||
{{else if (eq scope "global")}}
|
||||
<div class="clip">
|
||||
<i class="icon icon-globe icon-fw"></i>
|
||||
{{t 'nav.admin.tab'}}
|
||||
</div>
|
||||
{{else}}
|
||||
|
|
@ -33,11 +34,13 @@
|
|||
</a>
|
||||
|
||||
<ul class="dropdown-menu cluster-menu" role="menu" data-dropdown-id="environment">
|
||||
{{#if (and isOwner scope.current)}}
|
||||
<li>{{#link-to "authenticated.clusters.project" scope.current.id class="clip"}}{{t 'nav.environment.edit' name=scope.current.displayName}}{{/link-to}}</li>
|
||||
<li role="presentation" class="divider"></li>
|
||||
{{/if}}
|
||||
|
||||
<li class="header {{if (eq scope "global") 'active selected'}}">
|
||||
<a href="{{href-to "global-admin"}}">
|
||||
<i class="icon icon-globe icon-fw"></i>
|
||||
{{t 'nav.admin.tab'}}
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation" class="divider"></li>
|
||||
|
||||
{{#if projectIsMissing}}
|
||||
<li role="presentation" class="dropdown-header">{{t 'nav.environment.selected'}}</li>
|
||||
|
|
@ -56,7 +59,7 @@
|
|||
<li role="presentation" class="divider"></li>
|
||||
{{/if}}
|
||||
<li class="header {{if entry.active (if (eq scope 'cluster') 'active selected') 'inactive'}}">
|
||||
<a href="#" {{action "switchCluster" entry.cluster 'authenticated.clusters.cluster'}}>
|
||||
<a href="#" {{action "switchCluster" entry.cluster 'authenticated.cluster'}}>
|
||||
<i class="icon icon-cluster icon-fw"></i>
|
||||
|
||||
Cluster: {{entry.cluster.displayName}}
|
||||
|
|
|
|||
|
|
@ -102,16 +102,6 @@
|
|||
</a>
|
||||
|
||||
<ul class="dropdown-menu dropdown-menu-right" data-dropdown-id="header-user-menu">
|
||||
<li class="{{if (eq scope "clusters") 'active selected'}}">
|
||||
{{#link-to "authenticated.clusters"}}{{t 'nav.environment.manage'}}{{/link-to}}
|
||||
</li>
|
||||
|
||||
{{#if isAdmin}}
|
||||
<li class="">
|
||||
{{#link-to "global-admin"}}{{t 'nav.admin.tab' appName=settings.appName}}{{/link-to}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if accessEnabled}}
|
||||
<li role="presentation" class="user-auth">
|
||||
{{identity-block avatar=false identity=access.identity}}
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
</td>
|
||||
<td data-title="{{t 'projects.table.project.label'}}:" class="clip">
|
||||
{{#link-to "authenticated.clusters.cluster.projects.edit" model.id }} {{model.name}} {{/link-to}}
|
||||
{{#link-to "authenticated.project" model.id }} {{model.name}} {{/link-to}}
|
||||
</td>
|
||||
<td data-title="{{t 'projects.table.created.label'}}:">
|
||||
{{date-calendar model.created}}
|
||||
</td>
|
||||
<td data-title="{{t 'generic.actions'}}:" class="actions">
|
||||
{{action-menu model=model}}
|
||||
</td>
|
||||
</td>
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
|
|
@ -124,6 +124,7 @@ accountsPage:
|
|||
|
||||
podSecurityPoliciesPage:
|
||||
index:
|
||||
header: Pod Security Policies
|
||||
table:
|
||||
name: Name
|
||||
created: Created Time
|
||||
|
|
@ -517,6 +518,10 @@ certificatesPage:
|
|||
description:
|
||||
placeholder: e.g. EV cert for mydomain.com
|
||||
|
||||
namespacesPage:
|
||||
header: Namespaces
|
||||
addNamespace: Add Namespace
|
||||
|
||||
projectsPage:
|
||||
header: Projects
|
||||
addProject: Add Project
|
||||
|
|
@ -889,7 +894,7 @@ hostsPage:
|
|||
docker: Docker
|
||||
instanceState: Container States
|
||||
instanceStateWithIcon: States
|
||||
noData: You do not have any hosts yet
|
||||
noData: You do not have any nodes yet
|
||||
noMatch: No hosts match the current search
|
||||
new:
|
||||
header:
|
||||
|
|
@ -3818,11 +3823,11 @@ nav:
|
|||
all: All Environments
|
||||
your: Your Environments
|
||||
selected: Selected Environment
|
||||
manage: Manage Clusters
|
||||
edit: 'Edit "{name}"'
|
||||
cluster:
|
||||
dashboard: Dashboard
|
||||
hosts: Nodes
|
||||
k8s: Kubernetes
|
||||
namespaces: Namespaces
|
||||
networking: Networking
|
||||
storage: Storage
|
||||
projects: Projects
|
||||
|
|
@ -3864,15 +3869,12 @@ nav:
|
|||
hooks: Webhooks
|
||||
templateKeys: Template Keys
|
||||
admin:
|
||||
tab: Admin Settings
|
||||
audit: Audit Log
|
||||
processes: Processes
|
||||
podSecurityPolicies: Pod Security Policies
|
||||
accounts: Accounts
|
||||
catalog: Catalogs
|
||||
ha: HA
|
||||
projectRoles: Project Roles
|
||||
clusterRoles: Cluster Roles
|
||||
tab: Global
|
||||
accounts: Users
|
||||
clusters: Clusters
|
||||
machines: Machines
|
||||
roles: Roles
|
||||
podSecurityPolicies: PSPs
|
||||
settings:
|
||||
tab: Settings
|
||||
auth: Access Control
|
||||
|
|
|
|||
Loading…
Reference in New Issue