From 3c5f150dc2e486768a94c02f597191fc4c5133c1 Mon Sep 17 00:00:00 2001 From: BradHacker Date: Mon, 31 Oct 2022 16:07:08 -0400 Subject: [PATCH 01/14] Remove openstack test file --- builder/openstack/examples/test.go | 106 ----------------------------- 1 file changed, 106 deletions(-) delete mode 100755 builder/openstack/examples/test.go diff --git a/builder/openstack/examples/test.go b/builder/openstack/examples/test.go deleted file mode 100755 index 861d2b31..00000000 --- a/builder/openstack/examples/test.go +++ /dev/null @@ -1,106 +0,0 @@ -package main - -import ( - "context" - "fmt" - "log" - "os" - - "github.com/gen0cide/laforge/builder" - "github.com/gen0cide/laforge/ent" - "github.com/gen0cide/laforge/ent/environment" - "github.com/gen0cide/laforge/logging" - "github.com/gen0cide/laforge/server/utils" - "github.com/sirupsen/logrus" -) - -func main() { - - laforgeConfig, err := utils.LoadServerConfig() - if err != nil { - logrus.Errorf("failed to load LaForge config: %v", err) - return - } - - if laforgeConfig.Database.PostgresUri == "" { - logrus.Errorf("Database.PostgresUri not set in LaForge config") - os.Exit(1) - } - - client := ent.PGOpen(laforgeConfig.Database.PostgresUri) - - ctx := context.Background() - defer ctx.Done() - defer client.Close() - - // Run the auto migration tool. - if err := client.Schema.Create(ctx); err != nil { - log.Fatalf("failed creating schema resources: %v", err) - } - - env, err := client.Environment.Query().Where(environment.NameEQ("tenchi")).Only(ctx) - if err != nil { - log.Fatalf("error querying env: %v", err) - } - - defaultLogger := logging.CreateNewLogger("./output.lfglog") - - fmt.Println("Creating vSphere/NSX-T builder...") - openstackBuilder, err := builder.NewOpenstackBuilder("./configs/test_openstack.json", env, &defaultLogger) - if err != nil { - log.Fatalf("error while creating Openstack builder: %v", err) - } - - build, err := env.QueryEnvironmentToBuild().Only(ctx) - if err != nil { - log.Fatalf("error querying build from env: %v", err) - } - teams, err := build.QueryBuildToTeam().All(ctx) - if err != nil { - log.Fatalf("error querying teams from build: %v", err) - } - - for _, team := range teams { - fmt.Printf("Networks for Team %d\n", team.TeamNumber) - pnets, err := team.QueryTeamToProvisionedNetwork().All(ctx) - if err != nil { - log.Fatalf("error while querying provisioned netowrks from team: %v", err) - } - for _, pnet := range pnets { - fmt.Printf("\t%s | %s\n", pnet.Name, pnet.Cidr) - - err = openstackBuilder.DeployNetwork(ctx, pnet) - if err != nil { - fmt.Printf("\tERROR: %v\n", err) - continue - } else { - fmt.Println("\tOK") - } - - // phosts, err := pnet.QueryProvisionedNetworkToProvisionedHost().All(ctx) - // if err != nil { - // log.Fatalf("error while querying provisioned hosts from provisioned network: %v", err) - // } - // if len(phosts) > 0 { - // fmt.Println("Syncing...") - // time.Sleep(30 * time.Second) - - // for _, phost := range phosts { - // host, err := phost.QueryProvisionedHostToHost().Only(ctx) - // if err != nil { - // log.Fatalf("error while querying host from provisioned host") - // } - // fmt.Printf("\t\t%s | %s\n", host.Hostname, host.OS) - - // err = vsphereNsxt.DeployHost(ctx, phost) - // if err != nil { - // fmt.Printf("\t\tERROR: %v\n", err) - // continue - // } else { - // fmt.Println("\t\tOK") - // } - // } - // } - } - } -} From 51889ae958ce31bd0615c6cfb393c876fd2d1619 Mon Sep 17 00:00:00 2001 From: BradHacker Date: Mon, 31 Oct 2022 16:25:23 -0400 Subject: [PATCH 02/14] Add Openstack hypervisor vm count func --- builder/builder.go | 3 ++ builder/openstack/examples/.gitignore | 3 ++ builder/openstack/openstack.go | 65 ++++++++++++++++++++++++--- 3 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 builder/openstack/examples/.gitignore diff --git a/builder/builder.go b/builder/builder.go index 2c7a13d6..eeaf1bc4 100755 --- a/builder/builder.go +++ b/builder/builder.go @@ -215,5 +215,8 @@ func NewOpenstackBuilder(configFilePath string, env *ent.Environment, logger *lo DeployWorkerPool: deployWorkerPool, TeardownWorkerPool: teardownWorkerPool, } + if err = builder.UpdatehypervisorRunningVmCount(); err != nil { + return + } return } diff --git a/builder/openstack/examples/.gitignore b/builder/openstack/examples/.gitignore new file mode 100644 index 00000000..07b2dc38 --- /dev/null +++ b/builder/openstack/examples/.gitignore @@ -0,0 +1,3 @@ +# Any test files made in the "examples" directory directly. +# All test files should be created in their own subdirectory. +/*.go \ No newline at end of file diff --git a/builder/openstack/openstack.go b/builder/openstack/openstack.go index 0a397c69..70c04318 100644 --- a/builder/openstack/openstack.go +++ b/builder/openstack/openstack.go @@ -20,6 +20,7 @@ import ( "github.com/gophercloud/gophercloud/openstack" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips" + "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/hypervisors" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers" @@ -32,16 +33,17 @@ const ( ID = "openstack" Name = "Openstack" Description = "Builder that interfaces with Openstack" - Author = "Tenchi Mata " + Author = "Tenchi Mata , Bradley Harker " Version = "0.1" ) type OpenstackBuilder struct { - Config OpenstackBuilderConfig - HttpClient http.Client - Logger *logging.Logger - DeployWorkerPool *semaphore.Weighted - TeardownWorkerPool *semaphore.Weighted + Config OpenstackBuilderConfig + HttpClient http.Client + Logger *logging.Logger + DeployWorkerPool *semaphore.Weighted + TeardownWorkerPool *semaphore.Weighted + hypervisorRunningVmCounts map[string]int // Maps hypervisor hostnames to running vm counts } type OpenstackBuilderConfig struct { @@ -121,6 +123,57 @@ func (builder OpenstackBuilder) newAuthProvider() (*gophercloud.ProviderClient, return openstack.AuthenticatedClient(authOpts) } +func (builder OpenstackBuilder) listHypervisorHosts(computeClient *gophercloud.ServiceClient) ([]hypervisors.Hypervisor, error) { + hypervisorPages, err := hypervisors.List(computeClient, hypervisors.ListOpts{ + Limit: new(int), + Marker: new(string), + HypervisorHostnamePattern: new(string), + WithServers: gophercloud.Enabled, + }).AllPages() + if err != nil { + return nil, fmt.Errorf("failed to list openstack hypervisors: %v", err) + } + hypervisorList, err := hypervisors.ExtractHypervisors(hypervisorPages) + if err != nil { + return nil, fmt.Errorf("failed to extract openstack hypervisors: %v", err) + } + return hypervisorList, nil +} + +func (builder OpenstackBuilder) UpdatehypervisorRunningVmCount() error { + // ############################# + // Generate authenticated client + // ############################# + provider, err := builder.newAuthProvider() + if err != nil { + return fmt.Errorf("failed to authenticate: %v", err) + } + endpointOpts := gophercloud.EndpointOpts{ + Region: builder.Config.RegionName, + } + computeClient, err := openstack.NewComputeV2(provider, endpointOpts) + if err != nil { + return fmt.Errorf("failed to create compute v2 client: %v", err) + } + + // ####################### + // Get List of hypervisors + // ####################### + hypervisorList, err := builder.listHypervisorHosts(computeClient) + if err != nil { + return fmt.Errorf("failed to list hypervisors: %v", err) + } + + // ###################### + // Update counts in cache + // ###################### + builder.hypervisorRunningVmCounts = make(map[string]int, len(hypervisorList)) + for _, hypervisor := range hypervisorList { + builder.hypervisorRunningVmCounts[hypervisor.HypervisorHostname] = hypervisor.RunningVMs + } + return nil +} + func waitForObjectTeardown(getFunc func() error) { for { err := getFunc() From 7aef562bab36a0d2268ff94d2f6d0f2ea913b60f Mon Sep 17 00:00:00 2001 From: BradHacker Date: Mon, 31 Oct 2022 17:35:22 -0400 Subject: [PATCH 03/14] Add openstack scheduler hints for hypervisor name --- builder/openstack/openstack.go | 78 +++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 24 deletions(-) diff --git a/builder/openstack/openstack.go b/builder/openstack/openstack.go index 70c04318..69d97680 100644 --- a/builder/openstack/openstack.go +++ b/builder/openstack/openstack.go @@ -3,6 +3,7 @@ package openstack import ( "context" "fmt" + "math" "net" "net/http" "net/url" @@ -21,6 +22,7 @@ import ( "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/hypervisors" + "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers" @@ -140,6 +142,41 @@ func (builder OpenstackBuilder) listHypervisorHosts(computeClient *gophercloud.S return hypervisorList, nil } +func (builder OpenstackBuilder) getOptimalHypervisor() string { + optimalHypervisor := "" + lowestVmCount := math.MaxInt + for hypervisor, vmCount := range builder.hypervisorRunningVmCounts { + if vmCount < lowestVmCount { + optimalHypervisor = hypervisor + lowestVmCount = vmCount + } + } + return optimalHypervisor +} + +func waitForObjectTeardown(getFunc func() error) { + for { + err := getFunc() + if err != nil { + break + } + time.Sleep(3 * time.Second) + } +} + +func waitForObject(getFunc func() (bool, error)) error { + for { + valid, err := getFunc() + if valid { + return nil + } + if err != nil { + return err + } + time.Sleep(3 * time.Second) + } +} + func (builder OpenstackBuilder) UpdatehypervisorRunningVmCount() error { // ############################# // Generate authenticated client @@ -174,29 +211,6 @@ func (builder OpenstackBuilder) UpdatehypervisorRunningVmCount() error { return nil } -func waitForObjectTeardown(getFunc func() error) { - for { - err := getFunc() - if err != nil { - break - } - time.Sleep(3 * time.Second) - } -} - -func waitForObject(getFunc func() (bool, error)) error { - for { - valid, err := getFunc() - if valid { - return nil - } - if err != nil { - return err - } - time.Sleep(3 * time.Second) - } -} - func (builder OpenstackBuilder) DeployHost(ctx context.Context, entProvisionedHost *ent.ProvisionedHost) (err error) { ctxClosing := context.Background() defer ctxClosing.Done() @@ -257,6 +271,13 @@ func (builder OpenstackBuilder) DeployHost(ctx context.Context, entProvisionedHo return fmt.Errorf("failed to create compute v2 client: %v", err) } + // #################################### + // Update the Hypervisor VM Count Cache + // #################################### + if err = builder.UpdatehypervisorRunningVmCount(); err != nil { + return fmt.Errorf("failed to update hypervisor running vm count cache: %v", err) + } + // ########### // Deploy Host // ########### @@ -456,11 +477,20 @@ cd / AccessIPv4: hostAddress, } - createOpts := bootfromvolume.CreateOptsExt{ + var createOpts servers.CreateOptsBuilder + + createOpts = bootfromvolume.CreateOptsExt{ CreateOptsBuilder: hostOps, BlockDevice: blockOps, } + createOpts = schedulerhints.CreateOptsExt{ + CreateOptsBuilder: createOpts, + SchedulerHints: schedulerhints.SchedulerHints{ + Query: []interface{}{"=", "$hypervisor_hostname", builder.getOptimalHypervisor()}, + }, + } + // Create the host builder.Logger.Log.Debugf("Deploying host with image \"%s\" and flavor \"%s\"", builder.Config.Images[entHost.OS], builder.Config.Flavors[entHost.InstanceSize]) osServer, err := bootfromvolume.Create(computeClient, createOpts).Extract() From cca916ef238e355c6e9d164bdebddb34ecddf715 Mon Sep 17 00:00:00 2001 From: BradHacker Date: Mon, 31 Oct 2022 17:41:38 -0400 Subject: [PATCH 04/14] Add debug logging for hypervisor placement --- builder/openstack/openstack.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builder/openstack/openstack.go b/builder/openstack/openstack.go index 69d97680..28d0996d 100644 --- a/builder/openstack/openstack.go +++ b/builder/openstack/openstack.go @@ -484,12 +484,14 @@ cd / BlockDevice: blockOps, } + optimalHypervisor := builder.getOptimalHypervisor() createOpts = schedulerhints.CreateOptsExt{ CreateOptsBuilder: createOpts, SchedulerHints: schedulerhints.SchedulerHints{ - Query: []interface{}{"=", "$hypervisor_hostname", builder.getOptimalHypervisor()}, + Query: []interface{}{"=", "$hypervisor_hostname", optimalHypervisor}, }, } + builder.Logger.Log.Debugf("Host \"%s\" will deploy on hypervisor \"%s\"", vmName, optimalHypervisor) // Create the host builder.Logger.Log.Debugf("Deploying host with image \"%s\" and flavor \"%s\"", builder.Config.Images[entHost.OS], builder.Config.Flavors[entHost.InstanceSize]) From 8723eb575f8c75d3bc69cea35204a5de6ac65ed3 Mon Sep 17 00:00:00 2001 From: BradHacker Date: Wed, 2 Nov 2022 18:11:37 -0400 Subject: [PATCH 05/14] Change to AZ Openstack load balancing --- builder/builder.go | 3 - builder/openstack/openstack.go | 148 ++++++++++++++++++--------------- docker-compose.dev.yml | 66 +++++++-------- 3 files changed, 113 insertions(+), 104 deletions(-) diff --git a/builder/builder.go b/builder/builder.go index eeaf1bc4..2c7a13d6 100755 --- a/builder/builder.go +++ b/builder/builder.go @@ -215,8 +215,5 @@ func NewOpenstackBuilder(configFilePath string, env *ent.Environment, logger *lo DeployWorkerPool: deployWorkerPool, TeardownWorkerPool: teardownWorkerPool, } - if err = builder.UpdatehypervisorRunningVmCount(); err != nil { - return - } return } diff --git a/builder/openstack/openstack.go b/builder/openstack/openstack.go index 28d0996d..7ef93fd8 100644 --- a/builder/openstack/openstack.go +++ b/builder/openstack/openstack.go @@ -19,10 +19,10 @@ import ( "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" + "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/hypervisors" - "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers" @@ -40,12 +40,11 @@ const ( ) type OpenstackBuilder struct { - Config OpenstackBuilderConfig - HttpClient http.Client - Logger *logging.Logger - DeployWorkerPool *semaphore.Weighted - TeardownWorkerPool *semaphore.Weighted - hypervisorRunningVmCounts map[string]int // Maps hypervisor hostnames to running vm counts + Config OpenstackBuilderConfig + HttpClient http.Client + Logger *logging.Logger + DeployWorkerPool *semaphore.Weighted + TeardownWorkerPool *semaphore.Weighted } type OpenstackBuilderConfig struct { @@ -142,16 +141,78 @@ func (builder OpenstackBuilder) listHypervisorHosts(computeClient *gophercloud.S return hypervisorList, nil } -func (builder OpenstackBuilder) getOptimalHypervisor() string { - optimalHypervisor := "" +func (builder OpenstackBuilder) getHypervisorVmCounts(computeClient *gophercloud.ServiceClient) (map[string]int, error) { + // ####################### + // Get List of hypervisors + // ####################### + hypervisorList, err := builder.listHypervisorHosts(computeClient) + if err != nil { + return nil, fmt.Errorf("failed to list hypervisors: %v", err) + } + + // #################### + // Create map of counts + // #################### + hypervisorRunningVmCounts := make(map[string]int, len(hypervisorList)) + for _, hypervisor := range hypervisorList { + hypervisorRunningVmCounts[hypervisor.HypervisorHostname] = hypervisor.RunningVMs + } + builder.Logger.Log.Debugf("hypervisor vm counts: %v", hypervisorRunningVmCounts) + return hypervisorRunningVmCounts, nil +} + +func (builder OpenstackBuilder) getOptimalAvailabilityZone(computeClient *gophercloud.ServiceClient) string { + // ############################################################################################ + // Collect the list of hypervisors running the "nova-compute" service in each availability zone + // ############################################################################################ + azPages, err := availabilityzones.ListDetail(computeClient).AllPages() + if err != nil { + builder.Logger.Log.Warn("failed to list availability zones") + return "" + } + azList, err := availabilityzones.ExtractAvailabilityZones(azPages) + azHypervisors := make(map[string][]string, 0) + for _, az := range azList { + for hostName, hostServices := range az.Hosts { + if novaComputeService, exists := hostServices["nova-compute"]; exists && novaComputeService.Active { + if _, exists = azHypervisors[az.ZoneName]; !exists { + azHypervisors[az.ZoneName] = make([]string, 1) + } + azHypervisors[az.ZoneName] = append(azHypervisors[az.ZoneName], hostName) + } + } + } + + // ########################################################## + // Aggregate the number of running vm's per availability zone + // ########################################################## + hypervisorVmCounts, err := builder.getHypervisorVmCounts(computeClient) + if err != nil { + builder.Logger.Log.Warnf("failed to get hypervisor vm counts: %v", err) + return "" + } + azVmCounts := make(map[string]int, len(azHypervisors)) + for azName, hypervisorNames := range azHypervisors { + azVmCounts[azName] = 0 + for _, hypervisorName := range hypervisorNames { + azVmCounts[azName] += hypervisorVmCounts[hypervisorName] + } + builder.Logger.Log.Debugf("%s (%d)\n", azName, azVmCounts[azName]) + } + + // ################################################# + // Choose the Availability Zone with lowest VM count + // ################################################# + optimalAvailabilityZone := azList[0].ZoneName // default to the first hypervisor in list lowestVmCount := math.MaxInt - for hypervisor, vmCount := range builder.hypervisorRunningVmCounts { + for azName, vmCount := range azVmCounts { if vmCount < lowestVmCount { - optimalHypervisor = hypervisor + optimalAvailabilityZone = azName lowestVmCount = vmCount } } - return optimalHypervisor + builder.Logger.Log.Debugf("optimal availability zone is %s\n", optimalAvailabilityZone) + return optimalAvailabilityZone } func waitForObjectTeardown(getFunc func() error) { @@ -177,40 +238,6 @@ func waitForObject(getFunc func() (bool, error)) error { } } -func (builder OpenstackBuilder) UpdatehypervisorRunningVmCount() error { - // ############################# - // Generate authenticated client - // ############################# - provider, err := builder.newAuthProvider() - if err != nil { - return fmt.Errorf("failed to authenticate: %v", err) - } - endpointOpts := gophercloud.EndpointOpts{ - Region: builder.Config.RegionName, - } - computeClient, err := openstack.NewComputeV2(provider, endpointOpts) - if err != nil { - return fmt.Errorf("failed to create compute v2 client: %v", err) - } - - // ####################### - // Get List of hypervisors - // ####################### - hypervisorList, err := builder.listHypervisorHosts(computeClient) - if err != nil { - return fmt.Errorf("failed to list hypervisors: %v", err) - } - - // ###################### - // Update counts in cache - // ###################### - builder.hypervisorRunningVmCounts = make(map[string]int, len(hypervisorList)) - for _, hypervisor := range hypervisorList { - builder.hypervisorRunningVmCounts[hypervisor.HypervisorHostname] = hypervisor.RunningVMs - } - return nil -} - func (builder OpenstackBuilder) DeployHost(ctx context.Context, entProvisionedHost *ent.ProvisionedHost) (err error) { ctxClosing := context.Background() defer ctxClosing.Done() @@ -271,13 +298,6 @@ func (builder OpenstackBuilder) DeployHost(ctx context.Context, entProvisionedHo return fmt.Errorf("failed to create compute v2 client: %v", err) } - // #################################### - // Update the Hypervisor VM Count Cache - // #################################### - if err = builder.UpdatehypervisorRunningVmCount(); err != nil { - return fmt.Errorf("failed to update hypervisor running vm count cache: %v", err) - } - // ########### // Deploy Host // ########### @@ -463,6 +483,8 @@ cd / }, } + optimalAvailabilityZone := builder.getOptimalAvailabilityZone(computeClient) + builder.Logger.Log.Debugf("Host \"%s\" will deploy in availability zone \"%s\"", vmName, optimalAvailabilityZone) hostOps := servers.CreateOpts{ Name: vmName, ImageRef: builder.Config.Images[entHost.OS], @@ -473,26 +495,16 @@ cd / UUID: entProvisionedNetwork.Vars["openstack_network_id"], FixedIP: hostAddress, }}, - AdminPass: adminPassword, - AccessIPv4: hostAddress, + AdminPass: adminPassword, + AccessIPv4: hostAddress, + AvailabilityZone: optimalAvailabilityZone, } - var createOpts servers.CreateOptsBuilder - - createOpts = bootfromvolume.CreateOptsExt{ + createOpts := bootfromvolume.CreateOptsExt{ CreateOptsBuilder: hostOps, BlockDevice: blockOps, } - optimalHypervisor := builder.getOptimalHypervisor() - createOpts = schedulerhints.CreateOptsExt{ - CreateOptsBuilder: createOpts, - SchedulerHints: schedulerhints.SchedulerHints{ - Query: []interface{}{"=", "$hypervisor_hostname", optimalHypervisor}, - }, - } - builder.Logger.Log.Debugf("Host \"%s\" will deploy on hypervisor \"%s\"", vmName, optimalHypervisor) - // Create the host builder.Logger.Log.Debugf("Deploying host with image \"%s\" and flavor \"%s\"", builder.Config.Images[entHost.OS], builder.Config.Flavors[entHost.InstanceSize]) osServer, err := bootfromvolume.Create(computeClient, createOpts).Extract() @@ -507,7 +519,7 @@ cd / return fmt.Errorf("failed to update provisioned host vars: %v", err) } - // Deply host with public IP + // Deploy host with public IP if entNetwork.Vars["public_net"] == "true" { floatingIPOpts := floatingips.CreateOpts{ Pool: builder.Config.FloatingIPPool, diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 589443b4..28c4afa9 100755 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,39 +1,39 @@ version: "3.4" services: - # ui: - # build: - # context: ./ui/ng-ui - # dockerfile: ./Dockerfile - # ports: - # - 80:80 - # restart: unless-stopped - # networks: - # - laforge-backend-tier - # # depends_on: - # # - backend - # volumes: - # - /app/node_modules/ - # backend: - # build: - # context: . - # dockerfile: ./Dockerfile - # restart: unless-stopped - # ports: - # - 8080:8080 - # - 50051:50051 - # networks: - # - laforge-backend-tier - # depends_on: - # - redis - # - db - # volumes: - # - ./server/builds/:/app/builds - # - ./server/logs/:/app/logs - # - ./server/users/:/app/users - # - ./server/repos/:/app/repos - # - ./configs/:/app/configs - # - ./conf.dev.json/:/app/conf.dev.json + ui: + build: + context: ./ui/ng-ui + dockerfile: ./Dockerfile + ports: + - 80:80 + restart: unless-stopped + networks: + - laforge-backend-tier + # depends_on: + # - backend + volumes: + - /app/node_modules/ + backend: + build: + context: . + dockerfile: ./Dockerfile + restart: unless-stopped + ports: + - 8080:8080 + - 50051:50051 + networks: + - laforge-backend-tier + depends_on: + - redis + - db + volumes: + - ./server/builds/:/app/builds + - ./server/logs/:/app/logs + - ./server/users/:/app/users + - ./server/repos/:/app/repos + - ./configs/:/app/configs + - ./conf.dev.json/:/app/conf.dev.json db: image: library/postgres:14.2-alpine From 1257988744e8c9307ea7fb0bcf18912b82f4a504 Mon Sep 17 00:00:00 2001 From: BradHacker Date: Thu, 3 Nov 2022 10:29:47 -0400 Subject: [PATCH 06/14] Fix error ignore --- builder/openstack/openstack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/openstack/openstack.go b/builder/openstack/openstack.go index 7ef93fd8..a8a078c6 100644 --- a/builder/openstack/openstack.go +++ b/builder/openstack/openstack.go @@ -167,7 +167,7 @@ func (builder OpenstackBuilder) getOptimalAvailabilityZone(computeClient *gopher // ############################################################################################ azPages, err := availabilityzones.ListDetail(computeClient).AllPages() if err != nil { - builder.Logger.Log.Warn("failed to list availability zones") + builder.Logger.Log.Warn("failed to list availability zones: %v", err) return "" } azList, err := availabilityzones.ExtractAvailabilityZones(azPages) From 6880a7f18825e017e440c0cff856770cdf3ff5c0 Mon Sep 17 00:00:00 2001 From: BradHacker Date: Thu, 21 Dec 2023 23:40:42 -0500 Subject: [PATCH 07/14] Openstack builder fix TLS issues and log image UUID --- builder/openstack/openstack.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/builder/openstack/openstack.go b/builder/openstack/openstack.go index a8a078c6..d2e1905d 100644 --- a/builder/openstack/openstack.go +++ b/builder/openstack/openstack.go @@ -453,7 +453,7 @@ func (builder OpenstackBuilder) DeployHost(ctx context.Context, entProvisionedHo userData = fmt.Sprintf(`