Skip to content
This repository was archived by the owner on Mar 22, 2018. It is now read-only.

Commit 53216be

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents e24e335 + 9fad374 commit 53216be

19 files changed

Lines changed: 884 additions & 771 deletions

File tree

cluster/addons/storage-class/openstack/default.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
apiVersion: storage.k8s.io/v1beta1
1+
apiVersion: storage.k8s.io/v1
22
kind: StorageClass
33
metadata:
44
name: standard

pkg/cloudprovider/providers/openstack/BUILD

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,42 @@ go_library(
2020
],
2121
importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack",
2222
deps = [
23-
"//pkg/api/v1/helper:go_default_library",
2423
"//pkg/api/v1/service:go_default_library",
24+
"//pkg/apis/core/v1/helper:go_default_library",
2525
"//pkg/cloudprovider:go_default_library",
2626
"//pkg/controller:go_default_library",
2727
"//pkg/util/mount:go_default_library",
2828
"//pkg/volume:go_default_library",
2929
"//vendor/github.com/golang/glog:go_default_library",
3030
"//vendor/github.com/gophercloud/gophercloud:go_default_library",
3131
"//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library",
32+
"//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/volumeactions:go_default_library",
3233
"//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes:go_default_library",
3334
"//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library",
35+
"//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library",
3436
"//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces:go_default_library",
3537
"//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach:go_default_library",
3638
"//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library",
3739
"//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts:go_default_library",
3840
"//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens:go_default_library",
3941
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions:go_default_library",
42+
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external:go_default_library",
4043
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips:go_default_library",
4144
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers:go_default_library",
42-
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members:go_default_library",
43-
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors:go_default_library",
44-
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools:go_default_library",
45-
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips:go_default_library",
4645
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners:go_default_library",
4746
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers:go_default_library",
4847
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors:go_default_library",
4948
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools:go_default_library",
5049
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups:go_default_library",
5150
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules:go_default_library",
51+
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/networks:go_default_library",
5252
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports:go_default_library",
5353
"//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library",
5454
"//vendor/github.com/mitchellh/mapstructure:go_default_library",
5555
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
5656
"//vendor/gopkg.in/gcfg.v1:go_default_library",
5757
"//vendor/k8s.io/api/core/v1:go_default_library",
58+
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
5859
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
5960
"//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library",
6061
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
@@ -71,13 +72,15 @@ go_test(
7172
"openstack_routes_test.go",
7273
"openstack_test.go",
7374
],
75+
embed = [":go_default_library"],
7476
importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack",
75-
library = ":go_default_library",
7677
deps = [
7778
"//pkg/cloudprovider:go_default_library",
7879
"//vendor/github.com/gophercloud/gophercloud:go_default_library",
7980
"//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library",
81+
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers:go_default_library",
8082
"//vendor/k8s.io/api/core/v1:go_default_library",
83+
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
8184
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
8285
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
8386
"//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library",

pkg/cloudprovider/providers/openstack/metadata.go

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,45 @@ import (
3333
)
3434

3535
const (
36-
// metadataUrl is URL to OpenStack metadata server. It's hardcoded IPv4
37-
// link-local address as documented in "OpenStack Cloud Administrator Guide",
38-
// chapter Compute - Networking with nova-network.
36+
// metadataUrlTemplate allows building an OpenStack Metadata service URL.
37+
// It's a hardcoded IPv4 link-local address as documented in "OpenStack Cloud
38+
// Administrator Guide", chapter Compute - Networking with nova-network.
3939
// https://docs.openstack.org/admin-guide/compute-networking-nova.html#metadata-service
40-
metadataUrl = "http://169.254.169.254/openstack/2012-08-10/meta_data.json"
40+
defaultMetadataVersion = "2012-08-10"
41+
metadataUrlTemplate = "http://169.254.169.254/openstack/%s/meta_data.json"
4142

4243
// metadataID is used as an identifier on the metadata search order configuration.
4344
metadataID = "metadataService"
4445

4546
// Config drive is defined as an iso9660 or vfat (deprecated) drive
4647
// with the "config-2" label.
4748
// http://docs.openstack.org/user-guide/cli-config-drive.html
48-
configDriveLabel = "config-2"
49-
configDrivePath = "openstack/2012-08-10/meta_data.json"
49+
configDriveLabel = "config-2"
50+
configDrivePathTemplate = "openstack/%s/meta_data.json"
5051

5152
// configDriveID is used as an identifier on the metadata search order configuration.
5253
configDriveID = "configDrive"
5354
)
5455

55-
var ErrBadMetadata = errors.New("Invalid OpenStack metadata, got empty uuid")
56+
var ErrBadMetadata = errors.New("invalid OpenStack metadata, got empty uuid")
57+
58+
// There are multiple device types. To keep it simple, we're using a single structure
59+
// for all device metadata types.
60+
type DeviceMetadata struct {
61+
Type string `json:"type"`
62+
Bus string `json:"bus,omitempty"`
63+
Serial string `json:"serial,omitempty"`
64+
Address string `json:"address,omitempty"`
65+
// .. and other fields.
66+
}
5667

5768
// Assumes the "2012-08-10" meta_data.json format.
5869
// See http://docs.openstack.org/user-guide/cli_config_drive.html
5970
type Metadata struct {
60-
Uuid string `json:"uuid"`
61-
Name string `json:"name"`
62-
AvailabilityZone string `json:"availability_zone"`
71+
Uuid string `json:"uuid"`
72+
Name string `json:"name"`
73+
AvailabilityZone string `json:"availability_zone"`
74+
Devices []DeviceMetadata `json:"devices,omitempty"`
6375
// .. and other fields we don't care about. Expand as necessary.
6476
}
6577

@@ -79,7 +91,15 @@ func parseMetadata(r io.Reader) (*Metadata, error) {
7991
return &metadata, nil
8092
}
8193

82-
func getMetadataFromConfigDrive() (*Metadata, error) {
94+
func getMetadataUrl(metadataVersion string) string {
95+
return fmt.Sprintf(metadataUrlTemplate, metadataVersion)
96+
}
97+
98+
func getConfigDrivePath(metadataVersion string) string {
99+
return fmt.Sprintf(configDrivePathTemplate, metadataVersion)
100+
}
101+
102+
func getMetadataFromConfigDrive(metadataVersion string) (*Metadata, error) {
83103
// Try to read instance UUID from config drive.
84104
dev := "/dev/disk/by-label/" + configDriveLabel
85105
if _, err := os.Stat(dev); os.IsNotExist(err) {
@@ -89,8 +109,7 @@ func getMetadataFromConfigDrive() (*Metadata, error) {
89109
"-o", "device",
90110
).CombinedOutput()
91111
if err != nil {
92-
glog.V(2).Infof("Unable to run blkid: %v", err)
93-
return nil, err
112+
return nil, fmt.Errorf("unable to run blkid: %v", err)
94113
}
95114
dev = strings.TrimSpace(string(out))
96115
}
@@ -109,37 +128,35 @@ func getMetadataFromConfigDrive() (*Metadata, error) {
109128
err = mounter.Mount(dev, mntdir, "vfat", []string{"ro"})
110129
}
111130
if err != nil {
112-
glog.Errorf("Error mounting configdrive %s: %v", dev, err)
113-
return nil, err
131+
return nil, fmt.Errorf("error mounting configdrive %s: %v", dev, err)
114132
}
115133
defer mounter.Unmount(mntdir)
116134

117135
glog.V(4).Infof("Configdrive mounted on %s", mntdir)
118136

137+
configDrivePath := getConfigDrivePath(metadataVersion)
119138
f, err := os.Open(
120139
filepath.Join(mntdir, configDrivePath))
121140
if err != nil {
122-
glog.Errorf("Error reading %s on config drive: %v", configDrivePath, err)
123-
return nil, err
141+
return nil, fmt.Errorf("error reading %s on config drive: %v", configDrivePath, err)
124142
}
125143
defer f.Close()
126144

127145
return parseMetadata(f)
128146
}
129147

130-
func getMetadataFromMetadataService() (*Metadata, error) {
131-
// Try to get JSON from metdata server.
148+
func getMetadataFromMetadataService(metadataVersion string) (*Metadata, error) {
149+
// Try to get JSON from metadata server.
150+
metadataUrl := getMetadataUrl(metadataVersion)
132151
glog.V(4).Infof("Attempting to fetch metadata from %s", metadataUrl)
133152
resp, err := http.Get(metadataUrl)
134153
if err != nil {
135-
glog.V(3).Infof("Cannot read %s: %v", metadataUrl, err)
136-
return nil, err
154+
return nil, fmt.Errorf("error fetching %s: %v", metadataUrl, err)
137155
}
138156
defer resp.Body.Close()
139157

140158
if resp.StatusCode != http.StatusOK {
141-
err = fmt.Errorf("Unexpected status code when reading metadata from %s: %s", metadataUrl, resp.Status)
142-
glog.V(3).Infof("%v", err)
159+
err = fmt.Errorf("unexpected status code when reading metadata from %s: %s", metadataUrl, resp.Status)
143160
return nil, err
144161
}
145162

@@ -159,9 +176,9 @@ func getMetadata(order string) (*Metadata, error) {
159176
id = strings.TrimSpace(id)
160177
switch id {
161178
case configDriveID:
162-
md, err = getMetadataFromConfigDrive()
179+
md, err = getMetadataFromConfigDrive(defaultMetadataVersion)
163180
case metadataID:
164-
md, err = getMetadataFromMetadataService()
181+
md, err = getMetadataFromMetadataService(defaultMetadataVersion)
165182
default:
166183
err = fmt.Errorf("%s is not a valid metadata search order option. Supported options are %s and %s", id, configDriveID, metadataID)
167184
}

pkg/cloudprovider/providers/openstack/metadata_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,16 @@ func TestParseMetadata(t *testing.T) {
6464
"public_keys": {
6565
"mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDBqUfVvCSez0/Wfpd8dLLgZXV9GtXQ7hnMN+Z0OWQUyebVEHey1CXuin0uY1cAJMhUq8j98SiW+cU0sU4J3x5l2+xi1bodDm1BtFWVeLIOQINpfV1n8fKjHB+ynPpe1F6tMDvrFGUlJs44t30BrujMXBe8Rq44cCk6wqyjATA3rQ== Generated by Nova\n"
6666
},
67-
"uuid": "83679162-1378-4288-a2d4-70e13ec132aa"
67+
"uuid": "83679162-1378-4288-a2d4-70e13ec132aa",
68+
"devices": [
69+
{
70+
"bus": "scsi",
71+
"serial": "6df1888b-f373-41cf-b960-3786e60a28ef",
72+
"tags": ["fake_tag"],
73+
"type": "disk",
74+
"address": "0:0:0:0"
75+
}
76+
]
6877
}
6978
`)
7079
md, err := parseMetadata(data)
@@ -83,4 +92,20 @@ func TestParseMetadata(t *testing.T) {
8392
if md.AvailabilityZone != "nova" {
8493
t.Errorf("incorrect az: %s", md.AvailabilityZone)
8594
}
95+
96+
if len(md.Devices) != 1 {
97+
t.Errorf("expecting to find 1 device, found %d", len(md.Devices))
98+
}
99+
100+
if md.Devices[0].Bus != "scsi" {
101+
t.Errorf("incorrect disk bus: %s", md.Devices[0].Bus)
102+
}
103+
104+
if md.Devices[0].Address != "0:0:0:0" {
105+
t.Errorf("incorrect disk address: %s", md.Devices[0].Address)
106+
}
107+
108+
if md.Devices[0].Type != "disk" {
109+
t.Errorf("incorrect device type: %s", md.Devices[0].Type)
110+
}
86111
}

0 commit comments

Comments
 (0)