@atomist/org-visualizer
Version:
Organization Visualizer using Atomist project scanning
219 lines • 10.9 kB
JavaScript
"use strict";
/*
* Copyright © 2019 Atomist, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const automation_client_1 = require("@atomist/automation-client");
const automation_client_ext_dashboard_1 = require("@atomist/automation-client-ext-dashboard");
const automation_client_ext_humio_1 = require("@atomist/automation-client-ext-humio");
const configuration_1 = require("@atomist/automation-client/lib/configuration");
const sdm_1 = require("@atomist/sdm");
const sdm_core_1 = require("@atomist/sdm-core");
const clojure_1 = require("@atomist/sdm-pack-clojure/lib/fingerprints/clojure");
const sdm_pack_docker_1 = require("@atomist/sdm-pack-docker");
const sdm_pack_fingerprints_1 = require("@atomist/sdm-pack-fingerprints");
const _ = require("lodash");
const stackAspect_1 = require("./lib/aspect/common/stackAspect");
const DefaultAspectRegistry_1 = require("./lib/aspect/DefaultAspectRegistry");
const TypeScriptVersion_1 = require("./lib/aspect/node/TypeScriptVersion");
const directMavenDependencies_1 = require("./lib/aspect/spring/directMavenDependencies");
const springBootStarter_1 = require("./lib/aspect/spring/springBootStarter");
const springBootVersion_1 = require("./lib/aspect/spring/springBootVersion");
const travisAspects_1 = require("./lib/aspect/travis/travisAspects");
const aspects_1 = require("./lib/customize/aspects");
const categories_1 = require("./lib/customize/categories");
const demoUndesirableUsageChecker_1 = require("./lib/customize/demoUndesirableUsageChecker");
const createFingerprintJob_1 = require("./lib/job/createFingerprintJob");
const fingerprintTask_1 = require("./lib/job/fingerprintTask");
const machine_1 = require("./lib/machine/machine");
const api_1 = require("./lib/routes/api");
const orgPage_1 = require("./lib/routes/orgPage");
// Mode can be online or mode
const mode = process.env.ATOMIST_ORG_VISUALIZER_MODE || "online";
exports.configuration = sdm_core_1.configure((sdm) => __awaiter(this, void 0, void 0, function* () {
const isStaging = sdm.configuration.endpoints.api.includes("staging");
const optionalAspects = isStaging ? [clojure_1.LeinDeps] : [];
const jobAspects = [
sdm_pack_docker_1.DockerFrom,
sdm_pack_docker_1.DockerfilePath,
sdm_pack_docker_1.DockerPorts,
springBootStarter_1.SpringBootStarter,
TypeScriptVersion_1.TypeScriptVersion,
sdm_pack_fingerprints_1.NpmDeps,
travisAspects_1.TravisScriptsAspect,
stackAspect_1.StackAspect,
stackAspect_1.CiAspect,
stackAspect_1.JavaBuild,
springBootVersion_1.SpringBootVersion,
directMavenDependencies_1.DirectMavenDependencies,
...optionalAspects,
];
const handlers = [];
// TODO cd merge into one call
categories_1.registerCategories(TypeScriptVersion_1.TypeScriptVersion, "Node.js");
categories_1.registerReportDetails(TypeScriptVersion_1.TypeScriptVersion, {
name: "TypeScript versions",
shortName: "version",
unit: "version",
url: "fingerprint/typescript-version/typescript-version?byOrg=true",
description: "TypeScript versions in use across all repositories in your workspace, " +
"broken out by version and repositories that use each version.",
});
categories_1.registerCategories(sdm_pack_fingerprints_1.NpmDeps, "Node.js");
categories_1.registerReportDetails(sdm_pack_fingerprints_1.NpmDeps, {
shortName: "dependency",
unit: "version",
url: "drift?type=npm-project-deps",
description: "Node direct dependencies in use across all repositories in your workspace, " +
"grouped by Drift Level.",
});
categories_1.registerCategories(springBootStarter_1.SpringBootStarter, "Java");
categories_1.registerCategories(stackAspect_1.JavaBuild, "Java");
categories_1.registerCategories(springBootVersion_1.SpringBootVersion, "Java");
categories_1.registerCategories(directMavenDependencies_1.DirectMavenDependencies, "Java");
categories_1.registerReportDetails(directMavenDependencies_1.DirectMavenDependencies, {
shortName: "dependency",
unit: "version",
url: "drift?type=maven-direct-dep",
description: "Maven direct dependencies in use across all repositories in your workspace, " +
"grouped by Drift Level.",
});
if (isStaging) {
categories_1.registerCategories(clojure_1.LeinDeps, "Java");
categories_1.registerReportDetails(clojure_1.LeinDeps, { url: "drift?type=clojure-project-deps" });
}
categories_1.registerCategories(sdm_pack_docker_1.DockerFrom, "Docker");
categories_1.registerReportDetails(sdm_pack_docker_1.DockerFrom, {
name: "Docker base images",
shortName: "images",
unit: "tag",
url: "fingerprint/docker-base-image/*?byOrg=true&presence=false&progress=false&otherLabel=false&trim=false",
description: "Docker base images in use across all repositories in your workspace, " +
"broken out by image label and repositories where used.",
});
categories_1.registerCategories(sdm_pack_docker_1.DockerPorts, "Docker");
categories_1.registerReportDetails(sdm_pack_docker_1.DockerPorts, {
shortName: "ports",
unit: "port",
url: "fingerprint/docker-ports/*?byOrg=true&presence=false&progress=false&otherLabel=false&trim=false",
description: "Ports exposed in Docker configuration in use across all repositories in your workspace, " +
"broken out by port number and repositories where used.",
});
if (mode === "online") {
const pushImpact = new sdm_1.PushImpact();
sdm.addExtensionPacks(sdm_pack_fingerprints_1.fingerprintSupport({
pushImpactGoal: pushImpact,
aspects: jobAspects,
handlers,
}));
return {
analyze: {
goals: pushImpact,
},
};
}
else {
sdm.addEvent(createFingerprintJob_1.CreateFingerprintJob);
sdm.addCommand(createFingerprintJob_1.CreateFingerprintJobCommand);
sdm.addCommand(fingerprintTask_1.calculateFingerprintTask(jobAspects, handlers));
return {};
}
}), {
name: "Analysis Software Delivery Machine",
preProcessors: (cfg) => __awaiter(this, void 0, void 0, function* () {
// Do not surface the single pushImpact goal set in every UI
cfg.sdm.tagGoalSet = () => __awaiter(this, void 0, void 0, function* () { return [{ name: "@atomist/sdm/internal" }]; });
// Use lazy project loader for this SDM
cfg.sdm.projectLoader = new sdm_1.GitHubLazyProjectLoader(new sdm_1.CachingProjectLoader());
// Disable goal hooks from repos
cfg.sdm.goal = {
hooks: false,
};
// For safety we sign every goal
cfg.sdm.goalSigning = Object.assign({}, cfg.sdm.goalSigning, { scope: sdm_1.GoalSigningScope.All });
if (mode === "job") {
cfg.name = `${cfg.name}-job`;
cfg.ws.termination = {
graceful: true,
gracePeriod: 1000 * 60 * 10,
};
}
return cfg;
}),
postProcessors: [
automation_client_ext_humio_1.configureHumio,
automation_client_ext_dashboard_1.configureDashboardNotifications,
(cfg) => __awaiter(this, void 0, void 0, function* () {
const { customizers, routesToSuggestOnStartup } = orgVisualizationEndpoints(machine_1.sdmConfigClientFactory(cfg), cfg.http.client.factory);
cfg.http.customizers = customizers;
routesToSuggestOnStartup.forEach(rtsos => {
cfg.logging.banner.contributors.push(suggestRoute(rtsos));
});
// start up embedded postgres if needed
if (process.env.ATOMIST_POSTGRES === "start" && !_.get(cfg, "sdm.postgres")) {
automation_client_1.logger.info("Starting embedded Postgres");
yield sdm_1.execPromise("/etc/init.d/postgresql", ["start"]);
const postgresCfg = {
user: "org_viz",
password: "atomist",
};
_.set(cfg, "sdm.postgres", postgresCfg);
yield configuration_1.writeUserConfig({
sdm: {
postgres: postgresCfg,
},
});
}
return cfg;
}),
],
});
function suggestRoute({ title, route }) {
return cfg => ({
title,
body: `http://localhost:${cfg.http.port}${route}`,
});
}
function orgVisualizationEndpoints(dbClientFactory, httpClientFactory) {
const resultStore = machine_1.analysisResultStore(dbClientFactory);
const aspectRegistry = new DefaultAspectRegistry_1.DefaultAspectRegistry({
idealStore: resultStore,
problemStore: resultStore,
aspects: aspects_1.Aspects,
undesirableUsageChecker: demoUndesirableUsageChecker_1.demoUndesirableUsageChecker,
});
const aboutTheApi = api_1.api(dbClientFactory, resultStore, aspectRegistry);
if (!sdm_core_1.isInLocalMode()) {
return {
routesToSuggestOnStartup: aboutTheApi.routesToSuggestOnStartup,
customizers: [aboutTheApi.customizer],
};
}
const aboutStaticPages = orgPage_1.orgPage(aspectRegistry, resultStore, httpClientFactory);
return {
routesToSuggestOnStartup: [...aboutStaticPages.routesToSuggestOnStartup,
...aboutTheApi.routesToSuggestOnStartup],
customizers: [aboutStaticPages.customizer, aboutTheApi.customizer],
};
}
//# sourceMappingURL=index.js.map