All notable changes to this project are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Added
- Compute REST client layer.
GcpComputefacade:insert_instance/3,insert_instance_and_wait/3,get_instance/3,list_instances/2,list_instances_page/2,delete_instance/3,delete_instance_and_wait/3,start_instance/3,stop_instance/3,wait_for_operation/3,config/2,clear_config/2.GcpCompute.Config— NimbleOptions-validated config / client handle withnew/1,new!/1,production/1,local/1,local!/1,from_env/2.GcpCompute.TokenProviderbehaviour withGoth(optional dep) andStaticadapters.GcpCompute.Instance—spec/1insert-body builder (Spot VM defaults) plus parsing andexternal_ip/1/internal_ip/1accessors.GcpCompute.Instances(list_page/2surfacesnextPageToken) andGcpCompute.Operationsmodules.GcpCompute.OperationandGcpCompute.Errordata types.GcpCompute.Telemetry—[:gcp_compute, :request, :start | :stop | :exception]spans on every API call.
Security
- Cleartext bearer tokens rejected.
GcpCompute.Config.new/1now requires anhttps://base_urlunless you explicitly passallow_insecure: true(for a local emulator/proxy on a trusted network). Gating on that flag rather than the token provider means even aStaticprovider holding a real out-of-band token stays TLS-only by default.local/1setsallow_insecure: truefor you. The scheme check is case-insensitive. Applies tofrom_env/2and any directnew/1use, not justproduction/1. req_optionscan no longer override auth or URL. The request:method,:url, and:authare always computed by the library and layered on top of the app-suppliedreq_options, which is treated as trusted transport config.- Fail closed on a missing token. A
nil/empty token now returns{:error, %GcpCompute.Error{reason: :missing_token}}before any request goes out, instead of sending an unauthenticated call. - No secrets in error messages. Token-fetch failures use a fixed
"token fetch failed"message; the raw reason is kept only in:body, whichGcpCompute.Error'sInspectimplementation redacts.
Changed
GcpCompute.Instances.insert_and_wait/3returns{:error, %GcpCompute.Error{reason: :missing_instance_name}}for a name-less spec instead of raisingArgumentError.
Notes
- The Compute Engine API is REST/JSON only (no gRPC); transport is
Req. - A higher-level sandbox orchestration layer (gen_statem, DynamicSupervisor, reaper, profiles) is planned on top of this client.