/*
Package flavors provides information and interaction with the flavor API
in the OpenStack Compute service.

A flavor is an available hardware configuration for a server. Each flavor
has a unique combination of disk space, memory capacity and priority for CPU
time.

Example to List Flavors

	listOpts := flavors.ListOpts{
		AccessType: flavors.PublicAccess,
	}

	allPages, err := flavors.ListDetail(computeClient, listOpts).AllPages()
	if err != nil {
		panic(err)
	}

	allFlavors, err := flavors.ExtractFlavors(allPages)
	if err != nil {
		panic(err)
	}

	for _, flavor := range allFlavors {
		fmt.Printf("%+v\n", flavor)
	}

Example to Create a Flavor

	createOpts := flavors.CreateOpts{
		ID:         "1",
		Name:       "m1.tiny",
		Disk:       gophercloud.IntToPointer(1),
		RAM:        512,
		VCPUs:      1,
		RxTxFactor: 1.0,
	}

	flavor, err := flavors.Create(computeClient, createOpts).Extract()
	if err != nil {
		panic(err)
	}

Example to Update a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	updateOpts := flavors.UpdateOpts{
		Description: "This is a good description"
	}

	flavor, err := flavors.Update(computeClient, flavorID, updateOpts).Extract()
	if err != nil {
		panic(err)
	}

Example to List Flavor Access

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	allPages, err := flavors.ListAccesses(computeClient, flavorID).AllPages()
	if err != nil {
		panic(err)
	}

	allAccesses, err := flavors.ExtractAccesses(allPages)
	if err != nil {
		panic(err)
	}

	for _, access := range allAccesses {
		fmt.Printf("%+v", access)
	}

Example to Grant Access to a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	accessOpts := flavors.AddAccessOpts{
		Tenant: "15153a0979884b59b0592248ef947921",
	}

	accessList, err := flavors.AddAccess(computeClient, flavor.ID, accessOpts).Extract()
	if err != nil {
		panic(err)
	}

Example to Remove/Revoke Access to a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	accessOpts := flavors.RemoveAccessOpts{
		Tenant: "15153a0979884b59b0592248ef947921",
	}

	accessList, err := flavors.RemoveAccess(computeClient, flavor.ID, accessOpts).Extract()
	if err != nil {
		panic(err)
	}

Example to Create Extra Specs for a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	createOpts := flavors.ExtraSpecsOpts{
		"hw:cpu_policy":        "CPU-POLICY",
		"hw:cpu_thread_policy": "CPU-THREAD-POLICY",
	}
	createdExtraSpecs, err := flavors.CreateExtraSpecs(computeClient, flavorID, createOpts).Extract()
	if err != nil {
		panic(err)
	}

	fmt.Printf("%+v", createdExtraSpecs)

Example to Get Extra Specs for a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	extraSpecs, err := flavors.ListExtraSpecs(computeClient, flavorID).Extract()
	if err != nil {
		panic(err)
	}

	fmt.Printf("%+v", extraSpecs)

Example to Update Extra Specs for a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"

	updateOpts := flavors.ExtraSpecsOpts{
		"hw:cpu_thread_policy": "CPU-THREAD-POLICY-UPDATED",
	}
	updatedExtraSpec, err := flavors.UpdateExtraSpec(computeClient, flavorID, updateOpts).Extract()
	if err != nil {
		panic(err)
	}

	fmt.Printf("%+v", updatedExtraSpec)

Example to Delete an Extra Spec for a Flavor

	flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"
	err := flavors.DeleteExtraSpec(computeClient, flavorID, "hw:cpu_thread_policy").ExtractErr()
	if err != nil {
		panic(err)
	}
*/
package flavors
