#load "contract.fsx" open System open System.IO open System.IO.Compression open System.Net.Http open System.Net.Http.Headers open Contract let repository = Environment.GetEnvironmentVariable "SOURCE_REPOSITORY" let revision = Environment.GetEnvironmentVariable "SOURCE_REVISION" let archive = "/source/tmp/source.tar.gz" let incoming = "/source/archive" let destination = "/source/repository" require (repository = "https://forge.quorate.internal/quorate/cluster") "invalid source repository" require (validRevision revision) "invalid source revision" require (File.Exists "/source-auth/token") "source authentication unavailable" require (Directory.EnumerateFileSystemEntries(destination) |> Seq.isEmpty) "source destination is not empty" let token = File.ReadAllText("/source-auth/token").Trim() require (not <| String.IsNullOrWhiteSpace token) "source authentication unavailable" let download () = use request = new HttpRequestMessage( HttpMethod.Get, $"http://forgejo-http.forgejo.svc.cluster.local.:3000/api/v1/repos/quorate/cluster/archive/{revision}.tar.gz" ) request.Headers.Authorization <- AuthenticationHeaderValue("token", token) use client = new HttpClient(Timeout = TimeSpan.FromMinutes 10.0) use reply = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken) require reply.IsSuccessStatusCode $"source download failed: {int reply.StatusCode}" use input = reply.Content.ReadAsStream(cancellationToken) use output = File.Create archive input.CopyTo output download () extractGzip archive incoming let root = Directory.EnumerateFileSystemEntries incoming |> Seq.tryExactlyOne |> Option.defaultWith (fun () -> fail "source archive has an invalid root") require (Directory.Exists root) "source archive root is not a directory" Directory.Delete(destination) Directory.Move(root, destination) File.WriteAllText("/source/.ready", revision + "\n") printfn "source=primary revision=%s" revision