From c0ffcacc4ed5da5b8fa7dc81ee66de23765db89b Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Thu, 31 Mar 2022 00:53:47 -0700 Subject: [PATCH] working with accounts --- cli/src/components/Setup.tsx | 6 --- .../core-or-periphery/CoreOrPeriphery.tsx | 9 +--- .../deployment-config/DeploymentConfig.tsx | 8 +--- cli/src/config.ts | 6 +++ cli/src/util/mongoose/deployment.ts | 2 +- core/src/messages/builds/clone.ts | 10 +++-- core/src/plugins/db/builds.ts | 2 +- core/src/plugins/db/deployments.ts | 2 +- .../src/components/builds/tabs/Provider.tsx | 4 +- .../builds/tabs/build-config/BuildConfig.tsx | 2 +- .../builds/tabs/build-config/Docker.tsx | 25 ++++++++++- .../components/builds/tabs/git-config/Git.tsx | 29 ++++++++---- .../deployment/tabs/config/Config.tsx | 2 + .../deployment/tabs/config/DockerAccount.tsx | 35 +++++++++++++++ .../deployment/tabs/config/Restart.tsx | 11 ++--- .../src/components/util/menu/Menu.module.css | 4 ++ .../src/components/util/menu/Selector.tsx | 1 + frontend/src/state/StateProvider.tsx | 9 +++- frontend/tsconfig.json | 3 +- package.json | 2 +- periphery/src/routes/git.ts | 45 +++++++++++++------ types/types.d.ts | 5 +-- 22 files changed, 153 insertions(+), 69 deletions(-) create mode 100644 frontend/src/components/deployment/tabs/config/DockerAccount.tsx diff --git a/cli/src/components/Setup.tsx b/cli/src/components/Setup.tsx index 4f6c167f6..e2d3d5966 100644 --- a/cli/src/components/Setup.tsx +++ b/cli/src/components/Setup.tsx @@ -129,12 +129,6 @@ function getInitialUpdate(config: Config): Update { function getNextUpdate({ stage }: Update): Update | undefined { switch (stage) { case "mongo": - return { - stage: "registry", - description: "starting registry...", - }; - - case "registry": return { stage: "core", description: "starting monitor core...", diff --git a/cli/src/components/core-or-periphery/CoreOrPeriphery.tsx b/cli/src/components/core-or-periphery/CoreOrPeriphery.tsx index 244ccaaf9..8d3f958ec 100644 --- a/cli/src/components/core-or-periphery/CoreOrPeriphery.tsx +++ b/cli/src/components/core-or-periphery/CoreOrPeriphery.tsx @@ -3,7 +3,7 @@ import { Box, Newline, Text } from "ink"; import { useConfig, useMainSequence } from "../../cli"; import { useEsc, useStore } from "../../util/hooks"; import YesNo from "../util/YesNo"; -import { DEFAULT_PERIPHERY_PORT, DEFAULT_PORT } from "../../config"; +import { DEFAULT_PERIPHERY_PORT, DEFAULT_PORT, RESTART_MODES } from "../../config"; import EnterToContinue from "../util/EnterToContinue"; import { ControlledInput } from "../util/Input"; import NumberInput from "../util/NumberInput"; @@ -13,13 +13,6 @@ import { toDashedName } from "../../util/helpers/general"; type Stage = "name" | "secret" | "port" | "restart" | "confirm"; -const RESTART_MODES = [ - "always", - "on failure", - "unless stopped", - "don't restart", -]; - const CoreOrPeriphery = ({ type }: { type: "core" | "periphery" }) => { const { set } = useConfig(); const { next, prev } = useMainSequence(); diff --git a/cli/src/components/deployment-config/DeploymentConfig.tsx b/cli/src/components/deployment-config/DeploymentConfig.tsx index 93b868d6c..3125c58d4 100644 --- a/cli/src/components/deployment-config/DeploymentConfig.tsx +++ b/cli/src/components/deployment-config/DeploymentConfig.tsx @@ -7,6 +7,7 @@ import YesNo from "../util/YesNo"; import { toDashedName } from "../../util/helpers/general"; import { Input } from "../util/Input"; import NumberInput from "../util/NumberInput"; +import { RESTART_MODES } from "../../config"; type DeploymentConfig = { stage: "name" | "port" | "volume" | "restart" | "confirm"; @@ -16,13 +17,6 @@ type DeploymentConfig = { restart?: string; }; -const RESTART_MODES = [ - "always", - "on failure", - "unless stopped", - "don't restart", -]; - const DeploymentConfig = ({ deployment, onFinish, diff --git a/cli/src/config.ts b/cli/src/config.ts index b412666d4..51c63bd2c 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -5,3 +5,9 @@ export const DEFAULT_REGISTRY_URL = "registry:5000/"; export const CORE_IMAGE = "mbecker2020/monitor-core"; export const PERIPHERY_IMAGE = "mbecker2020/monitor-periphery"; export const DOCKER_NETWORK = "monitor-network"; +export const RESTART_MODES = [ + "don't restart", + "unless stopped", + "on failure", + "always", +]; diff --git a/cli/src/util/mongoose/deployment.ts b/cli/src/util/mongoose/deployment.ts index a79cd1e64..13f8e4876 100644 --- a/cli/src/util/mongoose/deployment.ts +++ b/cli/src/util/mongoose/deployment.ts @@ -31,8 +31,8 @@ export default function deploymentModel() { /* to manage repo for static frontend, mounted as a volume */ repo: String, branch: String, - accessToken: String, containerMount: String, // the file path to mount repo on inside the container + githubAccount: String, }); return model("Deployment", schema) diff --git a/core/src/messages/builds/clone.ts b/core/src/messages/builds/clone.ts index e59271af5..0ca00f65d 100644 --- a/core/src/messages/builds/clone.ts +++ b/core/src/messages/builds/clone.ts @@ -7,25 +7,27 @@ import { } from "@monitor/util"; import { join } from "path"; import { FastifyInstance } from "fastify"; -import { BUILD_REPO_PATH } from "../../config"; +import { BUILD_REPO_PATH, SECRETS } from "../../config"; import { addBuildUpdate } from "../../util/updates"; async function cloneRepo( app: FastifyInstance, user: User, - { pullName, branch, repo, subfolder, onClone, accessToken, _id }: Build + { pullName, branch, repo, subfolder, onClone, githubAccount, _id }: Build ) { const cloneCle = await clone( repo!, BUILD_REPO_PATH + pullName!, subfolder, branch, - accessToken + githubAccount && SECRETS.GITHUB_ACCOUNTS[githubAccount] ); const onCloneCle = onClone && (await execute( - `cd ${join(BUILD_REPO_PATH, pullName!, onClone.path || "")} && ${onClone.command}` + `cd ${join(BUILD_REPO_PATH, pullName!, onClone.path || "")} && ${ + onClone.command + }` )); const { command, log, isError } = mergeCommandLogError( { diff --git a/core/src/plugins/db/builds.ts b/core/src/plugins/db/builds.ts index 813c2d7af..578cbee7b 100644 --- a/core/src/plugins/db/builds.ts +++ b/core/src/plugins/db/builds.ts @@ -13,7 +13,7 @@ const builds = fp((app: FastifyInstance, _: {}, done: () => void) => { /* repo related */ repo: String, branch: String, - accessToken: String, + githubAccount: String, onClone: Command, /* build related */ cliBuild: Command, diff --git a/core/src/plugins/db/deployments.ts b/core/src/plugins/db/deployments.ts index 370e70786..c711c0799 100644 --- a/core/src/plugins/db/deployments.ts +++ b/core/src/plugins/db/deployments.ts @@ -24,7 +24,7 @@ const deployments = fp((app: FastifyInstance, _: {}, done: () => void) => { /* to manage repo for static frontend, mounted as a volume */ repo: String, branch: String, - accessToken: String, + githubAccount: String, containerMount: String, // the file path to mount repo on inside the container onPull: Command, }); diff --git a/frontend/src/components/builds/tabs/Provider.tsx b/frontend/src/components/builds/tabs/Provider.tsx index ec648fe06..85dc0df7c 100644 --- a/frontend/src/components/builds/tabs/Provider.tsx +++ b/frontend/src/components/builds/tabs/Provider.tsx @@ -1,9 +1,9 @@ import { Build, Update } from "@monitor/types"; -import { Accessor, Component, createContext, createEffect, createSignal, onCleanup, useContext } from "solid-js"; +import { Component, createContext, createEffect, createResource, onCleanup, Resource, useContext } from "solid-js"; import { createStore, DeepReadonly, SetStoreFunction } from "solid-js/store"; import { ADD_UPDATE, UPDATE_BUILD } from "../../../state/actions"; import { useAppState } from "../../../state/StateProvider"; -import { getBuild } from "../../../util/query"; +import { getBuild, getDockerAccounts } from "../../../util/query"; type ConfigBuild = Build & { loaded: boolean; updated: boolean; saving: boolean }; diff --git a/frontend/src/components/builds/tabs/build-config/BuildConfig.tsx b/frontend/src/components/builds/tabs/build-config/BuildConfig.tsx index 785a60aae..a46fd0392 100644 --- a/frontend/src/components/builds/tabs/build-config/BuildConfig.tsx +++ b/frontend/src/components/builds/tabs/build-config/BuildConfig.tsx @@ -15,8 +15,8 @@ const BuildConfig: Component<{}> = (p) => { - + diff --git a/frontend/src/components/builds/tabs/build-config/Docker.tsx b/frontend/src/components/builds/tabs/build-config/Docker.tsx index 7b308e087..7634aa7d1 100644 --- a/frontend/src/components/builds/tabs/build-config/Docker.tsx +++ b/frontend/src/components/builds/tabs/build-config/Docker.tsx @@ -1,12 +1,15 @@ -import { Component } from "solid-js"; +import { Component, Show } from "solid-js"; +import { useAppState } from "../../../../state/StateProvider"; import { combineClasses } from "../../../../util/helpers"; import Input from "../../../util/Input"; import Flex from "../../../util/layout/Flex"; import Grid from "../../../util/layout/Grid"; +import Selector from "../../../util/menu/Selector"; import s from "../../build.module.css"; import { useConfig } from "../Provider"; const Docker: Component<{}> = (p) => { + const { dockerAccounts } = useAppState(); const { build, setBuild } = useConfig(); return ( @@ -24,9 +27,27 @@ const Docker: Component<{}> = (p) => { setBuild("dockerBuildArgs", { dockerfilePath })} + onEdit={(dockerfilePath) => + setBuild("dockerBuildArgs", { dockerfilePath }) + } /> + + +
account
+ { + setBuild( + "dockerAccount", + account === "none" ? undefined : account + ); + }} + position="bottom right" + /> +
+
); }; diff --git a/frontend/src/components/builds/tabs/git-config/Git.tsx b/frontend/src/components/builds/tabs/git-config/Git.tsx index 232cce2a8..98bebcd5d 100644 --- a/frontend/src/components/builds/tabs/git-config/Git.tsx +++ b/frontend/src/components/builds/tabs/git-config/Git.tsx @@ -1,12 +1,15 @@ -import { Component } from "solid-js"; +import { Component, Show } from "solid-js"; import { combineClasses } from "../../../../util/helpers"; import Grid from "../../../util/layout/Grid"; import { useConfig } from "../Provider"; import s from "../../build.module.css"; import Flex from "../../../util/layout/Flex"; import Input from "../../../util/Input"; +import { useAppState } from "../../../../state/StateProvider"; +import Selector from "../../../util/menu/Selector"; const Git: Component<{}> = (p) => { + const { githubAccounts } = useAppState(); const { build, setBuild } = useConfig(); return ( @@ -27,14 +30,22 @@ const Git: Component<{}> = (p) => { onEdit={(value) => setBuild("branch", value)} /> - -
access token
- setBuild("accessToken", value)} - /> -
+ + +
github account
+ { + setBuild( + "githubAccount", + account === "none" ? undefined : account + ); + }} + position="bottom right" + /> +
+
); }; diff --git a/frontend/src/components/deployment/tabs/config/Config.tsx b/frontend/src/components/deployment/tabs/config/Config.tsx index ff120fab9..fdeaf1808 100644 --- a/frontend/src/components/deployment/tabs/config/Config.tsx +++ b/frontend/src/components/deployment/tabs/config/Config.tsx @@ -12,6 +12,7 @@ import Icon from "../../../util/icons/Icon"; import ConfirmButton from "../../../util/ConfirmButton"; import Restart from "./Restart"; import { combineClasses } from "../../../../util/helpers"; +import DockerAccount from "./DockerAccount"; const Config: Component<{}> = (p) => { const { deployment, reset, save } = useConfig(); @@ -20,6 +21,7 @@ const Config: Component<{}> = (p) => { + diff --git a/frontend/src/components/deployment/tabs/config/DockerAccount.tsx b/frontend/src/components/deployment/tabs/config/DockerAccount.tsx new file mode 100644 index 000000000..8a2523e5f --- /dev/null +++ b/frontend/src/components/deployment/tabs/config/DockerAccount.tsx @@ -0,0 +1,35 @@ +import { Component, Show } from "solid-js"; +import { useAppState } from "../../../../state/StateProvider"; +import { combineClasses } from "../../../../util/helpers"; +import Flex from "../../../util/layout/Flex"; +import Selector from "../../../util/menu/Selector"; +import s from "../../deployment.module.css"; +import { useConfig } from "./Provider"; + +const DockerAccount: Component<{}> = (p) => { + const { dockerAccounts } = useAppState(); + const { deployment, setDeployment } = useConfig(); + return ( + + +

docker account

+ + setDeployment( + "dockerAccount", + account === "none" ? undefined : account + ) + } + position="bottom right" + /> +
+
+ ); +}; + +export default DockerAccount; diff --git a/frontend/src/components/deployment/tabs/config/Restart.tsx b/frontend/src/components/deployment/tabs/config/Restart.tsx index 78ac7c40a..981fa6412 100644 --- a/frontend/src/components/deployment/tabs/config/Restart.tsx +++ b/frontend/src/components/deployment/tabs/config/Restart.tsx @@ -6,10 +6,10 @@ import s from "../../deployment.module.css"; import { useConfig } from "./Provider"; const RESTART_MODES = [ - "always", - "on failure", - "unless stopped", "don't restart", + "unless stopped", + "on failure", + "always", ]; const Restart: Component<{}> = (p) => { @@ -35,11 +35,6 @@ const Restart: Component<{}> = (p) => { } position="bottom right" /> - {/* setDeployment("network", value)} - /> */} ); }; diff --git a/frontend/src/components/util/menu/Menu.module.css b/frontend/src/components/util/menu/Menu.module.css index 40712369e..b668616e7 100644 --- a/frontend/src/components/util/menu/Menu.module.css +++ b/frontend/src/components/util/menu/Menu.module.css @@ -129,3 +129,7 @@ font-size: 1.5rem; font-weight: 500; } + +.SelectorItem:hover { + background-color: rgba(180, 43, 43, 0.377); +} diff --git a/frontend/src/components/util/menu/Selector.tsx b/frontend/src/components/util/menu/Selector.tsx index 2e9eb34fc..8a3fd5c01 100644 --- a/frontend/src/components/util/menu/Selector.tsx +++ b/frontend/src/components/util/menu/Selector.tsx @@ -30,6 +30,7 @@ const Selector: Component<{ toggle(); }} style={{ width: "100%", "justify-content": "flex-end" }} + class={s.SelectorItem} > {item} diff --git a/frontend/src/state/StateProvider.tsx b/frontend/src/state/StateProvider.tsx index fc3475aa2..692a9423f 100644 --- a/frontend/src/state/StateProvider.tsx +++ b/frontend/src/state/StateProvider.tsx @@ -1,5 +1,6 @@ -import { Accessor, Component, createContext, useContext } from "solid-js"; +import { Accessor, Component, createContext, createResource, Resource, useContext } from "solid-js"; import { useLocalStorageToggle } from "../util/hooks"; +import { getDockerAccounts, getGithubAccounts } from "../util/query"; import { useBuilds, useDeployments, @@ -15,6 +16,8 @@ export type State = { builds: ReturnType; deployments: ReturnType; updates: ReturnType; + dockerAccounts: Resource; + githubAccounts: Resource; sidebar: { open: Accessor; toggle: () => void; @@ -35,11 +38,15 @@ export const AppStateProvider: Component<{}> = (p) => { "sidebar-open", true ); + const [dockerAccounts] = createResource(getDockerAccounts); + const [githubAccounts] = createResource(getGithubAccounts); const state: State = { servers: useServers(), builds: useBuilds(), deployments: useDeployments(), updates: useUpdates(), + dockerAccounts, + githubAccounts, sidebar: { open: sidebarOpen, toggle: toggleSidebarOpen, diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index ef35a171a..c2164aeb0 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -8,6 +8,7 @@ "esModuleInterop": true, "jsx": "preserve", "jsxImportSource": "solid-js", - "types": ["vite/client"] + "types": ["vite/client"], + "noEmit": true, } } \ No newline at end of file diff --git a/package.json b/package.json index 4fe0ee9a9..5347cd706 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "build-core": "cd core && yarn build", "restart-core": "cd core && yarn build && cd ../cli && yarn restart-default", "push-core": "cd core && yarn push", - "build-periphery": "cd periphery && yarn build", + "build-periphery": "cd periphery && yarn docker-build", "push-periphery": "cd periphery && yarn push" }, "devDependencies": { diff --git a/periphery/src/routes/git.ts b/periphery/src/routes/git.ts index ae21d0c6c..c87638628 100644 --- a/periphery/src/routes/git.ts +++ b/periphery/src/routes/git.ts @@ -1,8 +1,9 @@ import { Deployment } from "@monitor/types"; -import { clone, pull } from "@monitor/util"; +import { clone, execute, mergeCommandLogError, pull } from "@monitor/util"; import { FastifyInstance } from "fastify"; import fp from "fastify-plugin"; import { remove } from "fs-extra"; +import { join } from "path"; import { CONTAINER_REPO_ROOT, SECRETS } from "../config"; const git = fp((app: FastifyInstance, _: {}, done: () => void) => { @@ -14,24 +15,42 @@ const git = fp((app: FastifyInstance, _: {}, done: () => void) => { CONTAINER_REPO_ROOT + deployment.containerName, deployment.subfolder, deployment.branch, - deployment.githubAccount && SECRETS.GITHUB_ACCOUNTS[deployment.githubAccount] + deployment.githubAccount && + SECRETS.GITHUB_ACCOUNTS[deployment.githubAccount] ); - res.send(log); + res.send(log); }); - app.post("/repo/pull", { onRequest: [app.auth] }, async (req, res) => { - const body = req.body as { deployment: Deployment }; + app.post("/repo/pull", { onRequest: [app.auth] }, async (req, res) => { + const body = req.body as { deployment: Deployment }; const deployment = body.deployment; - const log = await pull(CONTAINER_REPO_ROOT + deployment.containerName, deployment.branch); - res.send(log); - }); + const pullCle = await pull( + join(CONTAINER_REPO_ROOT, deployment.containerName!), + deployment.branch + ); + const onPullCle = + deployment.onPull && + (await execute( + `cd ${join( + CONTAINER_REPO_ROOT, + deployment.containerName!, + deployment.onPull.path || "" + )} && ${deployment.onPull.command}` + )); + res.send( + mergeCommandLogError( + { name: "pull", cle: pullCle }, + { name: "post", cle: onPullCle } + ) + ); + }); - app.post("/repo/delete", { onRequest: [app.auth] }, async (req, res) => { - const body = req.body as { deployment: Deployment }; + app.post("/repo/delete", { onRequest: [app.auth] }, async (req, res) => { + const body = req.body as { deployment: Deployment }; const deployment = body.deployment; - await remove(CONTAINER_REPO_ROOT + deployment.containerName).catch(); - res.send(); - }); + await remove(CONTAINER_REPO_ROOT + deployment.containerName).catch(); + res.send(); + }); done(); }); diff --git a/types/types.d.ts b/types/types.d.ts index e94f86993..4f60b9b52 100644 --- a/types/types.d.ts +++ b/types/types.d.ts @@ -73,7 +73,7 @@ export interface Build { repo?: string; subfolder?: string; // subfolder of monorepo. uses sparse clone branch?: string; - accessToken?: string; // to gain access to private repos + githubAccount?: string; // to gain access to private repos onClone?: Command; /* build related */ cliBuild?: Command; // run shell commands on build, before docker build step if it exists @@ -105,8 +105,7 @@ export interface Deployment extends DockerRunArgs { repo?: string; branch?: string; subfolder?: string; // subfolder of repo to clone (uses sparse clone) - githubAccount?: string; - + githubAccount?: string; repoMount?: string; // subfolder of repo to mount in container containerMount?: string; // the file path to mount repo on inside the container onPull?: Command;