| package openstack | 
 |  | 
 | import ( | 
 | 	"gerrit.mcp.mirantis.net/debian/gophercloud.git" | 
 | 	tokens2 "gerrit.mcp.mirantis.net/debian/gophercloud.git/openstack/identity/v2/tokens" | 
 | 	tokens3 "gerrit.mcp.mirantis.net/debian/gophercloud.git/openstack/identity/v3/tokens" | 
 | ) | 
 |  | 
 | // V2EndpointURL discovers the endpoint URL for a specific service from a ServiceCatalog acquired | 
 | // during the v2 identity service. The specified EndpointOpts are used to identify a unique, | 
 | // unambiguous endpoint to return. It's an error both when multiple endpoints match the provided | 
 | // criteria and when none do. The minimum that can be specified is a Type, but you will also often | 
 | // need to specify a Name and/or a Region depending on what's available on your OpenStack | 
 | // deployment. | 
 | func V2EndpointURL(catalog *tokens2.ServiceCatalog, opts gophercloud.EndpointOpts) (string, error) { | 
 | 	// Extract Endpoints from the catalog entries that match the requested Type, Name if provided, and Region if provided. | 
 | 	var endpoints = make([]tokens2.Endpoint, 0, 1) | 
 | 	for _, entry := range catalog.Entries { | 
 | 		if (entry.Type == opts.Type) && (opts.Name == "" || entry.Name == opts.Name) { | 
 | 			for _, endpoint := range entry.Endpoints { | 
 | 				if opts.Region == "" || endpoint.Region == opts.Region { | 
 | 					endpoints = append(endpoints, endpoint) | 
 | 				} | 
 | 			} | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Report an error if the options were ambiguous. | 
 | 	if len(endpoints) > 1 { | 
 | 		err := &ErrMultipleMatchingEndpointsV2{} | 
 | 		err.Endpoints = endpoints | 
 | 		return "", err | 
 | 	} | 
 |  | 
 | 	// Extract the appropriate URL from the matching Endpoint. | 
 | 	for _, endpoint := range endpoints { | 
 | 		switch opts.Availability { | 
 | 		case gophercloud.AvailabilityPublic: | 
 | 			return gophercloud.NormalizeURL(endpoint.PublicURL), nil | 
 | 		case gophercloud.AvailabilityInternal: | 
 | 			return gophercloud.NormalizeURL(endpoint.InternalURL), nil | 
 | 		case gophercloud.AvailabilityAdmin: | 
 | 			return gophercloud.NormalizeURL(endpoint.AdminURL), nil | 
 | 		default: | 
 | 			err := &ErrInvalidAvailabilityProvided{} | 
 | 			err.Argument = "Availability" | 
 | 			err.Value = opts.Availability | 
 | 			return "", err | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Report an error if there were no matching endpoints. | 
 | 	err := &gophercloud.ErrEndpointNotFound{} | 
 | 	return "", err | 
 | } | 
 |  | 
 | // V3EndpointURL discovers the endpoint URL for a specific service from a Catalog acquired | 
 | // during the v3 identity service. The specified EndpointOpts are used to identify a unique, | 
 | // unambiguous endpoint to return. It's an error both when multiple endpoints match the provided | 
 | // criteria and when none do. The minimum that can be specified is a Type, but you will also often | 
 | // need to specify a Name and/or a Region depending on what's available on your OpenStack | 
 | // deployment. | 
 | func V3EndpointURL(catalog *tokens3.ServiceCatalog, opts gophercloud.EndpointOpts) (string, error) { | 
 | 	// Extract Endpoints from the catalog entries that match the requested Type, Interface, | 
 | 	// Name if provided, and Region if provided. | 
 | 	var endpoints = make([]tokens3.Endpoint, 0, 1) | 
 | 	for _, entry := range catalog.Entries { | 
 | 		if (entry.Type == opts.Type) && (opts.Name == "" || entry.Name == opts.Name) { | 
 | 			for _, endpoint := range entry.Endpoints { | 
 | 				if opts.Availability != gophercloud.AvailabilityAdmin && | 
 | 					opts.Availability != gophercloud.AvailabilityPublic && | 
 | 					opts.Availability != gophercloud.AvailabilityInternal { | 
 | 					err := &ErrInvalidAvailabilityProvided{} | 
 | 					err.Argument = "Availability" | 
 | 					err.Value = opts.Availability | 
 | 					return "", err | 
 | 				} | 
 | 				if (opts.Availability == gophercloud.Availability(endpoint.Interface)) && | 
 | 					(opts.Region == "" || endpoint.Region == opts.Region) { | 
 | 					endpoints = append(endpoints, endpoint) | 
 | 				} | 
 | 			} | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Report an error if the options were ambiguous. | 
 | 	if len(endpoints) > 1 { | 
 | 		return "", ErrMultipleMatchingEndpointsV3{Endpoints: endpoints} | 
 | 	} | 
 |  | 
 | 	// Extract the URL from the matching Endpoint. | 
 | 	for _, endpoint := range endpoints { | 
 | 		return gophercloud.NormalizeURL(endpoint.URL), nil | 
 | 	} | 
 |  | 
 | 	// Report an error if there were no matching endpoints. | 
 | 	err := &gophercloud.ErrEndpointNotFound{} | 
 | 	return "", err | 
 | } |