chore(deps): modernize coreflow tooling
This commit is contained in:
@@ -4,9 +4,7 @@ import { Coreflow } from './coreflow.classes.coreflow.js';
|
||||
|
||||
export class ClusterManager {
|
||||
public coreflowRef: Coreflow;
|
||||
public configSubscription: plugins.smartrx.rxjs.Subscription;
|
||||
public containerSubscription: plugins.smartrx.rxjs.Subscription;
|
||||
public containerVersionSubscription: plugins.smartrx.rxjs.Subscription;
|
||||
public configSubscription?: plugins.smartrx.rxjs.Subscription;
|
||||
|
||||
public readyDeferred = plugins.smartpromise.defer();
|
||||
|
||||
@@ -51,42 +49,34 @@ export class ClusterManager {
|
||||
public async provisionBaseServices() {
|
||||
// swarm should be enabled by lower level serverconfig package
|
||||
// get current situation
|
||||
const networks = await this.coreflowRef.dockerHost.getNetworks();
|
||||
const networks = await this.coreflowRef.dockerHost.listNetworks();
|
||||
logger.log('info', 'There are currently ' + networks.length + ' networks');
|
||||
for (const network of networks) {
|
||||
logger.log('info', 'Network: ' + network.Name);
|
||||
}
|
||||
|
||||
// make sure there is a network for the webgateway
|
||||
let sznWebgatewayNetwork = await plugins.docker.DockerNetwork.getNetworkByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
let sznWebgatewayNetwork = await this.coreflowRef.dockerHost.getNetworkByName(
|
||||
this.commonDockerData.networkNames.sznWebgateway,
|
||||
);
|
||||
|
||||
if (!sznWebgatewayNetwork) {
|
||||
logger.log('info', 'Creating network: ' + this.commonDockerData.networkNames.sznWebgateway);
|
||||
sznWebgatewayNetwork = await plugins.docker.DockerNetwork.createNetwork(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
Name: this.commonDockerData.networkNames.sznWebgateway,
|
||||
},
|
||||
);
|
||||
sznWebgatewayNetwork = await this.coreflowRef.dockerHost.createNetwork({
|
||||
Name: this.commonDockerData.networkNames.sznWebgateway,
|
||||
});
|
||||
} else {
|
||||
logger.log('ok', 'sznWebgateway is already present');
|
||||
}
|
||||
|
||||
// corechat network so base services can talk to each other
|
||||
let sznCorechatNetwork = await plugins.docker.DockerNetwork.getNetworkByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
let sznCorechatNetwork = await this.coreflowRef.dockerHost.getNetworkByName(
|
||||
this.commonDockerData.networkNames.sznCorechat,
|
||||
);
|
||||
if (!sznCorechatNetwork) {
|
||||
sznCorechatNetwork = await plugins.docker.DockerNetwork.createNetwork(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
Name: this.commonDockerData.networkNames.sznCorechat,
|
||||
},
|
||||
);
|
||||
sznCorechatNetwork = await this.coreflowRef.dockerHost.createNetwork({
|
||||
Name: this.commonDockerData.networkNames.sznCorechat,
|
||||
});
|
||||
} else {
|
||||
logger.log('ok', 'sznCorechat is already present');
|
||||
}
|
||||
@@ -99,30 +89,19 @@ export class ClusterManager {
|
||||
// Images
|
||||
logger.log('info', `now updating docker images of base services...`);
|
||||
|
||||
const coretrafficImage = await plugins.docker.DockerImage.createFromRegistry(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
creationObject: {
|
||||
imageUrl: 'code.foss.global/serve.zone/coretraffic',
|
||||
},
|
||||
},
|
||||
);
|
||||
const coretrafficImage = await this.coreflowRef.dockerHost.createImageFromRegistry({
|
||||
imageUrl: 'code.foss.global/serve.zone/coretraffic',
|
||||
});
|
||||
|
||||
const corelogImage = await plugins.docker.DockerImage.createFromRegistry(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
creationObject: {
|
||||
imageUrl: 'code.foss.global/serve.zone/corelog',
|
||||
},
|
||||
},
|
||||
);
|
||||
const corelogImage = await this.coreflowRef.dockerHost.createImageFromRegistry({
|
||||
imageUrl: 'code.foss.global/serve.zone/corelog',
|
||||
});
|
||||
|
||||
// SERVICES
|
||||
// lets deploy the base services
|
||||
// coretraffic
|
||||
let coretrafficService: plugins.docker.DockerService;
|
||||
coretrafficService = await plugins.docker.DockerService.getServiceByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
let coretrafficService: plugins.docker.DockerService | null;
|
||||
coretrafficService = await this.coreflowRef.dockerHost.getServiceByName(
|
||||
'coretraffic',
|
||||
);
|
||||
|
||||
@@ -135,22 +114,19 @@ export class ClusterManager {
|
||||
}
|
||||
|
||||
if (!coretrafficService) {
|
||||
coretrafficService = await plugins.docker.DockerService.createService(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
image: coretrafficImage,
|
||||
labels: {},
|
||||
name: 'coretraffic',
|
||||
networks: [sznCorechatNetwork, sznWebgatewayNetwork],
|
||||
networkAlias: 'coretraffic',
|
||||
ports: ['80:7999', '443:8000'],
|
||||
secrets: [],
|
||||
resources: {
|
||||
memorySizeMB: 1100,
|
||||
volumeMounts: [],
|
||||
},
|
||||
coretrafficService = await this.coreflowRef.dockerHost.createService({
|
||||
image: coretrafficImage,
|
||||
labels: {},
|
||||
name: 'coretraffic',
|
||||
networks: [sznCorechatNetwork, sznWebgatewayNetwork],
|
||||
networkAlias: 'coretraffic',
|
||||
ports: ['80:7999', '443:8000'],
|
||||
secrets: [],
|
||||
resources: {
|
||||
memorySizeMB: 1100,
|
||||
volumeMounts: [],
|
||||
},
|
||||
);
|
||||
});
|
||||
} else {
|
||||
logger.log('ok', 'coretraffic service is already present');
|
||||
}
|
||||
@@ -158,9 +134,8 @@ export class ClusterManager {
|
||||
await plugins.smartdelay.delayFor(10000);
|
||||
|
||||
// corelog
|
||||
let corelogService: plugins.docker.DockerService;
|
||||
corelogService = await plugins.docker.DockerService.getServiceByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
let corelogService: plugins.docker.DockerService | null;
|
||||
corelogService = await this.coreflowRef.dockerHost.getServiceByName(
|
||||
'corelog',
|
||||
);
|
||||
|
||||
@@ -172,22 +147,19 @@ export class ClusterManager {
|
||||
}
|
||||
|
||||
if (!corelogService) {
|
||||
corelogService = await plugins.docker.DockerService.createService(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
image: corelogImage,
|
||||
labels: {},
|
||||
name: 'corelog',
|
||||
networks: [sznCorechatNetwork],
|
||||
networkAlias: 'corelog',
|
||||
ports: [],
|
||||
secrets: [],
|
||||
resources: {
|
||||
memorySizeMB: 120,
|
||||
volumeMounts: [],
|
||||
},
|
||||
corelogService = await this.coreflowRef.dockerHost.createService({
|
||||
image: corelogImage,
|
||||
labels: {},
|
||||
name: 'corelog',
|
||||
networks: [sznCorechatNetwork],
|
||||
networkAlias: 'corelog',
|
||||
ports: [],
|
||||
secrets: [],
|
||||
resources: {
|
||||
memorySizeMB: 120,
|
||||
volumeMounts: [],
|
||||
},
|
||||
);
|
||||
});
|
||||
} else {
|
||||
logger.log('ok', 'corelog service is already present');
|
||||
}
|
||||
@@ -219,15 +191,11 @@ export class ClusterManager {
|
||||
const imageStream = await containerImageFromCloudly.pullImageVersion(
|
||||
serviceArgFromCloudly.data.imageVersion,
|
||||
);
|
||||
localDockerImage = await plugins.docker.DockerImage.createFromTarStream(
|
||||
this.coreflowRef.dockerHost,
|
||||
localDockerImage = await this.coreflowRef.dockerHost.createImageFromTarStream(
|
||||
plugins.smartstream.nodewebhelpers.convertWebReadableToNodeReadable(imageStream),
|
||||
{
|
||||
creationObject: {
|
||||
imageUrl: containerImageFromCloudly.id,
|
||||
imageTag: serviceArgFromCloudly.data.imageVersion,
|
||||
},
|
||||
tarStream:
|
||||
plugins.smartstream.nodewebhelpers.convertWebReadableToNodeReadable(imageStream),
|
||||
imageUrl: containerImageFromCloudly.id,
|
||||
imageTag: serviceArgFromCloudly.data.imageVersion,
|
||||
},
|
||||
);
|
||||
} else if (
|
||||
@@ -240,42 +208,40 @@ export class ClusterManager {
|
||||
);
|
||||
// Lets authenticate against the external registry
|
||||
// TODO: deduplicate this, check wether we are already authenticated
|
||||
if (!externalRegistry.data.username || !externalRegistry.data.password) {
|
||||
throw new Error(`External registry ${externalRegistry.id} is missing credentials`);
|
||||
}
|
||||
await this.coreflowRef.dockerHost.auth({
|
||||
username: externalRegistry.data.username,
|
||||
password: externalRegistry.data.password,
|
||||
serveraddress: externalRegistry.data.url,
|
||||
});
|
||||
localDockerImage = await plugins.docker.DockerImage.createFromRegistry(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
creationObject: {
|
||||
imageUrl: containerImageFromCloudly.id,
|
||||
imageTag: serviceArgFromCloudly.data.imageVersion,
|
||||
},
|
||||
},
|
||||
);
|
||||
localDockerImage = await this.coreflowRef.dockerHost.createImageFromRegistry({
|
||||
imageUrl: containerImageFromCloudly.id,
|
||||
imageTag: serviceArgFromCloudly.data.imageVersion,
|
||||
});
|
||||
await localDockerImage.pullLatestImageFromRegistry();
|
||||
} else {
|
||||
throw new Error('Invalid image location');
|
||||
}
|
||||
|
||||
let containerService = await plugins.docker.DockerService.getServiceByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
let containerService: plugins.docker.DockerService | null = await this.coreflowRef.dockerHost.getServiceByName(
|
||||
serviceArgFromCloudly.data.name,
|
||||
);
|
||||
this.coreflowRef.cloudlyConnector.cloudlyApiClient;
|
||||
|
||||
const dockerSecretName = `${serviceArgFromCloudly.id}_${serviceArgFromCloudly.data.name}_Secret`;
|
||||
let containerSecret = await plugins.docker.DockerSecret.getSecretByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
let containerSecret: plugins.docker.DockerSecret | undefined | null = await this.coreflowRef.dockerHost.getSecretByName(
|
||||
dockerSecretName,
|
||||
);
|
||||
|
||||
// existing network to connect to
|
||||
const webGatewayNetwork = await plugins.docker.DockerNetwork.getNetworkByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
const webGatewayNetwork = await this.coreflowRef.dockerHost.getNetworkByName(
|
||||
this.commonDockerData.networkNames.sznWebgateway,
|
||||
);
|
||||
if (!webGatewayNetwork) {
|
||||
throw new Error(`Missing required Docker network ${this.commonDockerData.networkNames.sznWebgateway}`);
|
||||
}
|
||||
|
||||
if (containerService && (await containerService.needsUpdate())) {
|
||||
await containerService.remove();
|
||||
@@ -287,8 +253,7 @@ export class ClusterManager {
|
||||
}
|
||||
|
||||
if (!containerService) {
|
||||
containerSecret = await plugins.docker.DockerSecret.getSecretByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
containerSecret = await this.coreflowRef.dockerHost.getSecretByName(
|
||||
dockerSecretName,
|
||||
);
|
||||
if (containerSecret) {
|
||||
@@ -301,29 +266,23 @@ export class ClusterManager {
|
||||
);
|
||||
|
||||
// lets create the relevant stuff on the docker side
|
||||
containerSecret = await plugins.docker.DockerSecret.createSecret(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
name: dockerSecretName,
|
||||
contentArg: JSON.stringify(await secretBundle.getFlatKeyValueObjectForEnvironment()),
|
||||
labels: {},
|
||||
version: serviceArgFromCloudly.data.imageVersion,
|
||||
},
|
||||
);
|
||||
containerService = await plugins.docker.DockerService.createService(
|
||||
this.coreflowRef.dockerHost,
|
||||
{
|
||||
name: serviceArgFromCloudly.data.name,
|
||||
image: localDockerImage,
|
||||
networks: [webGatewayNetwork],
|
||||
secrets: [containerSecret],
|
||||
ports: [],
|
||||
labels: {},
|
||||
resources: serviceArgFromCloudly.data.resources,
|
||||
// TODO: introduce a clean name here, that is guaranteed to work with APIs.
|
||||
networkAlias: serviceArgFromCloudly.data.name,
|
||||
},
|
||||
);
|
||||
containerSecret = await this.coreflowRef.dockerHost.createSecret({
|
||||
name: dockerSecretName,
|
||||
contentArg: JSON.stringify(await secretBundle.getFlatKeyValueObjectForEnvironment()),
|
||||
labels: {},
|
||||
version: serviceArgFromCloudly.data.imageVersion,
|
||||
});
|
||||
containerService = await this.coreflowRef.dockerHost.createService({
|
||||
name: serviceArgFromCloudly.data.name,
|
||||
image: localDockerImage,
|
||||
networks: [webGatewayNetwork],
|
||||
secrets: [containerSecret],
|
||||
ports: [],
|
||||
labels: {},
|
||||
resources: serviceArgFromCloudly.data.resources,
|
||||
// TODO: introduce a clean name here, that is guaranteed to work with APIs.
|
||||
networkAlias: serviceArgFromCloudly.data.name,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,11 +305,13 @@ export class ClusterManager {
|
||||
public async updateTrafficRouting(
|
||||
_clusterConfigArg: plugins.servezoneInterfaces.data.ICluster,
|
||||
) {
|
||||
const services = await this.coreflowRef.dockerHost.getServices();
|
||||
const webGatewayNetwork = await plugins.docker.DockerNetwork.getNetworkByName(
|
||||
this.coreflowRef.dockerHost,
|
||||
const services = await this.coreflowRef.dockerHost.listServices();
|
||||
const webGatewayNetwork = await this.coreflowRef.dockerHost.getNetworkByName(
|
||||
this.commonDockerData.networkNames.sznWebgateway,
|
||||
);
|
||||
if (!webGatewayNetwork) {
|
||||
throw new Error(`Missing required Docker network ${this.commonDockerData.networkNames.sznWebgateway}`);
|
||||
}
|
||||
const reverseProxyConfigs: plugins.servezoneInterfaces.data.IReverseProxyConfig[] = [];
|
||||
|
||||
const pushProxyConfig = async (
|
||||
|
||||
Reference in New Issue
Block a user