76 lines
1.7 KiB
TypeScript
76 lines
1.7 KiB
TypeScript
import log from '~/utils/log'
|
|
|
|
import dockerIntegration from './docker'
|
|
import { IntegrationFactory } from './integration'
|
|
import kubernetesIntegration from './kubernetes'
|
|
import procIntegration from './proc'
|
|
|
|
export * from './integration'
|
|
|
|
export async function loadIntegration() {
|
|
let integration = process.env.HEADSCALE_INTEGRATION
|
|
?.trim()
|
|
.toLowerCase()
|
|
|
|
// Old HEADSCALE_CONTAINER variable upgrade path
|
|
// This ensures that when people upgrade from older versions of Headplane
|
|
// they don't explicitly need to define the new HEADSCALE_INTEGRATION
|
|
// variable that is needed to configure docker
|
|
if (!integration && process.env.HEADSCALE_CONTAINER) {
|
|
integration = 'docker'
|
|
}
|
|
|
|
if (!integration) {
|
|
log.info('INTG', 'No integration set with HEADSCALE_INTEGRATION')
|
|
return
|
|
}
|
|
|
|
let integrationFactory: IntegrationFactory | undefined
|
|
switch (integration.toLowerCase().trim()) {
|
|
case 'docker': {
|
|
integrationFactory = dockerIntegration
|
|
break
|
|
}
|
|
|
|
case 'proc':
|
|
case 'native':
|
|
case 'linux': {
|
|
integrationFactory = procIntegration
|
|
break
|
|
}
|
|
|
|
case 'kubernetes':
|
|
case 'k8s': {
|
|
integrationFactory = kubernetesIntegration
|
|
break
|
|
}
|
|
|
|
default: {
|
|
log.error('INTG', 'Unknown integration: %s', integration)
|
|
throw new Error(`Unknown integration: ${integration}`)
|
|
}
|
|
}
|
|
|
|
log.info('INTG', 'Loading integration: %s', integration)
|
|
try {
|
|
const res = await integrationFactory.isAvailable(
|
|
integrationFactory.context,
|
|
)
|
|
if (!res) {
|
|
log.error('INTG', 'Integration %s is not available',
|
|
integration,
|
|
)
|
|
return
|
|
}
|
|
} catch (error) {
|
|
log.error('INTG', 'Failed to load integration %s: %s',
|
|
integration,
|
|
error,
|
|
)
|
|
return
|
|
}
|
|
|
|
log.info('INTG', 'Loaded integration: %s', integration)
|
|
return integrationFactory
|
|
}
|