env/linux-arm/scaleway, cmd/scaleway: remove scaleway command and image

Scaleway builders are no longer in use. The scaleway command is no
longer needed to manage instances. The image configuration for
Scaleway specific machines will be removed.

Updates golang/go#45066

Change-Id: I587ff909993e9c3a60a3c983d60269c931ab3ed1
Reviewed-on: https://go-review.googlesource.com/c/build/+/325695
Trust: Carlos Amedee <carlos@golang.org>
Run-TryBot: Carlos Amedee <carlos@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Alexander Rakoczy <alex@golang.org>
diff --git a/cmd/scaleway/.gitignore b/cmd/scaleway/.gitignore
deleted file mode 100644
index f9aad2d..0000000
--- a/cmd/scaleway/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-scaleway
-ca-certificates.crt
diff --git a/cmd/scaleway/Dockerfile b/cmd/scaleway/Dockerfile
deleted file mode 100644
index b76e26a..0000000
--- a/cmd/scaleway/Dockerfile
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-FROM golang:1.12-stretch AS build
-LABEL maintainer "golang-dev@googlegroups.com"
-
-ENV GO111MODULE=on
-ENV GOPROXY=https://proxy.golang.org
-
-RUN mkdir /gocache
-ENV GOCACHE /gocache
-
-COPY go.mod /go/src/golang.org/x/build/go.mod
-COPY go.sum /go/src/golang.org/x/build/go.sum
-
-WORKDIR /go/src/golang.org/x/build
-
-# Optimization for iterative docker build speed, not necessary for correctness:
-# TODO: write a tool to make writing Go module-friendly Dockerfiles easier.
-RUN go install go4.org/types
-
-COPY . /go/src/golang.org/x/build/
-
-# Install binary to /go/bin:
-RUN go install golang.org/x/build/cmd/scaleway
-
-FROM debian:stretch
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-    ca-certificates \
-    netbase \
-    curl \
-    && rm -rf /var/lib/apt/lists/*
-
-COPY --from=build /go/bin/scaleway /scaleway
diff --git a/cmd/scaleway/Makefile b/cmd/scaleway/Makefile
deleted file mode 100644
index 52a5753..0000000
--- a/cmd/scaleway/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-VERSION=latest
-
-docker: Dockerfile *.go
-	xb docker build -f Dockerfile --force-rm --tag=golang/scaleway:$(VERSION) ../..
-
-push-prod: docker
-	docker tag golang/scaleway:$(VERSION) gcr.io/symbolic-datum-552/scaleway:$(VERSION)
-	docker push gcr.io/symbolic-datum-552/scaleway:$(VERSION)
-
-stop-prod:
-	xb --prod kubectl delete -f deployment-prod.yaml
-
-start-prod:
-	xb --prod kubectl create -f deployment-prod.yaml
-
-restart-prod:
-	xb --prod kubectl delete -f deployment-prod.yaml || true
-	xb --prod kubectl create -f deployment-prod.yaml
diff --git a/cmd/scaleway/README.md b/cmd/scaleway/README.md
deleted file mode 100644
index 9e87707..0000000
--- a/cmd/scaleway/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-<!-- Auto-generated by x/build/update-readmes.go -->
-
-[![Go Reference](https://pkg.go.dev/badge/golang.org/x/build/cmd/scaleway.svg)](https://pkg.go.dev/golang.org/x/build/cmd/scaleway)
-
-# golang.org/x/build/cmd/scaleway
-
-The scaleway command creates ARM servers on Scaleway.com.
-<!-- End of auto-generated section -->
-
-The Makefile, Dockerfiles, and kubernetes deployment file
-are for running the command in daemon mode for server repair.
-This will check on Scaleway and restart down or wedged instances.
diff --git a/cmd/scaleway/deployment-prod.yaml b/cmd/scaleway/deployment-prod.yaml
deleted file mode 100644
index db47ec5..0000000
--- a/cmd/scaleway/deployment-prod.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-apiVersion: extensions/v1beta1
-kind: Deployment # TODO(jessfraz): make this a cronjob once out of k8s alpha and remove daemon mode
-metadata:
-  name: scaleway-deployment
-spec:
-  replicas: 1 # more than one will create a race with creating new servers
-  template:
-    metadata:
-      labels:
-        app: scaleway
-      annotations:
-        container.seccomp.security.alpha.kubernetes.io/scaleway: docker/default
-        container.apparmor.security.beta.kubernetes.io/scaleway: runtime/default
-    spec:
-      restartPolicy: Always
-      volumes:
-        - name: secrets-volume
-          secret:
-            secretName: scaleway-secrets # http://go/golang-k8s-scaleway-secret
-            items:
-              - key: scalewayToken
-                path: go-scaleway.token
-              - key: masterKey
-                path: gobuilder-master.key
-      containers:
-        - name: scaleway
-          image: gcr.io/symbolic-datum-552/scaleway:latest
-          imagePullPolicy: Always
-          command: ["/scaleway", "-daemon", "-token-dir=/keys"]
-          volumeMounts:
-            - name: secrets-volume
-              mountPath: /keys
diff --git a/cmd/scaleway/scaleway.go b/cmd/scaleway/scaleway.go
deleted file mode 100644
index f8e085e..0000000
--- a/cmd/scaleway/scaleway.go
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The scaleway command creates ARM servers on Scaleway.com.
-package main
-
-import (
-	"bytes"
-	"context"
-	"crypto/hmac"
-	"crypto/md5"
-	"encoding/json"
-	"flag"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"os"
-	"path/filepath"
-	"sort"
-	"strconv"
-	"strings"
-	"time"
-
-	"go4.org/types"
-	"golang.org/x/build/internal/secret"
-	revtype "golang.org/x/build/types"
-)
-
-var (
-	tokenDir    = flag.String("token-dir", filepath.Join(os.Getenv("HOME"), "keys"), "directory to read gobuilder-staging.key, gobuilder-master.key and go-scaleway.token from.")
-	token       = flag.String("token", "", "API token. If empty, the file is read from $(token-dir)/go-scaleway.token. Googlers on the Go team can get the value from http://go/golang-scaleway-token")
-	org         = flag.String("org", "1f34701d-668b-441b-bf08-0b13544e99de", "Organization ID (default is bradfitz@golang.org's account)")
-	image       = flag.String("image", "13f4c905-3a4b-475a-aaba-a13168e2b6c7", "Disk image ID; default is the snapshot we made last")
-	bootscript  = flag.String("bootscript", "5c8e4527-d166-4844-b6c6-087d7a6f5fb0", "Bootscript ID; empty means to use the default for the image. But our images don't have a correct default.")
-	num         = flag.Int("n", 0, "Number of servers to create; if zero, defaults to a value as a function of --staging")
-	tags        = flag.String("tags", "", "Comma-separated list of tags. The build key tags should be of the form 'buildkey_linux-arm_HEXHEXHEXHEXHEX'. If empty, it's automatic.")
-	staging     = flag.Bool("staging", false, "If true, deploy staging instances (with staging names and tags) instead of prod.")
-	listAll     = flag.Bool("list-all", false, "If true, list all (prod, staging, other) current Scaleway servers and stop without making changes.")
-	list        = flag.Bool("list", false, "If true, list all prod (or staging, if -staging) servers, including missing ones.")
-	fixInterval = flag.Duration("fix-interval", 10*time.Minute, "Interval to wait before running again (only applies to daemon mode)")
-	daemonMode  = flag.Bool("daemon", false, "Run in daemon mode in a loop")
-	ipv6        = flag.Bool("ipv6", false, "enable IPv6 on scaleway instances")
-)
-
-const (
-	// ctype is the Commercial Type of server we use for the builders.
-	ctype = "C1"
-
-	scalewayAPIBase = "https://api.scaleway.com"
-)
-
-func main() {
-	flag.Parse()
-
-	secretClient := secret.MustNewClient()
-	defer secretClient.Close()
-
-	if *tags == "" && !*listAll { // Tags aren't needed if -list-all flag is set.
-		if *staging {
-			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-			defer cancel()
-
-			key, err := secretClient.Retrieve(ctx, "builders_staging_key")
-			if err != nil {
-				log.Fatalf("unable to retrieve master key %v", err)
-			}
-			*tags = key
-		}
-	} else {
-		*tags = defaultBuilderTags("gobuilder-master.key")
-	}
-	if *num == 0 {
-		if *staging {
-			*num = 5
-		} else {
-			*num = 50
-		}
-	}
-	if *token == "" {
-		file := filepath.Join(*tokenDir, "go-scaleway.token")
-		slurp, err := ioutil.ReadFile(file)
-		if err != nil {
-			if os.IsNotExist(err) {
-				log.Fatalf("No --token flag specified and token file %s does not exist. Googlers on the Go team can get it via http://go/golang-scaleway-token", file)
-			}
-			log.Fatalf("No --token specified and error reading backup token file: %v", err)
-		}
-		*token = strings.TrimSpace(string(slurp))
-	}
-
-	// Loop over checkServers() in daemon mode.
-	if *daemonMode {
-		log.Printf("scaleway instance checker daemon running.")
-	}
-	for {
-		checkServers()
-		if !*daemonMode {
-			return
-		}
-		time.Sleep(*fixInterval)
-	}
-}
-
-func checkServers() {
-	timer := time.AfterFunc(5*time.Minute, func() { panic("Timeout running checkServers.") })
-	defer timer.Stop()
-
-	cl := &Client{Token: *token}
-	serverList, err := cl.Servers()
-	if err != nil {
-		log.Fatal(err)
-	}
-	var names []string
-	servers := map[string]*Server{}
-	for _, s := range serverList {
-		servers[s.Name] = s
-		names = append(names, s.Name)
-	}
-	sort.Strings(names)
-	if *listAll {
-		for _, name := range names {
-			s := servers[name]
-			fmt.Printf("%s: %v, id=%v, state=%s, created=%v, modified=%v, image=%v\n",
-				name, s.PublicIP, s.ID, s.State, s.CreationDate, s.ModificationDate, s.Image)
-		}
-		return
-	}
-	for i := 1; i <= *num; i++ {
-		name := serverName(i)
-		if _, ok := servers[name]; !ok {
-			servers[name] = &Server{Name: name}
-			names = append(names, name)
-		}
-	}
-	sort.Strings(names)
-
-	for name, revBuilder := range getConnectedMachines() {
-		if _, ok := servers[name]; !ok {
-			log.Printf("Machine connected to farmer.golang.org is unknown to scaleway: %v; ignoring", name)
-			continue
-		}
-		servers[name].Connected = revBuilder
-	}
-
-	if *list {
-		for _, name := range names {
-			s := servers[name]
-			status := "NOT_CONNECTED"
-			if s.Connected != nil {
-				status = "ok"
-			}
-			fmt.Printf("%s: %s, %v, id=%v, state=%s, created=%v, modified=%v, image=%v\n",
-				name, status, s.PublicIP, s.ID, s.State, s.CreationDate, s.ModificationDate, s.Image)
-		}
-	}
-
-	for i := 1; i <= *num; i++ {
-		name := serverName(i)
-		server := servers[name]
-
-		if server.Image != nil && server.Image.ID != *image {
-			log.Printf("server %s, state %q, running wrong image %s (want %s)", name, server.State, server.Image.ID, *image)
-			switch server.State {
-			case "running":
-				log.Printf("powering off %s ...", name)
-				if err := cl.PowerOff(server.ID); err != nil {
-					log.Printf("PowerOff(%q (%q)): %v", server.ID, name, err)
-				}
-			case "stopped":
-				log.Printf("deleting %s ...", name)
-				if err := cl.Delete(server.ID); err != nil {
-					log.Printf("Delete(%q (%q)): %v", server.ID, name, err)
-				}
-			}
-		}
-
-		if server.Connected != nil {
-			continue
-		}
-
-		if server.State == "running" {
-			if time.Time(server.ModificationDate).Before(time.Now().Add(15 * time.Minute)) {
-				log.Printf("rebooting old running-but-disconnected %q server...", name)
-				err := cl.serverAction(server.ID, "reboot")
-				log.Printf("reboot(%q): %v", name, err)
-				continue
-			}
-			// Started recently. Maybe still booting.
-			continue
-		}
-		if server.State != "" {
-			log.Printf("server %q in state %q; not creating", name, server.State)
-			continue
-		}
-		tags := strings.Split(*tags, ",")
-		if *staging {
-			tags = append(tags, "staging")
-		}
-		body, err := json.Marshal(createServerRequest{
-			Org:            *org,
-			Name:           name,
-			Image:          *image,
-			CommercialType: ctype,
-			Tags:           tags,
-			EnableIPV6:     *ipv6,
-			BootType:       "bootscript", // the "local" boot mode doesn't work on C1,
-			Bootscript:     *bootscript,
-		})
-		if err != nil {
-			log.Fatal(err)
-		}
-		log.Printf("sending createServerRequest: %s", body)
-		// TODO: update to their new API path format that includes the zone.
-		req, err := http.NewRequest("POST", scalewayAPIBase+"/servers", bytes.NewReader(body))
-		if err != nil {
-			log.Fatal(err)
-		}
-		req.Header.Set("Content-Type", "application/json")
-		req.Header.Set("X-Auth-Token", *token)
-		res, err := http.DefaultClient.Do(req)
-		if err != nil {
-			log.Fatal(err)
-		}
-		if res.StatusCode == http.StatusOK {
-			log.Printf("created %v", i)
-		} else {
-			slurp, _ := ioutil.ReadAll(io.LimitReader(res.Body, 4<<10))
-			log.Printf("creating number %v, %s: %s", i, res.Status, slurp)
-		}
-		res.Body.Close()
-	}
-
-	serverList, err = cl.Servers()
-	if err != nil {
-		log.Fatal(err)
-	}
-	for _, s := range serverList {
-		if strings.HasSuffix(s.Name, "-prep") || strings.HasSuffix(s.Name, "-hand") {
-			continue
-		}
-		if s.State == "stopped" {
-			log.Printf("Powering on %s (%s) = %v", s.Name, s.ID, cl.PowerOn(s.ID))
-		}
-	}
-}
-
-type createServerRequest struct {
-	Org            string   `json:"organization"`
-	Name           string   `json:"name"`
-	Image          string   `json:"image"`
-	CommercialType string   `json:"commercial_type"`
-	Tags           []string `json:"tags"`
-	EnableIPV6     bool     `json:"enable_ipv6,omitempty"`
-	BootType       string   `json:"boot_type,omitempty"` // local, bootscript, rescue; the default of local doesn't work on C1 machines
-	Bootscript     string   `json:"bootscript,omitempty"`
-}
-
-type Client struct {
-	Token string
-}
-
-// Delete deletes a server. It needs to be powered off in "stopped" state first.
-//
-// This is currently unused. An earlier version of this tool used it briefly before
-// changing to use the reboot action. We might want this later.
-func (c *Client) Delete(serverID string) error {
-	req, _ := http.NewRequest("DELETE", scalewayAPIBase+"/instance/v1/zones/fr-par-1/servers/"+serverID, nil)
-	req.Header.Set("Content-Type", "application/json")
-	req.Header.Set("X-Auth-Token", c.Token)
-	res, err := http.DefaultClient.Do(req)
-	if err != nil {
-		return err
-	}
-	defer res.Body.Close()
-	if res.StatusCode != http.StatusNoContent {
-		slurp, _ := ioutil.ReadAll(io.LimitReader(res.Body, 1<<10))
-		return fmt.Errorf("error deleting %s: %v, %s", serverID, res.Status, slurp)
-	}
-	return nil
-}
-
-func (c *Client) PowerOn(serverID string) error {
-	return c.serverAction(serverID, "poweron")
-}
-
-func (c *Client) PowerOff(serverID string) error {
-	return c.serverAction(serverID, "poweroff")
-}
-
-func (c *Client) serverAction(serverID, action string) error {
-	req, _ := http.NewRequest("POST", scalewayAPIBase+"/servers/"+serverID+"/action", strings.NewReader(fmt.Sprintf(`{"action":"%s"}`, action)))
-	req.Header.Set("Content-Type", "application/json")
-	req.Header.Set("X-Auth-Token", c.Token)
-	res, err := http.DefaultClient.Do(req)
-	if err != nil {
-		return err
-	}
-	defer res.Body.Close()
-	if res.StatusCode/100 != 2 {
-		return fmt.Errorf("error doing %q on %s: %v", action, serverID, res.Status)
-	}
-	return nil
-}
-
-func (c *Client) Servers() ([]*Server, error) {
-	req, _ := http.NewRequest("GET", scalewayAPIBase+"/servers?per_page=100", nil)
-	req.Header.Set("X-Auth-Token", c.Token)
-	res, err := http.DefaultClient.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer res.Body.Close()
-	if res.StatusCode != http.StatusOK {
-		return nil, fmt.Errorf("failed to get Server list: %v", res.Status)
-	}
-	if n, _ := strconv.Atoi(res.Header.Get("X-Total-Count")); n > 100 {
-		// TODO: Get all pages, not just first one. See https://developer.scaleway.com/#header-pagination.
-		return nil, fmt.Errorf("results (%d) don't fit in one page (100) and pagination isn't implemented", n)
-	}
-	var jres struct {
-		Servers []*Server `json:"servers"`
-	}
-	err = json.NewDecoder(res.Body).Decode(&jres)
-	return jres.Servers, err
-}
-
-type Server struct {
-	ID               string         `json:"id"`
-	Name             string         `json:"name"`
-	PublicIP         *IP            `json:"public_ip"`
-	PrivateIP        string         `json:"private_ip"`
-	Tags             []string       `json:"tags"`
-	State            string         `json:"state"`
-	Image            *Image         `json:"image"`
-	CreationDate     types.Time3339 `json:"creation_date"`
-	ModificationDate types.Time3339 `json:"modification_date"`
-
-	// Connected is non-nil if the server is connected to farmer.golang.org.
-	// This does not come from the Scaleway API.
-	Connected *revtype.ReverseBuilder `json:"-"`
-}
-
-type Image struct {
-	ID   string `json:"id"`
-	Name string `json:"name"`
-}
-
-func (im *Image) String() string {
-	if im == nil {
-		return "<no Image>"
-	}
-	return im.ID
-}
-
-type IP struct {
-	ID      string `json:"id"`
-	Address string `json:"address"`
-}
-
-func (ip *IP) String() string {
-	if ip == nil {
-		return "<no IP>"
-	}
-	return ip.Address
-}
-
-// defaultBuilderTags returns the default value of the "tags" flag.
-// It returns a comma-separated list of builder tags (each of the form buildkey_$(BUILDER)_$(SECRETHEX)).
-func defaultBuilderTags(baseKeyFile string) string {
-	keyFile := filepath.Join(*tokenDir, baseKeyFile)
-	slurp, err := ioutil.ReadFile(keyFile)
-	if err != nil {
-		log.Fatal(err)
-	}
-	var tags []string
-	for _, builder := range []string{
-		"host-linux-arm-scaleway",
-	} {
-		h := hmac.New(md5.New, bytes.TrimSpace(slurp))
-		h.Write([]byte(builder))
-		tags = append(tags, fmt.Sprintf("buildkey_%s_%x", builder, h.Sum(nil)))
-	}
-	return strings.Join(tags, ",")
-}
-
-func serverName(i int) string {
-	if *staging {
-		return fmt.Sprintf("scaleway-staging-%02d", i)
-	}
-	return fmt.Sprintf("scaleway-prod-%02d", i)
-}
-
-func getConnectedMachines() map[string]*revtype.ReverseBuilder {
-	const reverseURL = "https://farmer.golang.org/status/reverse.json"
-	res, err := http.Get(reverseURL)
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer res.Body.Close()
-	if res.StatusCode != http.StatusOK {
-		log.Fatalf("getting %s: %s", reverseURL, res.Status)
-	}
-	var jres revtype.ReverseBuilderStatus
-	if err := json.NewDecoder(res.Body).Decode(&jres); err != nil {
-		log.Fatalf("reading %s: %v", reverseURL, err)
-	}
-	st := jres.HostTypes["host-linux-arm-scaleway"]
-	if st == nil {
-		return nil
-	}
-	return st.Machines
-}
diff --git a/env/linux-arm/scaleway/Dockerfile b/env/linux-arm/scaleway/Dockerfile
deleted file mode 100644
index 306f420..0000000
--- a/env/linux-arm/scaleway/Dockerfile
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-FROM golang:1.13 AS build
-RUN go get golang.org/x/build/cmd/buildlet/stage0
-
-FROM debian:buster
-
-RUN apt-get update
-
-RUN apt-get install --yes \
-          gcc strace procps psmisc libc6-dev curl netbase \
-          openssh-server
-
-RUN curl -L https://golang.org/dl/go1.13.4.linux-armv6l.tar.gz | \
-    tar xzv  -C /usr/local && /usr/local/go/bin/go version
-
-ENV GOROOT_BOOTSTRAP=/usr/local/go
-
-# compiled stage0 binary must be in working dir
-COPY --from=build /go/bin/stage0 /usr/local/bin/stage0
-
-CMD ["/usr/local/bin/stage0"]
diff --git a/env/linux-arm/scaleway/Makefile b/env/linux-arm/scaleway/Makefile
deleted file mode 100644
index ab4ae4b..0000000
--- a/env/linux-arm/scaleway/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Compiled stage0 binary must be in working dir.
-
-STAGING_BUCKET=dev-go-builder-data
-PROD_BUCKET=go-builder-data
-
-staging: Dockerfile
-	docker build --build-arg buildlet_bucket=$(STAGING_BUCKET) -t gobuilder-arm-scaleway:latest .
-
-prod: Dockerfile
-	docker build --build-arg buildlet_bucket=$(PROD_BUCKET) -t gobuilder-arm-scaleway:latest .
diff --git a/env/linux-arm/scaleway/README b/env/linux-arm/scaleway/README
deleted file mode 100644
index 3ced718..0000000
--- a/env/linux-arm/scaleway/README
+++ /dev/null
@@ -1,83 +0,0 @@
-C1 machines:
-
-    $ ssh -i ~/keys/id_ed25519_golang1 root@$C1_SERVER_IP
-    (key: http://go/go-builders-ssh)
-
-Machine setup:
-
-* start with Ubuntu bionic
-* install docker-ce from Docker
-* GOOS=linux GOARCH=arm go install golang.org/x/build/cmd/rundockerbuildlet
-* scp -C -i ~/keys/id_ed25519_golang1 $(GOOS=linux GOARCH=arm go list -f {{.Target}} golang.org/x/build/cmd/rundockerbuildlet) root@$C1_SERVER_IP:/usr/local/bin
-* scp -i ~/keys/id_ed25519_golang1 rundockerbuildlet.service root@$C1_SERVER_IP:/etc/systemd/user/
-* ssh -i ~/keys/id_ed25519_golang1 root@$C1_SERVER_IP systemctl enable /etc/systemd/user/rundockerbuildlet.service
-* ssh -i ~/keys/id_ed25519_golang1 root@$C1_SERVER_IP systemctl start rundockerbuildlet
-
-* stop it
-* snapshot its attached volume, name it (e.g. "buildlet-2019-11-05-1"), note its UUID
-* click "Images" in top tab, create an image from that same snapshot. Can use the same name. (different namespaces)
-* click "..." and "More info" on that image, get its ID (e.g. "13f4c905-3a4b-475a-aaba-a13168e2b6c7")
-* copy that to cmd/scaleway's default flag value
-* also update cmd/scaleway's bootscript value, if needed:
-
-First, find out which bootscript (netboot kernel, initrd, etc) that the original image was using:
-
-    bradfitz@go:~$ scw images --no-trunc | grep Bionic
-    Ubuntu_Bionic_ML_10_1        latest              47d58f71-8382-48d1-88cd-75e5f1ed7df6   8 months            [     par1]         [x86_64]
-    Ubuntu_Bionic_ML_9_2         latest              905865bf-e34c-46b0-b7e2-5e11922e6511   8 months            [     par1]         [x86_64]
-    Ubuntu_Bionic                latest              e640c621-305b-45f5-975f-a3f80c1cec66   18 months           [ams1 par1]         [arm arm64 x86_64]
-    bradfitz@go:~$ scw inspect e640c621-305b-45f5-975f-a3f80c1cec66
-      IMAGEID           FROM                  NAME                ZONE                ARCH
-    - f974feac          image:ubuntu-bionic   Ubuntu Bionic       par1                x86_64
-    - f63fe42a          image:ubuntu-bionic   Ubuntu Bionic       par1                arm
-    - b4bdbee1          image:ubuntu-bionic   Ubuntu Bionic       par1                arm64
-    FATA[0000] Too many candidates for e640c621-305b-45f5-975f-a3f80c1cec66 (3) 
-    bradfitz@go:~$ scw inspect f63fe42a
-    [{
-      "id": "f63fe42a-900f-4a5e-ba99-ab0e59469b7e",
-      "name": "Ubuntu Bionic Beaver",
-      "creation_date": "2019-03-05T10:27:18.195593+00:00",
-      "modification_date": "2019-03-05T13:32:45.036625+00:00",
-      "root_volume": {
-        "id": "81992ee7-89b5-44f7-a260-5b4594c74b86",
-        "size": 10000000000,
-        "name": "snapshot-664f5068-f21e-44ba-8a99-ea2dfd6fd91f-2019-03-05_10:27",
-        "volume_type": "l_ssd"
-      },
-      "public": true,
-      "default_bootscript": {
-        "bootcmdargs": "LINUX_COMMON scaleway boot=local nbd.max_part=16",
-        "dtb": "dtb/c1-armv7l-mainline-lts-4.9-4.9.93-rev1",
-        "initrd": "initrd/uInitrd-Linux-armv7l-v3.14.6",
-        "kernel": "kernel/armv7l-mainline-lts-4.9-4.9.93-rev1",
-        "architecture": "arm",
-        "id": "5c8e4527-d166-4844-b6c6-087d7a6f5fb0",
-        "organization": "11111111-1111-4111-8111-111111111111",
-        "title": "armv7l mainline 4.9.93 rev1"
-      },
-      "organization": "51b656e3-4865-41e8-adbc-0c45bdd780db",
-      "arch": "arm"
-    }]
-
-Look use that default_bootscript.id value as cmd/scaleway's --bootscript flag.
-
-Updating the docker image on eu.gcr.io:
-
-* create a dev Ubuntu image on scaleway
-* install Docker on it
-* copy Dockerfile to it
-
-  root@scaleway:~# cat Dockerfile | docker build -t eu.gcr.io/symbolic-datum-552/scaleway-builder -
-
-* in your normal gcloud dev environment, get a short-lived access token:
-
-  you@dev:~$ gcloud auth print-access-token
-  
-* copy/paste it
-* back on scaleway, log in, and paste the token when it asks for the password:
-
-  root@scaleway:~# docker login -u oauth2accesstoken https://eu.gcr.io
-  Password: <paste>
-  WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
-
-  root@scaleway:~# docker push eu.gcr.io/symbolic-datum-552/scaleway-builder 
diff --git a/env/linux-arm/scaleway/rundockerbuildlet.service b/env/linux-arm/scaleway/rundockerbuildlet.service
deleted file mode 100644
index c96c6ea..0000000
--- a/env/linux-arm/scaleway/rundockerbuildlet.service
+++ /dev/null
@@ -1,13 +0,0 @@
-[Unit]
-Description=Run Buildlets in Docker
-After=network.target
-
-[Install]
-WantedBy=network-online.target
-
-[Service]
-Type=simple
-ExecStart=/usr/local/bin/rundockerbuildlet -env=host-linux-arm-scaleway
-Restart=always
-RestartSec=2
-StartLimitInterval=0