示例#1
0
// parseSecretMap locates the secret by key name.
func parseSecret(namespace, secretName string, kubeClient clientset.Interface) (string, error) {
	secretMap, err := volutil.GetSecret(namespace, secretName, kubeClient)
	if err != nil {
		glog.Errorf("failed to get secret from [%q/%q]", namespace, secretName)
		return "", fmt.Errorf("failed to get secret from [%q/%q]", namespace, secretName)
	}
	if len(secretMap) == 0 {
		return "", fmt.Errorf("empty secret map")
	}
	secret := ""
	for k, v := range secretMap {
		if k == secretKeyName {
			return v, nil
		}
		secret = v
	}
	// If not found, the last secret in the map wins as done before
	return secret, nil
}
示例#2
0
func (deleter *quobyteVolumeDeleter) Delete() error {
	var quobyteUser, quobytePassword string
	annotations, err := util.ParseVolumeAnnotations(deleter.pv, []string{
		annotationQuobyteAPISecret,
		annotationQuobyteAPISecretNamespace,
		annotationQuobyteAPIServer})

	if err != nil {
		return err
	}

	secretMap, err := util.GetSecret(
		annotations[annotationQuobyteAPISecretNamespace],
		annotations[annotationQuobyteAPISecret],
		deleter.plugin.host.GetKubeClient())

	if err != nil {
		return err
	}

	var ok bool
	if quobyteUser, ok = secretMap["user"]; !ok {
		return fmt.Errorf("Missing \"user\" in secret")
	}

	if quobytePassword, ok = secretMap["password"]; !ok {
		return fmt.Errorf("Missing \"password\" in secret")
	}

	manager := &quobyteVolumeManager{
		config: &quobyteAPIConfig{
			quobyteUser:      quobyteUser,
			quobytePassword:  quobytePassword,
			quobyteAPIServer: annotations[annotationQuobyteAPIServer],
		},
	}
	return manager.deleteVolume(deleter)
}
示例#3
0
func (provisioner *quobyteVolumeProvisioner) Provision() (*api.PersistentVolume, error) {
	if provisioner.options.Selector != nil {
		return nil, fmt.Errorf("claim Selector is not supported")
	}
	var apiServer, adminSecretName, quobyteUser, quobytePassword string
	adminSecretNamespace := "default"
	provisioner.config = "BASE"
	provisioner.tenant = "DEFAULT"

	for k, v := range provisioner.options.Parameters {
		switch goStrings.ToLower(k) {
		case "registry":
			provisioner.registry = v
		case "adminsecretname":
			adminSecretName = v
		case "adminsecretnamespace":
			adminSecretNamespace = v
		case "quobyteapiserver":
			apiServer = v
		case "user":
			provisioner.user = v
		case "group":
			provisioner.group = v
		case "quobytetenant":
			provisioner.tenant = v
		case "quobyteconfig":
			provisioner.config = v
		default:
			return nil, fmt.Errorf("invalid option %q for volume plugin %s", k, provisioner.plugin.GetPluginName())
		}
	}

	secretMap, err := util.GetSecret(adminSecretNamespace, adminSecretName, provisioner.plugin.host.GetKubeClient())
	if err != nil {
		return nil, err
	}

	var ok bool
	if quobyteUser, ok = secretMap["user"]; !ok {
		return nil, fmt.Errorf("Missing \"user\" in secret")
	}

	if quobytePassword, ok = secretMap["password"]; !ok {
		return nil, fmt.Errorf("Missing \"password\" in secret")
	}

	if !validateRegistry(provisioner.registry) {
		return nil, fmt.Errorf("Quoybte registry missing or malformed: must be a host:port pair or multiple pairs separated by commas")
	}

	if len(apiServer) == 0 {
		return nil, fmt.Errorf("Quoybte API server missing or malformed: must be a http(s)://host:port pair or multiple pairs separated by commas")
	}

	// create random image name
	provisioner.volume = fmt.Sprintf("kubernetes-dynamic-pvc-%s", uuid.NewUUID())

	cfg := &quobyteAPIConfig{
		quobyteAPIServer: apiServer,
		quobyteUser:      quobyteUser,
		quobytePassword:  quobytePassword,
	}
	manager := &quobyteVolumeManager{
		config: cfg,
	}

	vol, sizeGB, err := manager.createVolume(provisioner)
	if err != nil {
		return nil, err
	}
	pv := new(api.PersistentVolume)
	pv.Spec.PersistentVolumeSource.Quobyte = vol
	pv.Spec.PersistentVolumeReclaimPolicy = provisioner.options.PersistentVolumeReclaimPolicy
	pv.Spec.AccessModes = provisioner.options.AccessModes
	pv.Spec.Capacity = api.ResourceList{
		api.ResourceName(api.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
	}

	util.AddVolumeAnnotations(pv, map[string]string{
		annotationQuobyteAPIServer:          apiServer,
		annotationQuobyteAPISecret:          adminSecretName,
		annotationQuobyteAPISecretNamespace: adminSecretNamespace,
	})

	return pv, nil
}