| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- load('ext://helm_resource', 'helm_resource', 'helm_repo')
- load('ext://restart_process', 'docker_build_with_restart')
- load('ext://secret', 'secret_create_generic')
- def get_docker_platform(arch):
- if arch == "arm64":
- return "linux/arm64"
- else:
- return "linux/amd64"
- def get_go_arch(arch):
- if arch == "arm64":
- return "arm64"
- else:
- return "amd64"
- # run_opencost is encapsulated as a function to make import easier for running alongside kubecost.
- # The `../opencost` pattern that repeats across this function is to deal with how multiple tilt
- # files work - the base directory (`.`) is always relative to the Tiltfile executed and not the
- # directory containing this file.
- def run_opencost(options):
- docker_platform = get_docker_platform(options["arch"])
- go_arch = get_go_arch(options["arch"])
- is_cloud_integration = options["cloud_integration"] != '' and os.path.exists(options["cloud_integration"])
- is_service_key = options["service_key"] != '' and os.path.exists(options["service_key"])
- continue_flag = '--continue'
- if options["delve_continue"] == False:
- continue_flag = ''
- # Build and update opencost back end binary when code changes
- local_resource(
- name='build-costmodel',
- dir='.',
- cmd='CGO_ENABLED=0 GOOS=linux GOARCH='+go_arch+' go build -o ../opencost/cmd/costmodel/costmodel-tilt ../opencost/cmd/costmodel/main.go',
- deps=[
- '../opencost/cmd/costmodel/main.go',
- '../opencost/pkg',
- ],
- allow_parallel=True,
- )
- # Build back end docker container
- # If the binary is updated, update the running container and restart binary in dlv
- docker_build_with_restart(
- ref=options["docker_repo"]+'opencost-costmodel',
- context='../opencost',
- # remove --continue flag to make dlv wait until debugger is attached to start
- entrypoint='/go/bin/dlv exec --listen=:40000 --api-version=2 --headless=true --accept-multiclient --log '+continue_flag+' /app/main',
- dockerfile='../opencost/Dockerfile.debug',
- platform=docker_platform,
- build_args={'binary_path': './cmd/costmodel/costmodel-tilt'},
- only=[
- 'cmd/costmodel/costmodel-tilt',
- 'configs',
- 'THIRD_PARTY_LICENSES.txt',
- ],
- live_update=[
- sync('../opencost/cmd/costmodel/costmodel-tilt', '/app/main'),
- ],
- )
- # npm install if package.json changes
- local_resource(
- name='build-npm-install',
- dir='../opencost/ui',
- cmd='npm install',
- deps=[
- '../opencost/ui/package.json',
- ],
- allow_parallel=True,
- )
- # Build FE locally when code changes
- local_resource(
- name='build-ui',
- dir='../opencost/ui',
- cmd='npx parcel build src/index.html',
- deps=[
- '../opencost/ui/src',
- '../opencost/ui/package.json',
- ],
- allow_parallel=True,
- resource_deps=['build-npm-install'],
- )
- # update container when relevant files change
- docker_build(
- ref=options["docker_repo"]+'opencost-ui',
- context='../opencost/ui',
- dockerfile='../opencost/ui/Dockerfile.debug',
- only=[
- 'dist',
- 'nginx.conf',
- 'default.nginx.conf.template',
- 'docker-entrypoint.sh',
- ],
- live_update=[
- sync('../opencost/ui/dist', '/var/www'),
- ],
- )
- values_set = [
- 'opencost.ui.image.fullImageName='+options["docker_repo"]+'opencost-ui',
- 'opencost.exporter.image.fullImageName='+options["docker_repo"]+'opencost-costmodel',
- 'opencost.prometheus.internal.namespaceName='+k8s_namespace(),
- 'opencost.exporter.debugPort=40000',
- ]
- if is_cloud_integration:
- values_set.append('opencost.cloudIntegrationSecret=cloud-integration')
- values_set.append('opencost.cloudCost.enabled=true')
- else:
- values_set.append('opencost.cloudCost.enabled=false')
- if is_cloud_integration:
- secret_create_generic(
- name='cloud-integration',
- namespace=k8s_namespace(),
- from_file=options["cloud_integration"],
- secret_type=None,
- from_env_file=None
- )
- if is_service_key:
- secret_create_generic(
- name='service-key',
- namespace=k8s_namespace(),
- from_file=options["service_key"],
- secret_type=None,
- from_env_file=None
- )
- # build yaml for deployment to k8s
- yaml = helm(
- '../opencost-helm-chart/charts/opencost',
- name='opencost',
- values=[options["helm_values"]],
- set=values_set
- )
- k8s_yaml(yaml) # put resulting yaml into k8s
- port_forwards = [
- options['port_costmodel']+':9003',
- options['port_ui']+':9090',
- options['port_debug']+':40000',
- '8081:8081', # MCP server port
- ]
- k8s_resource(workload='opencost', port_forwards=port_forwards)
- helm_repo('prometheus-community', 'https://prometheus-community.github.io/helm-charts')
- helm_resource(
- name='prometheus',
- chart='prometheus-community/prometheus',
- resource_deps=['prometheus-community'])
- k8s_resource(workload='prometheus', port_forwards=[options['port_prometheus']+':9090'])
- local_resource(
- name='costmodel-test',
- dir='../opencost',
- cmd='go test ./...',
- deps=[
- './pkg',
- ],
- allow_parallel=True,
- resource_deps=['opencost'], # run tests after build to speed up deployment
- )
|