diff --git a/.gitignore b/.gitignore
index 041bb0e72..00c0ac912 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,5 @@ tests/vagrant/setups/
venv/
virtualenv/
wheelhouse/
+.coverage
+coverage.xml
diff --git a/images/aquarium/config.sh b/images/aquarium/config.sh
index ceff81701..30880dfc6 100644
--- a/images/aquarium/config.sh
+++ b/images/aquarium/config.sh
@@ -103,6 +103,7 @@ if [[ "$kiwi_profiles" == *"Vagrant"* ]]; then
fi
pip install fastapi==0.63.0 uvicorn==0.13.3 websockets==8.1 \
+ bcrypt==3.2.0 pyjwt==2.1.0 python-multipart==0.0.5 \
git+https://github.com/aquarist-labs/aetcd3/@edf633045ce61c7bbac4d4a6ca15b14f8acfe9cd
baseInsertService aquarium-boot
baseInsertService sshd
diff --git a/src/aquarium.py b/src/aquarium.py
index c7c2c80df..29cc19729 100755
--- a/src/aquarium.py
+++ b/src/aquarium.py
@@ -39,12 +39,14 @@
local,
devices,
nfs,
+ auth,
+ user,
)
logger: logging.Logger = fastapi_logger
-async def aquarium_startup(aquarium_app: FastAPI, aquarium_api: FastAPI):
+async def aquarium_startup(_: FastAPI, aquarium_api: FastAPI):
lvl = "INFO" if not os.getenv("AQUARIUM_DEBUG") else "DEBUG"
setup_logging(lvl)
logger.info("Aquarium startup!")
@@ -100,7 +102,7 @@ async def aquarium_startup(aquarium_app: FastAPI, aquarium_api: FastAPI):
aquarium_api.state.nodemgr = nodemgr
-async def aquarium_shutdown(aquarium_app: FastAPI, aquarium_api: FastAPI):
+async def aquarium_shutdown(_: FastAPI, aquarium_api: FastAPI):
logger.info("Aquarium shutdown!")
await aquarium_api.state.gstate.shutdown()
logger.info("shutting down node manager")
@@ -136,6 +138,14 @@ def aquarium_factory(
{
"name": "devices",
"description": "Obtain and perform operations on cluster devices"
+ },
+ {
+ "name": "auth",
+ "description": "Operations related to user authentication"
+ },
+ {
+ "name": "user",
+ "description": "Operations related to user management"
}
]
@@ -163,6 +173,8 @@ async def on_shutdown():
aquarium_api.include_router(nodes.router)
aquarium_api.include_router(devices.router)
aquarium_api.include_router(nfs.router)
+ aquarium_api.include_router(auth.router)
+ aquarium_api.include_router(user.router)
#
# mounts
diff --git a/src/glass/src/app/app-routing.module.ts b/src/glass/src/app/app-routing.module.ts
index 6bdd9c7cc..2b1a40d7e 100644
--- a/src/glass/src/app/app-routing.module.ts
+++ b/src/glass/src/app/app-routing.module.ts
@@ -25,9 +25,12 @@ import { HostsPageComponent } from '~/app/pages/hosts-page/hosts-page.component'
import { InstallModePageComponent } from '~/app/pages/install-mode-page/install-mode-page.component';
import { InstallCreateWizardPageComponent } from '~/app/pages/install-wizard/install-create-wizard-page/install-create-wizard-page.component';
import { InstallJoinWizardPageComponent } from '~/app/pages/install-wizard/install-join-wizard-page/install-join-wizard-page.component';
+import { LoginPageComponent } from '~/app/pages/login-page/login-page.component';
import { NotFoundPageComponent } from '~/app/pages/not-found-page/not-found-page.component';
import { ServicesPageComponent } from '~/app/pages/services-page/services-page.component';
+import { UsersPageComponent } from '~/app/pages/users-page/users-page.component';
import { WelcomePageComponent } from '~/app/pages/welcome-page/welcome-page.component';
+import { AuthGuardService } from '~/app/shared/services/auth-guard.service';
import { StatusRouteGuardService } from '~/app/shared/services/status-route-guard.service';
const routes: Routes = [
@@ -40,6 +43,8 @@ const routes: Routes = [
{
path: 'dashboard',
data: { breadcrumb: TEXT('Dashboard') },
+ canActivate: [AuthGuardService],
+ canActivateChild: [AuthGuardService],
children: [
{ path: '', component: DashboardPageComponent },
{
@@ -47,7 +52,8 @@ const routes: Routes = [
component: ServicesPageComponent,
data: { breadcrumb: TEXT('Services') }
},
- { path: 'hosts', component: HostsPageComponent, data: { breadcrumb: TEXT('Hosts') } }
+ { path: 'hosts', component: HostsPageComponent, data: { breadcrumb: TEXT('Hosts') } },
+ { path: 'users', component: UsersPageComponent, data: { breadcrumb: TEXT('Users') } }
]
}
]
@@ -74,6 +80,7 @@ const routes: Routes = [
path: '',
component: BlankLayoutComponent,
children: [
+ { path: 'login', component: LoginPageComponent },
{
path: '404',
component: NotFoundPageComponent
diff --git a/src/glass/src/app/core/layouts/blank-layout/blank-layout.component.html b/src/glass/src/app/core/layouts/blank-layout/blank-layout.component.html
index 0680b43f9..358c9c27f 100644
--- a/src/glass/src/app/core/layouts/blank-layout/blank-layout.component.html
+++ b/src/glass/src/app/core/layouts/blank-layout/blank-layout.component.html
@@ -1 +1,3 @@
-
+
+
+
diff --git a/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.html b/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.html
index 033acbe25..f9df6d786 100644
--- a/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.html
+++ b/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.html
@@ -2,18 +2,20 @@
{{ config.title }}
-
-
+
+
+ {{ config.submitButtonText! | translate }}
+
diff --git a/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.ts b/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.ts
index a1260e319..3e6c07b32 100644
--- a/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.ts
+++ b/src/glass/src/app/core/modals/declarative-form/declarative-form-modal.component.ts
@@ -23,8 +23,9 @@ export class DeclarativeFormModalComponent {
) {
this.config = _.defaultsDeep(data, {
fields: [],
- okButtonVisible: true,
- okButtonText: TEXT('OK'),
+ submitButtonVisible: true,
+ submitButtonText: TEXT('OK'),
+ submitButtonResult: undefined,
cancelButtonVisible: true,
cancelButtonText: TEXT('Cancel'),
cancelButtonResult: false
@@ -32,9 +33,9 @@ export class DeclarativeFormModalComponent {
}
onOK(): void {
- const result = _.isUndefined(this.config.okButtonResult)
+ const result = _.isUndefined(this.config.submitButtonResult)
? this.form.values
- : this.config.okButtonResult;
+ : this.config.submitButtonResult;
this.matDialogRef.close(result);
}
}
diff --git a/src/glass/src/app/core/modals/file-service/file-service-modal.component.html b/src/glass/src/app/core/modals/file-service/file-service-modal.component.html
index f2ced2b47..397d2275e 100644
--- a/src/glass/src/app/core/modals/file-service/file-service-modal.component.html
+++ b/src/glass/src/app/core/modals/file-service/file-service-modal.component.html
@@ -130,7 +130,9 @@
-
+