From bef1052480f08daba50aedd85387b74bb4b7d226 Mon Sep 17 00:00:00 2001 From: Colin Lyons Date: Wed, 28 Dec 2022 09:14:27 +0000 Subject: [PATCH] Adding a push tags function for docker. --- cmd/indra/commands.go | 2 +- cmd/indra/handlers.go | 13 +++--- cmd/indra/main.go | 5 +-- docker/sim/main.go | 10 ++++- docker/sim/utils.go | 93 ++++++++++++++++++++++++++++++++++++++----- go.mod | 2 + go.sum | 3 ++ 7 files changed, 107 insertions(+), 21 deletions(-) diff --git a/cmd/indra/commands.go b/cmd/indra/commands.go index 003dd2ad..e20ed398 100644 --- a/cmd/indra/commands.go +++ b/cmd/indra/commands.go @@ -8,7 +8,7 @@ import ( var ( commands = &cmds.Command{ Name: "indra", - Description: "The indra network daemon.", + Description: "Network Freedom.", Documentation: lorem, Entrypoint: defaultHandler, Default: cmds.Tags("help"), diff --git a/cmd/indra/handlers.go b/cmd/indra/handlers.go index 76d7a201..9d678c66 100644 --- a/cmd/indra/handlers.go +++ b/cmd/indra/handlers.go @@ -5,10 +5,11 @@ import ( "github.com/Indra-Labs/indra" "github.com/Indra-Labs/indra/pkg/server" "github.com/cybriq/proc/pkg/cmds" + log2 "github.com/cybriq/proc/pkg/log" ) var defaultHandler = func(c *cmds.Command, args []string) error { - fmt.Println("indra.") + fmt.Println("indra") return nil } @@ -19,15 +20,13 @@ var versionHandler = func(c *cmds.Command, args []string) error { var serveHandler = func(c *cmds.Command, args []string) error { - log.I.Ln("-- “Far away in the heavenly abode of the great god indra, there is a wonderful net which has been hung by some cunning artificer in such a manner that it stretches out indefinitely in all directions.”") - log.I.Ln("-- “In accordance with the extravagant tastes of deities, the artificer has hung a single glittering jewel at the net’s every node, and since the net itself is infinite in dimension, the jewels are infinite in number. There hang the jewels, glittering like stars of the first magnitude, a wonderful sight to behold.”") - log.I.Ln("-- “If we now arbitrarily select one of these jewels for inspection and look closely at it, we will discover that in its polished surface there are reflected all the other jewels in the net, infinite in number. Not only that, but each of the jewels reflected in this one jewel is also reflecting all the other jewels, so that the process of reflection is infinite.”") - - log.I.Ln("running serve.") + log.I.Ln("-- ", log2.App, "-" , indra.SemVer, "- Nobody's watching you. Network Freedom. --") var err error var srv *server.Server + log.I.Ln("running serve.") + if srv, err = server.New(server.DefaultServerConfig); check(err) { return err } @@ -38,6 +37,8 @@ var serveHandler = func(c *cmds.Command, args []string) error { return err } + log.I.Ln("-- fin --") + return nil } diff --git a/cmd/indra/main.go b/cmd/indra/main.go index 52f11c44..e29440b5 100644 --- a/cmd/indra/main.go +++ b/cmd/indra/main.go @@ -16,19 +16,18 @@ func main() { log2.App = "indra" - log.I.Ln("-- indra -", indra.SemVer, "- the indra network tool --") - var err error var application *app.App + // Creates a new application if application, err = app.New(commands, os.Args); check(err) { os.Exit(1) } + // Launches a new application if err = application.Launch(); check(err) { os.Exit(1) } - log.I.Ln("-- fin --") os.Exit(0) } diff --git a/docker/sim/main.go b/docker/sim/main.go index 6ef74f07..cff8feda 100644 --- a/docker/sim/main.go +++ b/docker/sim/main.go @@ -1,10 +1,12 @@ package main import ( + "context" "github.com/Indra-Labs/indra" log2 "github.com/cybriq/proc/pkg/log" "github.com/docker/docker/client" "os" + "time" ) var ( @@ -38,7 +40,13 @@ func main() { defer cli.Close() - build_image(cli) + // Set a Timeout for 120 seconds + ctx, cancel := context.WithTimeout(context.Background(), time.Second * 120) + + defer cancel() + + //build_image(ctx, cli) + push_tags(ctx, cli) /*reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{}) if err != nil { diff --git a/docker/sim/utils.go b/docker/sim/utils.go index 115dc7e7..c3508f0d 100644 --- a/docker/sim/utils.go +++ b/docker/sim/utils.go @@ -1,23 +1,30 @@ package main import ( + "bytes" "context" + "encoding/base64" + "encoding/json" "github.com/Indra-Labs/indra" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/client" + "github.com/docker/cli/cli/config/configfile" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/jsonmessage" "github.com/moby/term" "io" + "io/ioutil" "os" - "time" ) var ( buildContextFilePath = "/tmp/indra-build.tar" buildOpts = types.ImageBuildOptions{ - Tags: []string{"indra-labs/indra:" + indra.SemVer}, + Tags: []string{ + "indralabs/indra:" + indra.SemVer, + "indralabs/indra:latest", + }, Dockerfile: "docker/indra/Dockerfile", SuppressOutput: false, Remove: true, @@ -26,39 +33,105 @@ var ( } ) -func build_image(cli *client.Client) (err error) { +func build_image(ctx context.Context, cli *client.Client) (err error) { - log.I.Ln("Building", buildOpts.Tags[0], "from", buildOpts.Dockerfile) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second * 120) - defer cancel() + log.I.Ln("building", buildOpts.Tags[0], "from", buildOpts.Dockerfile) + // Generate a tar file for docker's build context. It will contain the root of the repository's path. + // A tar file is passed in to the docker daemon. var tar io.ReadCloser - if tar, err = archive.TarWithOptions(".", &archive.TarOptions{}); check(err) { return } defer tar.Close() - // Here build the actual docker image - var response types.ImageBuildResponse + log.I.Ln("submitting build to docker...") + // Submit a build to docker; with the context tar, and default options defined above. + var response types.ImageBuildResponse if response, err = cli.ImageBuild(ctx, tar, buildOpts); check(err) { return } defer response.Body.Close() + // Generate a terminal for output termFd, isTerm := term.GetFdInfo(os.Stderr) if err = jsonmessage.DisplayJSONMessagesStream(response.Body, os.Stderr, termFd, isTerm, nil); check(err) { return } + log.I.Ln("pruning build container(s)...") + + // Prune the intermediate golang:x.xx builder container if _, err = cli.ImagesPrune(ctx, filters.NewArgs()); check(err) { return } + log.I.Ln("pruning successful.") + log.I.Ln("build successful!") + + return +} + +var ( + push_opts = types.ImagePushOptions{} +) + +func push_tags(ctx context.Context, cli *client.Client) (err error) { + + log.I.Ln("pushing tagged images to repository...") + + var file []byte + if file, err = ioutil.ReadFile(os.Getenv("INDRA_DOCKER_CONFIG")); check(err) { + return + } + + config := configfile.New("config.json") + config.LoadFromReader(bytes.NewReader(file)) + + // Generate a terminal for output + termFd, isTerm := term.GetFdInfo(os.Stderr) + + var pushResponse io.ReadCloser + + for _, auth := range config.AuthConfigs { + + log.I.Ln("found", auth.ServerAddress) + + authConfigBytes, _ := json.Marshal(auth) + authConfigEncoded := base64.URLEncoding.EncodeToString(authConfigBytes) + + push_opts.RegistryAuth = authConfigEncoded + + for _, tag := range buildOpts.Tags { + + log.I.Ln("pushing", tag) + + if pushResponse, err = cli.ImagePush(ctx, tag, push_opts); check(err) { + return + } + + if err = jsonmessage.DisplayJSONMessagesStream(pushResponse, os.Stderr, termFd, isTerm, nil); check(err) { + return + } + + if err = pushResponse.Close(); check(err) { + return + } + } + } + + return nil +} + +func createNetworkIfNotExists(cli *client.Client) (err error) { + + //ctx, cancel := context.WithTimeout(context.Background(), time.Second * 120) + //defer cancel() + + //cli.NetworkCreate(ctx, "indranet") return } diff --git a/go.mod b/go.mod index b0a79a7c..6db4b0e9 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/cybriq/proc v0.20.9 github.com/cybriq/qu v0.1.2 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 + github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 github.com/docker/docker v20.10.22+incompatible github.com/libp2p/go-libp2p v0.24.1 github.com/libp2p/go-libp2p-kad-dht v0.20.0 @@ -29,6 +30,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.6.3 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect diff --git a/go.sum b/go.sum index bc6d41f8..fd676d9d 100644 --- a/go.sum +++ b/go.sum @@ -282,6 +282,7 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 h1:2HQmlpI3yI9deH18Q6xiSOIjXD4sLI55Y/gfpa8/558= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -291,6 +292,7 @@ github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4Kfc github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.22+incompatible h1:6jX4yB+NtcbldT90k7vBSaWJDB3i+zkVJT9BEK8kQkk= github.com/docker/docker v20.10.22+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -1505,6 +1507,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=