577 lines
19 KiB
JavaScript
577 lines
19 KiB
JavaScript
import { argv, env, exit } from 'node:process'
|
|
import { writeFileSync } from 'node:fs'
|
|
|
|
/**
|
|
* List of all components
|
|
* @type {Record<string,ComponentTestProperties>}
|
|
*/
|
|
const components = {
|
|
'bindings.azure.blobstorage': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureBlobStorageAccount',
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureBlobStorageContainer',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
],
|
|
},
|
|
'bindings.azure.cosmosdb': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureCosmosDB',
|
|
'AzureCosmosDBMasterKey',
|
|
'AzureCosmosDBUrl',
|
|
'AzureCosmosDB',
|
|
'AzureCosmosDBCollection',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
],
|
|
},
|
|
'bindings.azure.eventgrid': {
|
|
conformance: true,
|
|
requiredSecrets: [
|
|
'AzureEventGridNgrokToken',
|
|
'AzureEventGridAccessKey',
|
|
'AzureEventGridTopicEndpoint',
|
|
'AzureEventGridScope',
|
|
'AzureEventGridClientSecret',
|
|
'AzureEventGridClientId',
|
|
'AzureEventGridTenantId',
|
|
'AzureEventGridSubscriptionId',
|
|
],
|
|
conformanceSetup: 'conformance-bindings.azure.eventgrid-setup.sh',
|
|
conformanceDestroy: 'conformance-bindings.azure.eventgrid-destroy.sh',
|
|
},
|
|
'bindings.azure.eventhubs': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureEventHubsBindingsConnectionString',
|
|
'AzureBlobStorageAccount',
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureEventHubsBindingsHub',
|
|
'AzureEventHubsBindingsNamespace',
|
|
'AzureEventHubsBindingsConsumerGroup',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
'AzureResourceGroupName',
|
|
'AzureCertificationSubscriptionId',
|
|
'AzureEventHubsBindingsContainer',
|
|
'AzureIotHubEventHubConnectionString',
|
|
'AzureIotHubName',
|
|
'AzureIotHubBindingsConsumerGroup',
|
|
],
|
|
},
|
|
'bindings.azure.servicebusqueues': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: ['AzureServiceBusConnectionString'],
|
|
},
|
|
'bindings.azure.storagequeues': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureBlobStorageAccount',
|
|
'AzureBlobStorageQueue',
|
|
],
|
|
},
|
|
'bindings.cron': {
|
|
conformance: true,
|
|
certification: true,
|
|
},
|
|
'bindings.dubbo': {
|
|
certification: true,
|
|
},
|
|
'bindings.http': {
|
|
conformance: true,
|
|
},
|
|
'bindings.influx': {
|
|
conformance: true,
|
|
conformanceSetup: 'conformance-bindings.influx-setup.sh',
|
|
},
|
|
'bindings.kafka': {
|
|
certification: true,
|
|
},
|
|
'bindings.kafka-confluent': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh confluent',
|
|
},
|
|
'bindings.kafka-wurstmeister': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh kafka',
|
|
},
|
|
'bindings.kubemq': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh kubemq',
|
|
},
|
|
'bindings.localstorage': {
|
|
certification: true,
|
|
},
|
|
'bindings.mqtt3-emqx': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh emqx',
|
|
},
|
|
'bindings.mqtt3-mosquitto': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh mosquitto',
|
|
},
|
|
'bindings.mqtt3-vernemq': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh vernemq',
|
|
},
|
|
'bindings.postgres': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh postgresql',
|
|
},
|
|
'bindings.rabbitmq': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh rabbitmq',
|
|
},
|
|
'bindings.redis': {
|
|
certification: true,
|
|
},
|
|
'bindings.redis.v6': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redisjson redis',
|
|
},
|
|
'bindings.redis.v7': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redis7 redis',
|
|
},
|
|
'configuration.redis.v6': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redisjson redis',
|
|
},
|
|
'configuration.redis.v7': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redis7 redis',
|
|
},
|
|
'pubsub.aws.snssqs': {
|
|
certification: true,
|
|
requireAWSCredentials: true,
|
|
requireTerraform: true,
|
|
certificationSetup: 'certification-pubsub.aws.snssqs-setup.sh',
|
|
certificationDestroy: 'certification-pubsub.aws.snssqs-destroy.sh',
|
|
},
|
|
'pubsub.aws.snssqs.docker': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh snssqs',
|
|
},
|
|
'pubsub.aws.snssqs.terraform': {
|
|
conformance: true,
|
|
requireAWSCredentials: true,
|
|
requireTerraform: true,
|
|
conformanceSetup: 'conformance-pubsub.aws.snssqs.terraform-setup.sh',
|
|
conformanceDestroy: 'conformance-pubsub.aws.snssqs.terraform-destroy.sh',
|
|
},
|
|
'pubsub.azure.eventhubs': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureEventHubsPubsubTopicActiveConnectionString',
|
|
'AzureEventHubsPubsubNamespace',
|
|
'AzureEventHubsPubsubConsumerGroup',
|
|
'AzureEventHubsPubsubNamespaceConnectionString',
|
|
'AzureBlobStorageAccount',
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureEventHubsPubsubContainer',
|
|
'AzureIotHubName',
|
|
'AzureIotHubEventHubConnectionString',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
'AzureResourceGroupName',
|
|
'AzureCertificationSubscriptionId',
|
|
],
|
|
},
|
|
'pubsub.azure.servicebus.queues': {
|
|
conformance: true,
|
|
requiredSecrets: ['AzureServiceBusConnectionString'],
|
|
},
|
|
'pubsub.azure.servicebus.topics': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureServiceBusConnectionString',
|
|
'AzureServiceBusNamespace',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
],
|
|
},
|
|
'pubsub.in-memory': {
|
|
conformance: true,
|
|
},
|
|
'pubsub.jetstream': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh jetstream',
|
|
},
|
|
'pubsub.kafka': {
|
|
certification: true,
|
|
},
|
|
'pubsub.kafka-confluent': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh confluent',
|
|
},
|
|
'pubsub.kafka-wurstmeister': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh kafka',
|
|
},
|
|
'pubsub.kubemq': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh kubemq',
|
|
},
|
|
'pubsub.mqtt3': {
|
|
certification: true,
|
|
},
|
|
'pubsub.mqtt3-emqx': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh emqx',
|
|
},
|
|
'pubsub.mqtt3-vernemq': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh vernemq',
|
|
},
|
|
'pubsub.natsstreaming': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh natsstreaming',
|
|
},
|
|
'pubsub.pulsar': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh pulsar',
|
|
},
|
|
'pubsub.rabbitmq': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh rabbitmq',
|
|
},
|
|
'pubsub.redis.v6': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redisjson redis',
|
|
},
|
|
// This test is currently disabled due to issues with Redis v7
|
|
/*'pubsub.redis.v7': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redis7 redis',
|
|
},*/
|
|
'pubsub.solace': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh solace',
|
|
},
|
|
'secretstores.azure.keyvault': {
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureKeyVaultName',
|
|
'AzureKeyVaultSecretStoreTenantId',
|
|
'AzureKeyVaultSecretStoreClientId',
|
|
'AzureKeyVaultSecretStoreServicePrincipalClientId',
|
|
'AzureKeyVaultSecretStoreServicePrincipalClientSecret',
|
|
'AzureContainerRegistryName',
|
|
'AzureResourceGroupName',
|
|
],
|
|
requiredCerts: ['AzureKeyVaultSecretStoreCert'],
|
|
},
|
|
'secretstores.azure.keyvault.certificate': {
|
|
conformance: true,
|
|
requiredSecrets: [
|
|
'AzureKeyVaultName',
|
|
'AzureKeyVaultSecretStoreTenantId',
|
|
'AzureKeyVaultSecretStoreClientId',
|
|
],
|
|
requiredCerts: ['AzureKeyVaultSecretStoreCert'],
|
|
},
|
|
'secretstores.azure.keyvault.serviceprincipal': {
|
|
conformance: true,
|
|
requiredSecrets: [
|
|
'AzureKeyVaultName',
|
|
'AzureKeyVaultSecretStoreTenantId',
|
|
'AzureKeyVaultSecretStoreServicePrincipalClientId',
|
|
'AzureKeyVaultSecretStoreServicePrincipalClientSecret',
|
|
],
|
|
},
|
|
'secretstores.hashicorp.vault': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh hashicorp-vault vault',
|
|
},
|
|
'secretstores.kubernetes': {
|
|
conformance: true,
|
|
requireKind: true,
|
|
conformanceSetup: 'conformance-secretstores.kubernetes-setup.sh',
|
|
},
|
|
'secretstores.local.env': {
|
|
conformance: true,
|
|
certification: true,
|
|
},
|
|
'secretstores.local.file': {
|
|
conformance: true,
|
|
certification: true,
|
|
},
|
|
'state.aws.dynamodb': {
|
|
certification: true,
|
|
requireAWSCredentials: true,
|
|
requireTerraform: true,
|
|
certificationSetup: 'certification-state.aws.dynamodb-setup.sh',
|
|
certificationDestroy: 'certification-state.aws.dynamodb-destroy.sh',
|
|
},
|
|
'state.aws.dynamodb.terraform': {
|
|
conformance: true,
|
|
requireAWSCredentials: true,
|
|
requireTerraform: true,
|
|
conformanceSetup: 'conformance-state.aws.dynamodb-setup.sh',
|
|
conformanceDestroy: 'conformance-state.aws.dynamodb-destroy.sh',
|
|
},
|
|
'state.azure.blobstorage': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureBlobStorageAccount',
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
'AzureBlobStorageContainer',
|
|
],
|
|
},
|
|
'state.azure.cosmosdb': {
|
|
conformance: true,
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureCosmosDBMasterKey',
|
|
'AzureCosmosDBUrl',
|
|
'AzureCosmosDB',
|
|
'AzureCosmosDBCollection',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
],
|
|
},
|
|
'state.azure.sql': {
|
|
conformance: true,
|
|
requiredSecrets: [
|
|
'AzureResourceGroupName',
|
|
'AzureSqlServerName',
|
|
'AzureSqlServerConnectionString',
|
|
],
|
|
conformanceSetup: 'conformance-state.azure.sql-setup.sh',
|
|
conformanceDestroy: 'conformance-state.azure.sql-destroy.sh',
|
|
},
|
|
'state.azure.tablestorage': {
|
|
certification: true,
|
|
requiredSecrets: [
|
|
'AzureBlobStorageAccount',
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureCertificationTenantId',
|
|
'AzureCertificationServicePrincipalClientId',
|
|
'AzureCertificationServicePrincipalClientSecret',
|
|
],
|
|
},
|
|
'state.azure.tablestorage.cosmosdb': {
|
|
conformance: true,
|
|
requiredSecrets: [
|
|
'AzureCosmosDBTableAPI',
|
|
'AzureCosmosDBTableAPIMasterKey',
|
|
],
|
|
},
|
|
'state.azure.tablestorage.storage': {
|
|
conformance: true,
|
|
requiredSecrets: [
|
|
'AzureBlobStorageAccessKey',
|
|
'AzureBlobStorageAccount',
|
|
],
|
|
},
|
|
'state.cassandra': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh cassandra',
|
|
},
|
|
'state.cloudflare.workerskv': {
|
|
conformance: true,
|
|
requireCloudflareCredentials: true,
|
|
nodeJsVersion: '18.x',
|
|
conformanceSetup: 'conformance-state.cloudflare.workerskv-setup.sh',
|
|
conformanceDestroy: 'conformance-state.cloudflare.workerskv-destroy.sh',
|
|
},
|
|
'state.cockroachdb': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh cockroachdb',
|
|
},
|
|
'state.in-memory': {
|
|
conformance: true,
|
|
},
|
|
'state.memcached': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh memcached',
|
|
},
|
|
'state.mongodb': {
|
|
conformance: true,
|
|
certification: true,
|
|
mongoDbVersion: '4.2',
|
|
},
|
|
'state.mysql': {
|
|
certification: true,
|
|
},
|
|
'state.mysql.mariadb': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh mariadb',
|
|
},
|
|
'state.mysql.mysql': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh mysql',
|
|
},
|
|
'state.postgresql': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh postgresql',
|
|
},
|
|
'state.redis': {
|
|
certification: true,
|
|
},
|
|
'state.redis.v6': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redisjson redis',
|
|
},
|
|
'state.redis.v7': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh redis7 redis',
|
|
},
|
|
'state.rethinkdb': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh rethinkdb',
|
|
},
|
|
'state.sqlite': {
|
|
conformance: true,
|
|
certification: true,
|
|
},
|
|
'state.sqlserver': {
|
|
conformance: true,
|
|
certification: true,
|
|
conformanceSetup: 'docker-compose.sh sqlserver',
|
|
requiredSecrets: ['AzureSqlServerConnectionString'],
|
|
},
|
|
'workflows.temporal': {
|
|
conformance: true,
|
|
conformanceSetup: 'docker-compose.sh temporal',
|
|
},
|
|
}
|
|
|
|
/**
|
|
* Type for the objects in the components dictionary
|
|
* @typedef {Object} ComponentTestProperties
|
|
* @property {boolean?} conformance If true, enables for conformance tests
|
|
* @property {boolean?} certification If true, enables for certification tests
|
|
* @property {string[]?} requiredSecrets Required secrets (if not empty, test becomes "cloud-only")
|
|
* @property {string[]?} requiredCerts Required certs (if not empty, test becomes "cloud-only")
|
|
* @property {boolean?} requireAWSCredentials If true, requires AWS credentials and makes the test "cloud-only"
|
|
* @property {boolean?} requireCloudflareCredentials If true, requires Cloudflare credentials and makes the test "cloud-only"
|
|
* @property {boolean?} requireTerraform If true, requires Terraform
|
|
* @property {boolean?} requireKind If true, requires KinD
|
|
* @property {string?} conformanceSetup Setup script for conformance tests
|
|
* @property {string?} conformanceDestroy Destroy script for conformance tests
|
|
* @property {string?} certificationSetup Setup script for certification tests
|
|
* @property {string?} certificationDestroy Destroy script for certification tests
|
|
* @property {string?} nodeJsVersion If set, installs the specified Node.js version
|
|
* @property {string?} mongoDbVersion If set, installs the specified MongoDB version
|
|
*/
|
|
|
|
/**
|
|
* Test matrix object
|
|
* @typedef {Object} TestMatrixElement
|
|
* @property {string} component Component name
|
|
* @property {string?} required-secrets Required secrets
|
|
* @property {string?} required-certs Required certs
|
|
* @property {boolean?} require-aws-credentials Requires AWS credentials
|
|
* @property {boolean?} require-cloudflare-credentials Requires Cloudflare credentials
|
|
* @property {boolean?} require-terraform Requires Terraform
|
|
* @property {boolean?} require-kind Requires KinD
|
|
* @property {string?} setup-script Setup script
|
|
* @property {string?} destroy-script Destroy script
|
|
* @property {string?} nodejs-version Install the specified Node.js version if set
|
|
* @property {string?} mongodb-version Install the specified MongoDB version if set
|
|
*/
|
|
|
|
/**
|
|
* Returns the list of components for the matrix.
|
|
* @param {'conformance'|'certification'} testKind Kind of test
|
|
* @param {boolean} enableCloudTests If true, returns components that require secrets or credentials too (which can't be used as part of the regular CI in a PR)
|
|
* @returns {TestMatrixElement[]} Test matrix object
|
|
*/
|
|
function GenerateMatrix(testKind, enableCloudTests) {
|
|
/** @type {TestMatrixElement[]} */
|
|
const res = []
|
|
for (const name in components) {
|
|
const comp = components[name]
|
|
if (!comp[testKind]) {
|
|
continue
|
|
}
|
|
|
|
// Skip cloud-only tests if enableCloudTests is false
|
|
if (!enableCloudTests) {
|
|
if (
|
|
comp.requiredSecrets?.length ||
|
|
comp.requiredCerts?.length ||
|
|
comp.requireAWSCredentials ||
|
|
comp.requireCloudflareCredentials
|
|
) {
|
|
continue
|
|
}
|
|
}
|
|
|
|
// Add the component to the array
|
|
res.push({
|
|
component: name,
|
|
'required-secrets': comp.requiredSecrets?.length
|
|
? comp.requiredSecrets.join(',')
|
|
: undefined,
|
|
'required-certs': comp.requiredCerts?.length
|
|
? comp.requiredCerts.join(',')
|
|
: undefined,
|
|
'require-aws-credentials': comp.requireAWSCredentials
|
|
? 'true'
|
|
: undefined,
|
|
'require-cloudflare-credentials': comp.requireCloudflareCredentials
|
|
? 'true'
|
|
: undefined,
|
|
'require-terraform': comp.requireTerraform ? 'true' : undefined,
|
|
'require-kind': comp.requireKind ? 'true' : undefined,
|
|
'setup-script': comp[testKind + 'Setup'] || undefined,
|
|
'destroy-script': comp[testKind + 'Destroy'] || undefined,
|
|
'nodejs-version': comp.nodeJsVersion || undefined,
|
|
'mongodb-version': comp.mongoDbVersion || undefined,
|
|
})
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
// Upon invocation, writes the matrix to the $GITHUB_OUTPUT file
|
|
if (!env.GITHUB_OUTPUT) {
|
|
console.error('Missing environmental variable GITHUB_OUTPUT')
|
|
exit(1)
|
|
}
|
|
if (argv.length < 3 || !['conformance', 'certification'].includes(argv[2])) {
|
|
console.error("First parameter must be 'conformance' or 'certification'")
|
|
exit(1)
|
|
}
|
|
if (argv.length < 4 || !['true', 'false'].includes(argv[3])) {
|
|
console.error("First parameter must be 'true' or 'false'")
|
|
exit(1)
|
|
}
|
|
|
|
const matrixObj = GenerateMatrix(argv[2], argv[3] == 'true')
|
|
console.log('Generated matrix:\n\n' + JSON.stringify(matrixObj, null, ' '))
|
|
|
|
writeFileSync(env.GITHUB_OUTPUT, 'test-matrix=' + JSON.stringify(matrixObj))
|