diff --git a/Dockerfile.dapper b/Dockerfile.dapper index f1055bd3..cf73a34d 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -88,6 +88,7 @@ ARG USER_DOCKER_VERSION=18.06.1 ARG USER_DOCKER_ENGINE_VERSION=docker-${USER_DOCKER_VERSION}-ce ARG VMWARE_AUTOFORMAT=1 +ARG AZURE_SERVICE=false ###################################################### # Set up environment and export all ARGS as ENV @@ -126,7 +127,8 @@ ENV BUILD_DOCKER_URL=BUILD_DOCKER_URL_${ARCH} \ SYSTEM_DOCKER_URL_arm64=${SYSTEM_DOCKER_URL_arm64} \ USER_DOCKER_VERSION=${USER_DOCKER_VERSION} \ USER_DOCKER_ENGINE_VERSION=${USER_DOCKER_ENGINE_VERSION} \ - VMWARE_AUTOFORMAT=${VMWARE_AUTOFORMAT} + VMWARE_AUTOFORMAT=${VMWARE_AUTOFORMAT} \ + AZURE_SERVICE=${AZURE_SERVICE} ENV PATH=${GOPATH}/bin:/usr/local/go/bin:$PATH RUN mkdir -p ${DOWNLOADS} diff --git a/Makefile b/Makefile index 11f0d658..aa1327c8 100755 --- a/Makefile +++ b/Makefile @@ -57,6 +57,12 @@ hyperv: .dapper APPEND_SYSTEM_IMAGES="rancher/os-hypervvmtools:v4.14.85-rancher-1" \ ./.dapper release-hyperv 2>&1 | tee dist/release.log +azure: .dapper + mkdir -p dist + AZURE_SERVICE="true" \ + APPEND_SYSTEM_IMAGES="rancher/os-hypervvmtools:v4.14.85-rancher-1 rancher/os-waagent:v2.2.34-1" \ + ./.dapper release-azure 2>&1 | tee dist/release.log + 4glte: .dapper mkdir -p dist APPEND_SYSTEM_IMAGES="rancher/os-modemmanager:v1.6.4-1" \ diff --git a/cmd/cloudinitsave/cloudinitsave.go b/cmd/cloudinitsave/cloudinitsave.go index 4e4b6bc0..e2568083 100644 --- a/cmd/cloudinitsave/cloudinitsave.go +++ b/cmd/cloudinitsave/cloudinitsave.go @@ -97,23 +97,6 @@ func saveCloudConfig() error { return nil } -func RequiresNetwork(datasource string) bool { - // TODO: move into the datasources (and metadatasources) - // and then we can enable that platforms defaults.. - parts := strings.SplitN(datasource, ":", 2) - requiresNetwork, ok := map[string]bool{ - "ec2": true, - "file": false, - "url": true, - "cmdline": true, - "configdrive": false, - "digitalocean": true, - "gce": true, - "packet": true, - }[parts[0]] - return ok && requiresNetwork -} - func saveFiles(cloudConfigBytes, scriptBytes []byte, metadata datasource.Metadata) error { os.MkdirAll(rancherConfig.CloudConfigDir, os.ModeDir|0600) diff --git a/config/cloudinit/datasource/waagent/waagent.go b/config/cloudinit/datasource/waagent/waagent.go deleted file mode 100644 index 6a50bebb..00000000 --- a/config/cloudinit/datasource/waagent/waagent.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package waagent - -import ( - "encoding/xml" - "fmt" - "io/ioutil" - "net" - "os" - "path" - - "github.com/rancher/os/config/cloudinit/datasource" - "github.com/rancher/os/pkg/log" -) - -type Waagent struct { - root string - readFile func(filename string) ([]byte, error) - lastError error -} - -func NewDatasource(root string) *Waagent { - return &Waagent{root, ioutil.ReadFile, nil} -} - -func (a *Waagent) IsAvailable() bool { - _, a.lastError = os.Stat(path.Join(a.root, "provisioned")) - return !os.IsNotExist(a.lastError) -} - -func (a *Waagent) Finish() error { - return nil -} - -func (a *Waagent) String() string { - return fmt.Sprintf("%s: %s (lastError: %v)", a.Type(), a.root, a.lastError) -} - -func (a *Waagent) AvailabilityChanges() bool { - return true -} - -func (a *Waagent) ConfigRoot() string { - return a.root -} - -func (a *Waagent) FetchMetadata() (metadata datasource.Metadata, err error) { - var metadataBytes []byte - if metadataBytes, err = a.tryReadFile(path.Join(a.root, "SharedConfig.xml")); err != nil { - return - } - if len(metadataBytes) == 0 { - return - } - - type Instance struct { - ID string `xml:"id,attr"` - Address string `xml:"address,attr"` - InputEndpoints struct { - Endpoints []struct { - LoadBalancedPublicAddress string `xml:"loadBalancedPublicAddress,attr"` - } `xml:"Endpoint"` - } - } - - type SharedConfig struct { - Incarnation struct { - Instance string `xml:"instance,attr"` - } - Instances struct { - Instances []Instance `xml:"Instance"` - } - } - - var m SharedConfig - if err = xml.Unmarshal(metadataBytes, &m); err != nil { - return - } - - var instance Instance - for _, i := range m.Instances.Instances { - if i.ID == m.Incarnation.Instance { - instance = i - break - } - } - - metadata.PrivateIPv4 = net.ParseIP(instance.Address) - for _, e := range instance.InputEndpoints.Endpoints { - host, _, err := net.SplitHostPort(e.LoadBalancedPublicAddress) - if err == nil { - metadata.PublicIPv4 = net.ParseIP(host) - break - } - } - return -} - -func (a *Waagent) FetchUserdata() ([]byte, error) { - return a.tryReadFile(path.Join(a.root, "CustomData")) -} - -func (a *Waagent) Type() string { - return "Waagent" -} - -func (a *Waagent) tryReadFile(filename string) ([]byte, error) { - log.Printf("Attempting to read from %q\n", filename) - data, err := a.readFile(filename) - if os.IsNotExist(err) { - err = nil - } - return data, err -} diff --git a/config/cloudinit/datasource/waagent/waagent_test.go b/config/cloudinit/datasource/waagent/waagent_test.go deleted file mode 100644 index b455f6bd..00000000 --- a/config/cloudinit/datasource/waagent/waagent_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package waagent - -import ( - "net" - "reflect" - "testing" - - "github.com/rancher/os/config/cloudinit/datasource" - "github.com/rancher/os/config/cloudinit/datasource/test" -) - -func TestFetchMetadata(t *testing.T) { - for _, tt := range []struct { - root string - files test.MockFilesystem - metadata datasource.Metadata - }{ - { - root: "/", - files: test.NewMockFilesystem(), - }, - { - root: "/", - files: test.NewMockFilesystem(test.File{Path: "/SharedConfig.xml", Contents: ""}), - }, - { - root: "/var/lib/Waagent", - files: test.NewMockFilesystem(test.File{Path: "/var/lib/Waagent/SharedConfig.xml", Contents: ""}), - }, - { - root: "/var/lib/Waagent", - files: test.NewMockFilesystem(test.File{Path: "/var/lib/Waagent/SharedConfig.xml", Contents: ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`}), - metadata: datasource.Metadata{ - PrivateIPv4: net.ParseIP("100.73.202.64"), - PublicIPv4: net.ParseIP("191.239.39.77"), - }, - }, - } { - a := Waagent{tt.root, tt.files.ReadFile, nil} - metadata, err := a.FetchMetadata() - if err != nil { - t.Fatalf("bad error for %+v: want %v, got %q", tt, nil, err) - } - if !reflect.DeepEqual(tt.metadata, metadata) { - t.Fatalf("bad metadata for %+v: want %#v, got %#v", tt, tt.metadata, metadata) - } - } -} - -func TestFetchUserdata(t *testing.T) { - for _, tt := range []struct { - root string - files test.MockFilesystem - }{ - { - "/", - test.NewMockFilesystem(), - }, - { - "/", - test.NewMockFilesystem(test.File{Path: "/CustomData", Contents: ""}), - }, - { - "/var/lib/Waagent/", - test.NewMockFilesystem(test.File{Path: "/var/lib/Waagent/CustomData", Contents: ""}), - }, - } { - a := Waagent{tt.root, tt.files.ReadFile, nil} - _, err := a.FetchUserdata() - if err != nil { - t.Fatalf("bad error for %+v: want %v, got %q", tt, nil, err) - } - } -} - -func TestConfigRoot(t *testing.T) { - for _, tt := range []struct { - root string - configRoot string - }{ - { - "/", - "/", - }, - { - "/var/lib/Waagent", - "/var/lib/Waagent", - }, - } { - a := Waagent{tt.root, nil, nil} - if configRoot := a.ConfigRoot(); configRoot != tt.configRoot { - t.Fatalf("bad config root for %q: want %q, got %q", tt, tt.configRoot, configRoot) - } - } -} - -func TestNewDatasource(t *testing.T) { - for _, tt := range []struct { - root string - expectRoot string - }{ - { - root: "", - expectRoot: "", - }, - { - root: "/var/lib/Waagent", - expectRoot: "/var/lib/Waagent", - }, - } { - service := NewDatasource(tt.root) - if service.root != tt.expectRoot { - t.Fatalf("bad root (%q): want %q, got %q", tt.root, tt.expectRoot, service.root) - } - } -} diff --git a/os-config.tpl.yml b/os-config.tpl.yml index 5a376211..15a8263e 100644 --- a/os-config.tpl.yml +++ b/os-config.tpl.yml @@ -21,6 +21,10 @@ rancher: ssh: daemon: true hypervisor_service: true + services_include: + {{if eq "true" .AZURE_SERVICE -}} + waagent: true + {{end -}} bootstrap: bootstrap: image: {{.OS_REPO}}/os-bootstrap:{{.VERSION}}{{.SUFFIX}} @@ -130,6 +134,7 @@ rancher: - /var/lib/rancher/cache:/var/lib/rancher/cache - /var/lib/rancher/conf:/var/lib/rancher/conf - /var/lib/rancher:/var/lib/rancher + - /var/lib/waagent:/var/lib/waagent - /var/log:/var/log - /var/run:/var/run container-data-volumes: diff --git a/pkg/init/modules/modules.go b/pkg/init/modules/modules.go index fb8a0e33..7054c80d 100644 --- a/pkg/init/modules/modules.go +++ b/pkg/init/modules/modules.go @@ -26,7 +26,7 @@ func LoadModules(cfg *config.CloudConfig) (*config.CloudConfig, error) { } if util.GetHypervisor() == "hyperv" { - cfg.Rancher.Modules = append(cfg.Rancher.Modules, "hv_utils", "hv_storvsc") + cfg.Rancher.Modules = append(cfg.Rancher.Modules, "hv_utils", "hv_storvsc", "hv_vmbus") } for _, module := range cfg.Rancher.Modules { diff --git a/scripts/layout-initrd b/scripts/layout-initrd index 67d75307..e90f36f9 100755 --- a/scripts/layout-initrd +++ b/scripts/layout-initrd @@ -58,6 +58,9 @@ for file in $(ls .make-*); do ".make-hyperv") cache_services "h/hyperv-vm-tools.yml" ;; + ".make-azure") + cache_services "h/hyperv-vm-tools.yml w/waagent.yml" + ;; esac done case ${OS_CONSOLE} in diff --git a/scripts/release-azure b/scripts/release-azure new file mode 100755 index 00000000..d7fb2861 --- /dev/null +++ b/scripts/release-azure @@ -0,0 +1,25 @@ +#!/bin/bash +set -ex + +cd $(dirname $0)/.. + +touch .make-azure + +source ./scripts/version +./scripts/release-build + +touch dist/publish_gss_${VERSION}.sh dist/publish_gss_latest.sh +chmod 755 dist/publish_gss_${VERSION}.sh dist/publish_gss_latest.sh + +for file in $(ls dist/artifacts/); do + case $file in + "initrd-"*) + echo "gsutil cp dist/artifacts/${file} gs://releases.rancher.com/os/latest/azure/initrd" >> ./dist/publish_gss_latest.sh + echo "gsutil cp dist/artifacts/${file} gs://releases.rancher.com/os/${VERSION}/azure/initrd" >> ./dist/publish_gss_${VERSION}.sh + ;; + "rancheros.iso" | "rootfs.tar.gz") + echo "gsutil cp dist/artifacts/${file} gs://releases.rancher.com/os/latest/azure/${file}" >> ./dist/publish_gss_latest.sh + echo "gsutil cp dist/artifacts/${file} gs://releases.rancher.com/os/${VERSION}/azure/${file}" >> ./dist/publish_gss_${VERSION}.sh + ;; + esac +done