func()

in gce-containers-startup/volumes/volumes.go [363:395]


func (env Env) buildDiskMetadataReadOnlyMap() (map[string]bool, error) {
	diskMetadataReadOnlyMap := map[string]bool{}

	diskMetadataJson, err := env.MetadataProvider.RetrieveDisksMetadataAsJson()
	if err != nil {
		return nil, fmt.Errorf("Failed to retrieve disk metadata: %s", err)
	}

	var parsedMetadata []struct {
		// Note: there are other fields in the list, but they're irrelevant for our purpose.
		DeviceName string
		Mode       string
	}
	err = json.Unmarshal(diskMetadataJson, &parsedMetadata)
	if err != nil {
		return nil, fmt.Errorf("Failed to unmarshal disk metadata JSON: %s", err)
	}

	for _, entry := range parsedMetadata {
		if entry.DeviceName == "" {
			return nil, fmt.Errorf("Received empty device name in the metadata: %+v", parsedMetadata)
		}
		switch entry.Mode {
		case "READ_WRITE":
			diskMetadataReadOnlyMap[entry.DeviceName] = false
		case "READ_ONLY":
			diskMetadataReadOnlyMap[entry.DeviceName] = true
		default:
			return nil, fmt.Errorf("Received unknown device mode from metadata for device %s: %s", entry.DeviceName, entry.Mode)
		}
	}
	return diskMetadataReadOnlyMap, nil
}