alServerNetworkInterfaceFloatingIpsOptions *ListBareMetalServerNetworkInterfaceFloatingIpsOptions) (result *FloatingIPUnpaginatedCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListBareMetalServerNetworkInterfaceFloatingIpsWithContext(context.Background(), listBareMetalServerNetworkInterfaceFloatingIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListBareMetalServerNetworkInterfaceFloatingIpsWithContext is an alternate form of the ListBareMetalServerNetworkInterfaceFloatingIps method which supports a Context parameter
func (vpc *VpcV1) ListBareMetalServerNetworkInterfaceFloatingIpsWithContext(ctx context.Context, listBareMetalServerNetworkInterfaceFloatingIpsOptions *ListBareMetalServerNetworkInterfaceFloatingIpsOptions) (result *FloatingIPUnpaginatedCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listBareMetalServerNetworkInterfaceFloatingIpsOptions, "listBareMetalServerNetworkInterfaceFloatingIpsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listBareMetalServerNetworkInterfaceFloatingIpsOptions, "listBareMetalServerNetworkInterfaceFloatingIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"bare_metal_server_id": *listBareMetalServerNetworkInterfaceFloatingIpsOptions.BareMetalServerID,
		"network_interface_id": *listBareMetalServerNetworkInterfaceFloatingIpsOptions.NetworkInterfaceID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{bare_metal_server_id}/network_interfaces/{network_interface_id}/floating_ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListBareMetalServerNetworkInterfaceFloatingIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listBareMetalServerNetworkInterfaceFloatingIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_bare_metal_server_network_interface_floating_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIPUnpaginatedCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RemoveBareMetalServerNetworkInterfaceFloatingIP : Disassociate a floating IP from a bare metal server network interface
// This request disassociates the specified floating IP from the specified bare metal server network interface.
func (vpc *VpcV1) RemoveBareMetalServerNetworkInterfaceFloatingIP(removeBareMetalServerNetworkInterfaceFloatingIPOptions *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RemoveBareMetalServerNetworkInterfaceFloatingIPWithContext(context.Background(), removeBareMetalServerNetworkInterfaceFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RemoveBareMetalServerNetworkInterfaceFloatingIPWithContext is an alternate form of the RemoveBareMetalServerNetworkInterfaceFloatingIP method which supports a Context parameter
func (vpc *VpcV1) RemoveBareMetalServerNetworkInterfaceFloatingIPWithContext(ctx context.Context, removeBareMetalServerNetworkInterfaceFloatingIPOptions *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(removeBareMetalServerNetworkInterfaceFloatingIPOptions, "removeBareMetalServerNetworkInterfaceFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(removeBareMetalServerNetworkInterfaceFloatingIPOptions, "removeBareMetalServerNetworkInterfaceFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"bare_metal_server_id": *removeBareMetalServerNetworkInterfaceFloatingIPOptions.BareMetalServerID,
		"network_interface_id": *removeBareMetalServerNetworkInterfaceFloatingIPOptions.NetworkInterfaceID,
		"id":                   *removeBareMetalServerNetworkInterfaceFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{bare_metal_server_id}/network_interfaces/{network_interface_id}/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RemoveBareMetalServerNetworkInterfaceFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range removeBareMetalServerNetworkInterfaceFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "remove_bare_metal_server_network_interface_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetBareMetalServerNetworkInterfaceFloatingIP : Retrieve associated floating IP
// This request retrieves a specified floating IP if it is associated with the bare metal server network interface
// specified in the URL.
func (vpc *VpcV1) GetBareMetalServerNetworkInterfaceFloatingIP(getBareMetalServerNetworkInterfaceFloatingIPOptions *GetBareMetalServerNetworkInterfaceFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBareMetalServerNetworkInterfaceFloatingIPWithContext(context.Background(), getBareMetalServerNetworkInterfaceFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBareMetalServerNetworkInterfaceFloatingIPWithContext is an alternate form of the GetBareMetalServerNetworkInterfaceFloatingIP method which supports a Context parameter
func (vpc *VpcV1) GetBareMetalServerNetworkInterfaceFloatingIPWithContext(ctx context.Context, getBareMetalServerNetworkInterfaceFloatingIPOptions *GetBareMetalServerNetworkInterfaceFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getBareMetalServerNetworkInterfaceFloatingIPOptions, "getBareMetalServerNetworkInterfaceFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBareMetalServerNetworkInterfaceFloatingIPOptions, "getBareMetalServerNetworkInterfaceFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"bare_metal_server_id": *getBareMetalServerNetworkInterfaceFloatingIPOptions.BareMetalServerID,
		"network_interface_id": *getBareMetalServerNetworkInterfaceFloatingIPOptions.NetworkInterfaceID,
		"id":                   *getBareMetalServerNetworkInterfaceFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{bare_metal_server_id}/network_interfaces/{network_interface_id}/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBareMetalServerNetworkInterfaceFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBareMetalServerNetworkInterfaceFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_bare_metal_server_network_interface_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// AddBareMetalServerNetworkInterfaceFloatingIP : Associate a floating IP with a bare metal server network interface
// This request associates the specified floating IP with the specified bare metal server network interface. If
// `enable_infrastructure_nat` is `false`, this adds the IP to any existing associations. If `enable_infrastructure_nat`
// is `true`, this replaces any existing association.
//
// The existing floating IP must:
// - not be required by another resource, such as a public gateway
// - be in the same `zone` as the bare metal server
//
// A request body is not required, and if provided, is ignored.
func (vpc *VpcV1) AddBareMetalServerNetworkInterfaceFloatingIP(addBareMetalServerNetworkInterfaceFloatingIPOptions *AddBareMetalServerNetworkInterfaceFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.AddBareMetalServerNetworkInterfaceFloatingIPWithContext(context.Background(), addBareMetalServerNetworkInterfaceFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// AddBareMetalServerNetworkInterfaceFloatingIPWithContext is an alternate form of the AddBareMetalServerNetworkInterfaceFloatingIP method which supports a Context parameter
func (vpc *VpcV1) AddBareMetalServerNetworkInterfaceFloatingIPWithContext(ctx context.Context, addBareMetalServerNetworkInterfaceFloatingIPOptions *AddBareMetalServerNetworkInterfaceFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(addBareMetalServerNetworkInterfaceFloatingIPOptions, "addBareMetalServerNetworkInterfaceFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(addBareMetalServerNetworkInterfaceFloatingIPOptions, "addBareMetalServerNetworkInterfaceFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"bare_metal_server_id": *addBareMetalServerNetworkInterfaceFloatingIPOptions.BareMetalServerID,
		"network_interface_id": *addBareMetalServerNetworkInterfaceFloatingIPOptions.NetworkInterfaceID,
		"id":                   *addBareMetalServerNetworkInterfaceFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{bare_metal_server_id}/network_interfaces/{network_interface_id}/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "AddBareMetalServerNetworkInterfaceFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range addBareMetalServerNetworkInterfaceFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "add_bare_metal_server_network_interface_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListBareMetalServerNetworkInterfaceIps : List the primary reserved IP for a bare metal server network interface
// This request lists the primary reserved IP for a bare metal server network interface.
// Deprecated: this method is deprecated and may be removed in a future release.
func (vpc *VpcV1) ListBareMetalServerNetworkInterfaceIps(listBareMetalServerNetworkInterfaceIpsOptions *ListBareMetalServerNetworkInterfaceIpsOptions) (result *ReservedIPCollectionBareMetalServerNetworkInterfaceContext, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListBareMetalServerNetworkInterfaceIpsWithContext(context.Background(), listBareMetalServerNetworkInterfaceIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListBareMetalServerNetworkInterfaceIpsWithContext is an alternate form of the ListBareMetalServerNetworkInterfaceIps method which supports a Context parameter
// Deprecated: this method is deprecated and may be removed in a future release.
func (vpc *VpcV1) ListBareMetalServerNetworkInterfaceIpsWithContext(ctx context.Context, listBareMetalServerNetworkInterfaceIpsOptions *ListBareMetalServerNetworkInterfaceIpsOptions) (result *ReservedIPCollectionBareMetalServerNetworkInterfaceContext, response *core.DetailedResponse, err error) {
	core.GetLogger().Warn("A deprecated operation has been invoked: ListBareMetalServerNetworkInterfaceIps")
	err = core.ValidateNotNil(listBareMetalServerNetworkInterfaceIpsOptions, "listBareMetalServerNetworkInterfaceIpsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listBareMetalServerNetworkInterfaceIpsOptions, "listBareMetalServerNetworkInterfaceIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"bare_metal_server_id": *listBareMetalServerNetworkInterfaceIpsOptions.BareMetalServerID,
		"network_interface_id": *listBareMetalServerNetworkInterfaceIpsOptions.NetworkInterfaceID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{bare_metal_server_id}/network_interfaces/{network_interface_id}/ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListBareMetalServerNetworkInterfaceIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listBareMetalServerNetworkInterfaceIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_bare_metal_server_network_interface_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIPCollectionBareMetalServerNetworkInterfaceContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetBareMetalServerNetworkInterfaceIP : Retrieve the primary reserved IP
// This request retrieves the primary reserved IP for a bare metal server network interface.
// Deprecated: this method is deprecated and may be removed in a future release.
func (vpc *VpcV1) GetBareMetalServerNetworkInterfaceIP(getBareMetalServerNetworkInterfaceIPOptions *GetBareMetalServerNetworkInterfaceIPOptions) (result *ReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBareMetalServerNetworkInterfaceIPWithContext(context.Background(), getBareMetalServerNetworkInterfaceIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBareMetalServerNetworkInterfaceIPWithContext is an alternate form of the GetBareMetalServerNetworkInterfaceIP method which supports a Context parameter
// Deprecated: this method is deprecated and may be removed in a future release.
func (vpc *VpcV1) GetBareMetalServerNetworkInterfaceIPWithContext(ctx context.Context, getBareMetalServerNetworkInterfaceIPOptions *GetBareMetalServerNetworkInterfaceIPOptions) (result *ReservedIP, response *core.DetailedResponse, err error) {
	core.GetLogger().Warn("A deprecated operation has been invoked: GetBareMetalServerNetworkInterfaceIP")
	err = core.ValidateNotNil(getBareMetalServerNetworkInterfaceIPOptions, "getBareMetalServerNetworkInterfaceIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBareMetalServerNetworkInterfaceIPOptions, "getBareMetalServerNetworkInterfaceIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"bare_metal_server_id": *getBareMetalServerNetworkInterfaceIPOptions.BareMetalServerID,
		"network_interface_id": *getBareMetalServerNetworkInterfaceIPOptions.NetworkInterfaceID,
		"id":                   *getBareMetalServerNetworkInterfaceIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{bare_metal_server_id}/network_interfaces/{network_interface_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBareMetalServerNetworkInterfaceIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBareMetalServerNetworkInterfaceIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_bare_metal_server_network_interface_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteBareMetalServer : Delete a bare metal server
// This request deletes a bare metal server. This operation cannot be reversed. Any floating IPs associated with the
// bare metal server network interfaces are implicitly disassociated.
func (vpc *VpcV1) DeleteBareMetalServer(deleteBareMetalServerOptions *DeleteBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteBareMetalServerWithContext(context.Background(), deleteBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteBareMetalServerWithContext is an alternate form of the DeleteBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) DeleteBareMetalServerWithContext(ctx context.Context, deleteBareMetalServerOptions *DeleteBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteBareMetalServerOptions, "deleteBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteBareMetalServerOptions, "deleteBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetBareMetalServer : Retrieve a bare metal server
// This request retrieves a single bare metal server specified by the identifier in the URL.
func (vpc *VpcV1) GetBareMetalServer(getBareMetalServerOptions *GetBareMetalServerOptions) (result *BareMetalServer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBareMetalServerWithContext(context.Background(), getBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBareMetalServerWithContext is an alternate form of the GetBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) GetBareMetalServerWithContext(ctx context.Context, getBareMetalServerOptions *GetBareMetalServerOptions) (result *BareMetalServer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getBareMetalServerOptions, "getBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBareMetalServerOptions, "getBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBareMetalServer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateBareMetalServer : Update a bare metal server
// This request updates a bare metal server with the information in a provided patch. The bare metal server patch object
// is structured in the same way as a retrieved bare metal server and contains only the information to be updated.
//
// For this request to succeed, the properties in the request must adhere to the `allowed_use` property of the disk
// referenced in the server's `boot_target`.
func (vpc *VpcV1) UpdateBareMetalServer(updateBareMetalServerOptions *UpdateBareMetalServerOptions) (result *BareMetalServer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateBareMetalServerWithContext(context.Background(), updateBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateBareMetalServerWithContext is an alternate form of the UpdateBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) UpdateBareMetalServerWithContext(ctx context.Context, updateBareMetalServerOptions *UpdateBareMetalServerOptions) (result *BareMetalServer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateBareMetalServerOptions, "updateBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateBareMetalServerOptions, "updateBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateBareMetalServerOptions.BareMetalServerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBareMetalServer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateFirmwareForBareMetalServer : Update firmware for a bare metal server
// This request updates a bare metal server to the latest available firmware. The server must be stopped.
func (vpc *VpcV1) UpdateFirmwareForBareMetalServer(updateFirmwareForBareMetalServerOptions *UpdateFirmwareForBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.UpdateFirmwareForBareMetalServerWithContext(context.Background(), updateFirmwareForBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateFirmwareForBareMetalServerWithContext is an alternate form of the UpdateFirmwareForBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) UpdateFirmwareForBareMetalServerWithContext(ctx context.Context, updateFirmwareForBareMetalServerOptions *UpdateFirmwareForBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateFirmwareForBareMetalServerOptions, "updateFirmwareForBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateFirmwareForBareMetalServerOptions, "updateFirmwareForBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateFirmwareForBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}/firmware/update`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateFirmwareForBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateFirmwareForBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if updateFirmwareForBareMetalServerOptions.AutoStart != nil {
		body["auto_start"] = updateFirmwareForBareMetalServerOptions.AutoStart
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_firmware_for_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetBareMetalServerInitialization : Retrieve initialization configuration for a bare metal server
// This request retrieves configuration used to initialize the bare metal server, such as the image used, SSH keys, and
// any configured usernames and passwords. These can subsequently be changed on the server and therefore may not be
// current.
func (vpc *VpcV1) GetBareMetalServerInitialization(getBareMetalServerInitializationOptions *GetBareMetalServerInitializationOptions) (result *BareMetalServerInitialization, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBareMetalServerInitializationWithContext(context.Background(), getBareMetalServerInitializationOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBareMetalServerInitializationWithContext is an alternate form of the GetBareMetalServerInitialization method which supports a Context parameter
func (vpc *VpcV1) GetBareMetalServerInitializationWithContext(ctx context.Context, getBareMetalServerInitializationOptions *GetBareMetalServerInitializationOptions) (result *BareMetalServerInitialization, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getBareMetalServerInitializationOptions, "getBareMetalServerInitializationOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBareMetalServerInitializationOptions, "getBareMetalServerInitializationOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getBareMetalServerInitializationOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}/initialization`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBareMetalServerInitialization")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBareMetalServerInitializationOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_bare_metal_server_initialization", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBareMetalServerInitialization)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ReplaceBareMetalServerInitialization : Reinitialize a bare metal server
// This request reinitializes a bare metal server with the specified image and SSH keys. The server must be stopped.
// Upon successful reinitiatilization, the bare metal server will be started automatically.
//
// For this request to succeed, the properties of the server which would result from the reinitialization must adhere to
// the specified image's `allowed_use` property.
func (vpc *VpcV1) ReplaceBareMetalServerInitialization(replaceBareMetalServerInitializationOptions *ReplaceBareMetalServerInitializationOptions) (result *BareMetalServerInitialization, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ReplaceBareMetalServerInitializationWithContext(context.Background(), replaceBareMetalServerInitializationOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ReplaceBareMetalServerInitializationWithContext is an alternate form of the ReplaceBareMetalServerInitialization method which supports a Context parameter
func (vpc *VpcV1) ReplaceBareMetalServerInitializationWithContext(ctx context.Context, replaceBareMetalServerInitializationOptions *ReplaceBareMetalServerInitializationOptions) (result *BareMetalServerInitialization, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(replaceBareMetalServerInitializationOptions, "replaceBareMetalServerInitializationOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(replaceBareMetalServerInitializationOptions, "replaceBareMetalServerInitializationOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *replaceBareMetalServerInitializationOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}/initialization`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ReplaceBareMetalServerInitialization")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range replaceBareMetalServerInitializationOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if replaceBareMetalServerInitializationOptions.Image != nil {
		body["image"] = replaceBareMetalServerInitializationOptions.Image
	}
	if replaceBareMetalServerInitializationOptions.Keys != nil {
		body["keys"] = replaceBareMetalServerInitializationOptions.Keys
	}
	if replaceBareMetalServerInitializationOptions.UserData != nil {
		body["user_data"] = replaceBareMetalServerInitializationOptions.UserData
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "replace_bare_metal_server_initialization", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBareMetalServerInitialization)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RestartBareMetalServer : Restart a bare metal server
// This request immediately restarts a bare metal server.  For this request to succeed, the server must have a `status`
// of `running`.
func (vpc *VpcV1) RestartBareMetalServer(restartBareMetalServerOptions *RestartBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RestartBareMetalServerWithContext(context.Background(), restartBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RestartBareMetalServerWithContext is an alternate form of the RestartBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) RestartBareMetalServerWithContext(ctx context.Context, restartBareMetalServerOptions *RestartBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(restartBareMetalServerOptions, "restartBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(restartBareMetalServerOptions, "restartBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *restartBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}/restart`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RestartBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range restartBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "restart_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// StartBareMetalServer : Start a bare metal server
// This request starts a bare metal server.  It will run immediately provided the server is stopped.
func (vpc *VpcV1) StartBareMetalServer(startBareMetalServerOptions *StartBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.StartBareMetalServerWithContext(context.Background(), startBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// StartBareMetalServerWithContext is an alternate form of the StartBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) StartBareMetalServerWithContext(ctx context.Context, startBareMetalServerOptions *StartBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(startBareMetalServerOptions, "startBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(startBareMetalServerOptions, "startBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *startBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}/start`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "StartBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range startBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "start_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// StopBareMetalServer : Stop a bare metal server
// This request stops a bare metal server. It will run immediately provided the server is running. Note: A soft stop may
// not complete as it relies on the operating system to perform the operation.
func (vpc *VpcV1) StopBareMetalServer(stopBareMetalServerOptions *StopBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.StopBareMetalServerWithContext(context.Background(), stopBareMetalServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// StopBareMetalServerWithContext is an alternate form of the StopBareMetalServer method which supports a Context parameter
func (vpc *VpcV1) StopBareMetalServerWithContext(ctx context.Context, stopBareMetalServerOptions *StopBareMetalServerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(stopBareMetalServerOptions, "stopBareMetalServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(stopBareMetalServerOptions, "stopBareMetalServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *stopBareMetalServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/bare_metal_servers/{id}/stop`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "StopBareMetalServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range stopBareMetalServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if stopBareMetalServerOptions.Type != nil {
		body["type"] = stopBareMetalServerOptions.Type
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "stop_bare_metal_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListVolumeProfiles : List volume profiles
// This request lists [volume profiles](https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles) available in
// the region. A volume profile specifies the performance characteristics and pricing model for a volume.
func (vpc *VpcV1) ListVolumeProfiles(listVolumeProfilesOptions *ListVolumeProfilesOptions) (result *VolumeProfileCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVolumeProfilesWithContext(context.Background(), listVolumeProfilesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVolumeProfilesWithContext is an alternate form of the ListVolumeProfiles method which supports a Context parameter
func (vpc *VpcV1) ListVolumeProfilesWithContext(ctx context.Context, listVolumeProfilesOptions *ListVolumeProfilesOptions) (result *VolumeProfileCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listVolumeProfilesOptions, "listVolumeProfilesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volume/profiles`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVolumeProfiles")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVolumeProfilesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVolumeProfilesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVolumeProfilesOptions.Start))
	}
	if listVolumeProfilesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVolumeProfilesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_volume_profiles", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolumeProfileCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetVolumeProfile : Retrieve a volume profile
// This request retrieves a single volume profile specified by the name in the URL.
func (vpc *VpcV1) GetVolumeProfile(getVolumeProfileOptions *GetVolumeProfileOptions) (result *VolumeProfile, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVolumeProfileWithContext(context.Background(), getVolumeProfileOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVolumeProfileWithContext is an alternate form of the GetVolumeProfile method which supports a Context parameter
func (vpc *VpcV1) GetVolumeProfileWithContext(ctx context.Context, getVolumeProfileOptions *GetVolumeProfileOptions) (result *VolumeProfile, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVolumeProfileOptions, "getVolumeProfileOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVolumeProfileOptions, "getVolumeProfileOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"name": *getVolumeProfileOptions.Name,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volume/profiles/{name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVolumeProfile")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVolumeProfileOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_volume_profile", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolumeProfile)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVolumes : List volumes
// This request lists volumes in the region. Volumes are network-connected block storage devices that may be attached to
// one or more instances in the same region.
func (vpc *VpcV1) ListVolumes(listVolumesOptions *ListVolumesOptions) (result *VolumeCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVolumesWithContext(context.Background(), listVolumesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVolumesWithContext is an alternate form of the ListVolumes method which supports a Context parameter
func (vpc *VpcV1) ListVolumesWithContext(ctx context.Context, listVolumesOptions *ListVolumesOptions) (result *VolumeCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listVolumesOptions, "listVolumesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volumes`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVolumes")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVolumesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVolumesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVolumesOptions.Start))
	}
	if listVolumesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVolumesOptions.Limit))
	}
	if listVolumesOptions.AttachmentState != nil {
		builder.AddQuery("attachment_state", fmt.Sprint(*listVolumesOptions.AttachmentState))
	}
	if listVolumesOptions.Encryption != nil {
		builder.AddQuery("encryption", fmt.Sprint(*listVolumesOptions.Encryption))
	}
	if listVolumesOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listVolumesOptions.Name))
	}
	if listVolumesOptions.OperatingSystemFamily != nil {
		builder.AddQuery("operating_system.family", fmt.Sprint(*listVolumesOptions.OperatingSystemFamily))
	}
	if listVolumesOptions.OperatingSystemArchitecture != nil {
		builder.AddQuery("operating_system.architecture", fmt.Sprint(*listVolumesOptions.OperatingSystemArchitecture))
	}
	if listVolumesOptions.Tag != nil {
		builder.AddQuery("tag", fmt.Sprint(*listVolumesOptions.Tag))
	}
	if listVolumesOptions.ZoneName != nil {
		builder.AddQuery("zone.name", fmt.Sprint(*listVolumesOptions.ZoneName))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_volumes", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolumeCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateVolume : Create a volume
// This request creates a new volume from a volume prototype object. The prototype object is structured in the same way
// as a retrieved volume, and contains the information necessary to create the new volume.
func (vpc *VpcV1) CreateVolume(createVolumeOptions *CreateVolumeOptions) (result *Volume, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateVolumeWithContext(context.Background(), createVolumeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateVolumeWithContext is an alternate form of the CreateVolume method which supports a Context parameter
func (vpc *VpcV1) CreateVolumeWithContext(ctx context.Context, createVolumeOptions *CreateVolumeOptions) (result *Volume, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createVolumeOptions, "createVolumeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createVolumeOptions, "createVolumeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volumes`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateVolume")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createVolumeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createVolumeOptions.VolumePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_volume", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolume)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVolume : Delete a volume
// This request deletes a volume. This operation cannot be reversed. For this request to succeed, the volume must not be
// attached to any instances.
func (vpc *VpcV1) DeleteVolume(deleteVolumeOptions *DeleteVolumeOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteVolumeWithContext(context.Background(), deleteVolumeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVolumeWithContext is an alternate form of the DeleteVolume method which supports a Context parameter
func (vpc *VpcV1) DeleteVolumeWithContext(ctx context.Context, deleteVolumeOptions *DeleteVolumeOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVolumeOptions, "deleteVolumeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVolumeOptions, "deleteVolumeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteVolumeOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volumes/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVolume")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVolumeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	if deleteVolumeOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteVolumeOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_volume", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVolume : Retrieve a volume
// This request retrieves a single volume specified by the identifier in the URL.
func (vpc *VpcV1) GetVolume(getVolumeOptions *GetVolumeOptions) (result *Volume, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVolumeWithContext(context.Background(), getVolumeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVolumeWithContext is an alternate form of the GetVolume method which supports a Context parameter
func (vpc *VpcV1) GetVolumeWithContext(ctx context.Context, getVolumeOptions *GetVolumeOptions) (result *Volume, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVolumeOptions, "getVolumeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVolumeOptions, "getVolumeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getVolumeOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volumes/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVolume")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVolumeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_volume", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolume)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateVolume : Update a volume
// This request updates a volume with the information in a provided volume patch. The volume patch object is structured
// in the same way as a retrieved volume and contains only the information to be updated.
func (vpc *VpcV1) UpdateVolume(updateVolumeOptions *UpdateVolumeOptions) (result *Volume, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateVolumeWithContext(context.Background(), updateVolumeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateVolumeWithContext is an alternate form of the UpdateVolume method which supports a Context parameter
func (vpc *VpcV1) UpdateVolumeWithContext(ctx context.Context, updateVolumeOptions *UpdateVolumeOptions) (result *Volume, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateVolumeOptions, "updateVolumeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateVolumeOptions, "updateVolumeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateVolumeOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volumes/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateVolume")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateVolumeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateVolumeOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateVolumeOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateVolumeOptions.VolumePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_volume", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolume)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVolumeInstanceProfiles : List instance profiles compatible with a volume
// This request lists instance profiles compatible with a volume's
// `allowed_use.instance`, `operating_system.architecture` and
// `operating_system.user_data_format` properties, sorted by ascending `name` property values. The specified volume must
// be bootable (have an `operating_system` property).
func (vpc *VpcV1) ListVolumeInstanceProfiles(listVolumeInstanceProfilesOptions *ListVolumeInstanceProfilesOptions) (result *VolumeInstanceProfileCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVolumeInstanceProfilesWithContext(context.Background(), listVolumeInstanceProfilesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVolumeInstanceProfilesWithContext is an alternate form of the ListVolumeInstanceProfiles method which supports a Context parameter
func (vpc *VpcV1) ListVolumeInstanceProfilesWithContext(ctx context.Context, listVolumeInstanceProfilesOptions *ListVolumeInstanceProfilesOptions) (result *VolumeInstanceProfileCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVolumeInstanceProfilesOptions, "listVolumeInstanceProfilesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVolumeInstanceProfilesOptions, "listVolumeInstanceProfilesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *listVolumeInstanceProfilesOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/volumes/{id}/instance_profiles`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVolumeInstanceProfiles")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVolumeInstanceProfilesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVolumeInstanceProfilesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVolumeInstanceProfilesOptions.Start))
	}
	if listVolumeInstanceProfilesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVolumeInstanceProfilesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_volume_instance_profiles", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVolumeInstanceProfileCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListSnapshotConsistencyGroups : List snapshot consistency groups
// This request lists snapshot consistency groups in the region. A snapshot consistency group is a collection of
// individual snapshots taken at the same time.
func (vpc *VpcV1) ListSnapshotConsistencyGroups(listSnapshotConsistencyGroupsOptions *ListSnapshotConsistencyGroupsOptions) (result *SnapshotConsistencyGroupCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSnapshotConsistencyGroupsWithContext(context.Background(), listSnapshotConsistencyGroupsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSnapshotConsistencyGroupsWithContext is an alternate form of the ListSnapshotConsistencyGroups method which supports a Context parameter
func (vpc *VpcV1) ListSnapshotConsistencyGroupsWithContext(ctx context.Context, listSnapshotConsistencyGroupsOptions *ListSnapshotConsistencyGroupsOptions) (result *SnapshotConsistencyGroupCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listSnapshotConsistencyGroupsOptions, "listSnapshotConsistencyGroupsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshot_consistency_groups`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSnapshotConsistencyGroups")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSnapshotConsistencyGroupsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listSnapshotConsistencyGroupsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listSnapshotConsistencyGroupsOptions.Start))
	}
	if listSnapshotConsistencyGroupsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listSnapshotConsistencyGroupsOptions.Limit))
	}
	if listSnapshotConsistencyGroupsOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listSnapshotConsistencyGroupsOptions.ResourceGroupID))
	}
	if listSnapshotConsistencyGroupsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listSnapshotConsistencyGroupsOptions.Name))
	}
	if listSnapshotConsistencyGroupsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listSnapshotConsistencyGroupsOptions.Sort))
	}
	if listSnapshotConsistencyGroupsOptions.BackupPolicyPlanID != nil {
		builder.AddQuery("backup_policy_plan.id", fmt.Sprint(*listSnapshotConsistencyGroupsOptions.BackupPolicyPlanID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_snapshot_consistency_groups", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotConsistencyGroupCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateSnapshotConsistencyGroup : Create a snapshot consistency group
// This request creates a new snapshot consistency group from a snapshot consistency group object.  The prototype object
// is structured in the same way as a retrieved consistency group, and contains the information necessary to provision
// the new snapshot consistency group.
func (vpc *VpcV1) CreateSnapshotConsistencyGroup(createSnapshotConsistencyGroupOptions *CreateSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateSnapshotConsistencyGroupWithContext(context.Background(), createSnapshotConsistencyGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateSnapshotConsistencyGroupWithContext is an alternate form of the CreateSnapshotConsistencyGroup method which supports a Context parameter
func (vpc *VpcV1) CreateSnapshotConsistencyGroupWithContext(ctx context.Context, createSnapshotConsistencyGroupOptions *CreateSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createSnapshotConsistencyGroupOptions, "createSnapshotConsistencyGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createSnapshotConsistencyGroupOptions, "createSnapshotConsistencyGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshot_consistency_groups`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateSnapshotConsistencyGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createSnapshotConsistencyGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createSnapshotConsistencyGroupOptions.SnapshotConsistencyGroupPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_snapshot_consistency_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotConsistencyGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSnapshotConsistencyGroup : Delete a snapshot consistency group
// This request deletes snapshot consistency group. This operation cannot be reversed. If the
// `delete_snapshots_on_delete` property is `true`, all snapshots in the consistency group will also be deleted.
func (vpc *VpcV1) DeleteSnapshotConsistencyGroup(deleteSnapshotConsistencyGroupOptions *DeleteSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteSnapshotConsistencyGroupWithContext(context.Background(), deleteSnapshotConsistencyGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSnapshotConsistencyGroupWithContext is an alternate form of the DeleteSnapshotConsistencyGroup method which supports a Context parameter
func (vpc *VpcV1) DeleteSnapshotConsistencyGroupWithContext(ctx context.Context, deleteSnapshotConsistencyGroupOptions *DeleteSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSnapshotConsistencyGroupOptions, "deleteSnapshotConsistencyGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSnapshotConsistencyGroupOptions, "deleteSnapshotConsistencyGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteSnapshotConsistencyGroupOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshot_consistency_groups/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSnapshotConsistencyGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSnapshotConsistencyGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_snapshot_consistency_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotConsistencyGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetSnapshotConsistencyGroup : Retrieve a snapshot consistency group
// This request retrieves a single snapshot consistency group specified by the identifier in the URL.
func (vpc *VpcV1) GetSnapshotConsistencyGroup(getSnapshotConsistencyGroupOptions *GetSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetSnapshotConsistencyGroupWithContext(context.Background(), getSnapshotConsistencyGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetSnapshotConsistencyGroupWithContext is an alternate form of the GetSnapshotConsistencyGroup method which supports a Context parameter
func (vpc *VpcV1) GetSnapshotConsistencyGroupWithContext(ctx context.Context, getSnapshotConsistencyGroupOptions *GetSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getSnapshotConsistencyGroupOptions, "getSnapshotConsistencyGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getSnapshotConsistencyGroupOptions, "getSnapshotConsistencyGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getSnapshotConsistencyGroupOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshot_consistency_groups/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetSnapshotConsistencyGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getSnapshotConsistencyGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_snapshot_consistency_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotConsistencyGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateSnapshotConsistencyGroup : Update a snapshot consistency group
// This request updates a snapshot consistency group with the information in a provided snapshot consistency group
// patch. The snapshot consistency group patch object is structured in the same way as a retrieved snapshot consistency
// group and contains only the information to be updated.
func (vpc *VpcV1) UpdateSnapshotConsistencyGroup(updateSnapshotConsistencyGroupOptions *UpdateSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateSnapshotConsistencyGroupWithContext(context.Background(), updateSnapshotConsistencyGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateSnapshotConsistencyGroupWithContext is an alternate form of the UpdateSnapshotConsistencyGroup method which supports a Context parameter
func (vpc *VpcV1) UpdateSnapshotConsistencyGroupWithContext(ctx context.Context, updateSnapshotConsistencyGroupOptions *UpdateSnapshotConsistencyGroupOptions) (result *SnapshotConsistencyGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateSnapshotConsistencyGroupOptions, "updateSnapshotConsistencyGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateSnapshotConsistencyGroupOptions, "updateSnapshotConsistencyGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateSnapshotConsistencyGroupOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshot_consistency_groups/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateSnapshotConsistencyGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateSnapshotConsistencyGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateSnapshotConsistencyGroupOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateSnapshotConsistencyGroupOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateSnapshotConsistencyGroupOptions.SnapshotConsistencyGroupPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_snapshot_consistency_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotConsistencyGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSnapshots : Delete a filtered collection of snapshots
// This request deletes snapshots that match the specified filter. This operation cannot be reversed.
func (vpc *VpcV1) DeleteSnapshots(deleteSnapshotsOptions *DeleteSnapshotsOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteSnapshotsWithContext(context.Background(), deleteSnapshotsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSnapshotsWithContext is an alternate form of the DeleteSnapshots method which supports a Context parameter
func (vpc *VpcV1) DeleteSnapshotsWithContext(ctx context.Context, deleteSnapshotsOptions *DeleteSnapshotsOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSnapshotsOptions, "deleteSnapshotsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSnapshotsOptions, "deleteSnapshotsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSnapshots")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSnapshotsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	builder.AddQuery("source_volume.id", fmt.Sprint(*deleteSnapshotsOptions.SourceVolumeID))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_snapshots", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListSnapshots : List snapshots
// This request lists snapshots in the region. A snapshot preserves the data of a volume at the time the snapshot is
// created.
func (vpc *VpcV1) ListSnapshots(listSnapshotsOptions *ListSnapshotsOptions) (result *SnapshotCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSnapshotsWithContext(context.Background(), listSnapshotsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSnapshotsWithContext is an alternate form of the ListSnapshots method which supports a Context parameter
func (vpc *VpcV1) ListSnapshotsWithContext(ctx context.Context, listSnapshotsOptions *ListSnapshotsOptions) (result *SnapshotCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listSnapshotsOptions, "listSnapshotsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSnapshots")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSnapshotsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listSnapshotsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listSnapshotsOptions.Start))
	}
	if listSnapshotsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listSnapshotsOptions.Limit))
	}
	if listSnapshotsOptions.Tag != nil {
		builder.AddQuery("tag", fmt.Sprint(*listSnapshotsOptions.Tag))
	}
	if listSnapshotsOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listSnapshotsOptions.ResourceGroupID))
	}
	if listSnapshotsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listSnapshotsOptions.Name))
	}
	if listSnapshotsOptions.SourceVolumeID != nil {
		builder.AddQuery("source_volume.id", fmt.Sprint(*listSnapshotsOptions.SourceVolumeID))
	}
	if listSnapshotsOptions.SourceVolumeCRN != nil {
		builder.AddQuery("source_volume.crn", fmt.Sprint(*listSnapshotsOptions.SourceVolumeCRN))
	}
	if listSnapshotsOptions.SourceImageID != nil {
		builder.AddQuery("source_image.id", fmt.Sprint(*listSnapshotsOptions.SourceImageID))
	}
	if listSnapshotsOptions.SourceImageCRN != nil {
		builder.AddQuery("source_image.crn", fmt.Sprint(*listSnapshotsOptions.SourceImageCRN))
	}
	if listSnapshotsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listSnapshotsOptions.Sort))
	}
	if listSnapshotsOptions.BackupPolicyPlanID != nil {
		builder.AddQuery("backup_policy_plan.id", fmt.Sprint(*listSnapshotsOptions.BackupPolicyPlanID))
	}
	if listSnapshotsOptions.CopiesID != nil {
		builder.AddQuery("copies[].id", fmt.Sprint(*listSnapshotsOptions.CopiesID))
	}
	if listSnapshotsOptions.CopiesName != nil {
		builder.AddQuery("copies[].name", fmt.Sprint(*listSnapshotsOptions.CopiesName))
	}
	if listSnapshotsOptions.CopiesCRN != nil {
		builder.AddQuery("copies[].crn", fmt.Sprint(*listSnapshotsOptions.CopiesCRN))
	}
	if listSnapshotsOptions.CopiesRemoteRegionName != nil {
		builder.AddQuery("copies[].remote.region.name", fmt.Sprint(*listSnapshotsOptions.CopiesRemoteRegionName))
	}
	if listSnapshotsOptions.SourceSnapshotID != nil {
		builder.AddQuery("source_snapshot.id", fmt.Sprint(*listSnapshotsOptions.SourceSnapshotID))
	}
	if listSnapshotsOptions.SourceSnapshotRemoteRegionName != nil {
		builder.AddQuery("source_snapshot.remote.region.name", fmt.Sprint(*listSnapshotsOptions.SourceSnapshotRemoteRegionName))
	}
	if listSnapshotsOptions.SourceVolumeRemoteRegionName != nil {
		builder.AddQuery("source_volume.remote.region.name", fmt.Sprint(*listSnapshotsOptions.SourceVolumeRemoteRegionName))
	}
	if listSnapshotsOptions.SourceImageRemoteRegionName != nil {
		builder.AddQuery("source_image.remote.region.name", fmt.Sprint(*listSnapshotsOptions.SourceImageRemoteRegionName))
	}
	if listSnapshotsOptions.ClonesZoneName != nil {
		builder.AddQuery("clones[].zone.name", fmt.Sprint(*listSnapshotsOptions.ClonesZoneName))
	}
	if listSnapshotsOptions.SnapshotConsistencyGroupID != nil {
		builder.AddQuery("snapshot_consistency_group.id", fmt.Sprint(*listSnapshotsOptions.SnapshotConsistencyGroupID))
	}
	if listSnapshotsOptions.SnapshotConsistencyGroupCRN != nil {
		builder.AddQuery("snapshot_consistency_group.crn", fmt.Sprint(*listSnapshotsOptions.SnapshotConsistencyGroupCRN))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_snapshots", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateSnapshot : Create a snapshot
// This request creates a new snapshot from a snapshot prototype object.  The prototype object is structured in the same
// way as a retrieved snapshot, and contains the information necessary to provision the new snapshot.
func (vpc *VpcV1) CreateSnapshot(createSnapshotOptions *CreateSnapshotOptions) (result *Snapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateSnapshotWithContext(context.Background(), createSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateSnapshotWithContext is an alternate form of the CreateSnapshot method which supports a Context parameter
func (vpc *VpcV1) CreateSnapshotWithContext(ctx context.Context, createSnapshotOptions *CreateSnapshotOptions) (result *Snapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createSnapshotOptions, "createSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createSnapshotOptions, "createSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createSnapshotOptions.SnapshotPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSnapshot : Delete a snapshot
// This request deletes a snapshot. This operation cannot be reversed.
func (vpc *VpcV1) DeleteSnapshot(deleteSnapshotOptions *DeleteSnapshotOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteSnapshotWithContext(context.Background(), deleteSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSnapshotWithContext is an alternate form of the DeleteSnapshot method which supports a Context parameter
func (vpc *VpcV1) DeleteSnapshotWithContext(ctx context.Context, deleteSnapshotOptions *DeleteSnapshotOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSnapshotOptions, "deleteSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSnapshotOptions, "deleteSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteSnapshotOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	if deleteSnapshotOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteSnapshotOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetSnapshot : Retrieve a snapshot
// This request retrieves a single snapshot specified by the identifier in the URL.
func (vpc *VpcV1) GetSnapshot(getSnapshotOptions *GetSnapshotOptions) (result *Snapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetSnapshotWithContext(context.Background(), getSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetSnapshotWithContext is an alternate form of the GetSnapshot method which supports a Context parameter
func (vpc *VpcV1) GetSnapshotWithContext(ctx context.Context, getSnapshotOptions *GetSnapshotOptions) (result *Snapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getSnapshotOptions, "getSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getSnapshotOptions, "getSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getSnapshotOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateSnapshot : Update a snapshot
// This request updates a snapshot with the information in a provided snapshot patch. The snapshot consistency group
// patch object is structured in the same way as a retrieved snapshot and contains only the information to be updated.
func (vpc *VpcV1) UpdateSnapshot(updateSnapshotOptions *UpdateSnapshotOptions) (result *Snapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateSnapshotWithContext(context.Background(), updateSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateSnapshotWithContext is an alternate form of the UpdateSnapshot method which supports a Context parameter
func (vpc *VpcV1) UpdateSnapshotWithContext(ctx context.Context, updateSnapshotOptions *UpdateSnapshotOptions) (result *Snapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateSnapshotOptions, "updateSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateSnapshotOptions, "updateSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateSnapshotOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateSnapshotOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateSnapshotOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateSnapshotOptions.SnapshotPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListSnapshotClones : List clones for a snapshot
// This request lists clones for a snapshot. Use a clone to quickly restore a snapshot within the clone's zone.
func (vpc *VpcV1) ListSnapshotClones(listSnapshotClonesOptions *ListSnapshotClonesOptions) (result *SnapshotCloneCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSnapshotClonesWithContext(context.Background(), listSnapshotClonesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSnapshotClonesWithContext is an alternate form of the ListSnapshotClones method which supports a Context parameter
func (vpc *VpcV1) ListSnapshotClonesWithContext(ctx context.Context, listSnapshotClonesOptions *ListSnapshotClonesOptions) (result *SnapshotCloneCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listSnapshotClonesOptions, "listSnapshotClonesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listSnapshotClonesOptions, "listSnapshotClonesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *listSnapshotClonesOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}/clones`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSnapshotClones")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSnapshotClonesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_snapshot_clones", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotCloneCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSnapshotClone : Delete a snapshot clone
// This request deletes a snapshot clone. This operation cannot be reversed, but an equivalent clone may be recreated
// from the snapshot.
func (vpc *VpcV1) DeleteSnapshotClone(deleteSnapshotCloneOptions *DeleteSnapshotCloneOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteSnapshotCloneWithContext(context.Background(), deleteSnapshotCloneOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSnapshotCloneWithContext is an alternate form of the DeleteSnapshotClone method which supports a Context parameter
func (vpc *VpcV1) DeleteSnapshotCloneWithContext(ctx context.Context, deleteSnapshotCloneOptions *DeleteSnapshotCloneOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSnapshotCloneOptions, "deleteSnapshotCloneOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSnapshotCloneOptions, "deleteSnapshotCloneOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id":        *deleteSnapshotCloneOptions.ID,
		"zone_name": *deleteSnapshotCloneOptions.ZoneName,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}/clones/{zone_name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSnapshotClone")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSnapshotCloneOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_snapshot_clone", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetSnapshotClone : Retrieve a snapshot clone
// This request retrieves a single clone specified by the snapshot identifier and zone name in the URL.
func (vpc *VpcV1) GetSnapshotClone(getSnapshotCloneOptions *GetSnapshotCloneOptions) (result *SnapshotClone, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetSnapshotCloneWithContext(context.Background(), getSnapshotCloneOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetSnapshotCloneWithContext is an alternate form of the GetSnapshotClone method which supports a Context parameter
func (vpc *VpcV1) GetSnapshotCloneWithContext(ctx context.Context, getSnapshotCloneOptions *GetSnapshotCloneOptions) (result *SnapshotClone, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getSnapshotCloneOptions, "getSnapshotCloneOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getSnapshotCloneOptions, "getSnapshotCloneOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id":        *getSnapshotCloneOptions.ID,
		"zone_name": *getSnapshotCloneOptions.ZoneName,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}/clones/{zone_name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetSnapshotClone")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getSnapshotCloneOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_snapshot_clone", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotClone)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateSnapshotClone : Create a clone for a snapshot
// This request creates a new clone for a snapshot in the specified zone. A request body is not required, and if
// provided, is ignored. If the snapshot already has a clone in the zone, it is returned.
func (vpc *VpcV1) CreateSnapshotClone(createSnapshotCloneOptions *CreateSnapshotCloneOptions) (result *SnapshotClone, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateSnapshotCloneWithContext(context.Background(), createSnapshotCloneOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateSnapshotCloneWithContext is an alternate form of the CreateSnapshotClone method which supports a Context parameter
func (vpc *VpcV1) CreateSnapshotCloneWithContext(ctx context.Context, createSnapshotCloneOptions *CreateSnapshotCloneOptions) (result *SnapshotClone, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createSnapshotCloneOptions, "createSnapshotCloneOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createSnapshotCloneOptions, "createSnapshotCloneOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id":        *createSnapshotCloneOptions.ID,
		"zone_name": *createSnapshotCloneOptions.ZoneName,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}/clones/{zone_name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateSnapshotClone")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createSnapshotCloneOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_snapshot_clone", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotClone)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListSnapshotInstanceProfiles : List instance profiles compatible with a snapshot
// This request lists instance profiles compatible with a snapshot's
// `allowed_use.instance`, `operating_system.architecture` and
// `operating_system.user_data_format` properties, sorted by ascending `name` property values. The specified snapshot
// must be bootable.
func (vpc *VpcV1) ListSnapshotInstanceProfiles(listSnapshotInstanceProfilesOptions *ListSnapshotInstanceProfilesOptions) (result *SnapshotInstanceProfileCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSnapshotInstanceProfilesWithContext(context.Background(), listSnapshotInstanceProfilesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSnapshotInstanceProfilesWithContext is an alternate form of the ListSnapshotInstanceProfiles method which supports a Context parameter
func (vpc *VpcV1) ListSnapshotInstanceProfilesWithContext(ctx context.Context, listSnapshotInstanceProfilesOptions *ListSnapshotInstanceProfilesOptions) (result *SnapshotInstanceProfileCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listSnapshotInstanceProfilesOptions, "listSnapshotInstanceProfilesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listSnapshotInstanceProfilesOptions, "listSnapshotInstanceProfilesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *listSnapshotInstanceProfilesOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/snapshots/{id}/instance_profiles`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSnapshotInstanceProfiles")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSnapshotInstanceProfilesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listSnapshotInstanceProfilesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listSnapshotInstanceProfilesOptions.Start))
	}
	if listSnapshotInstanceProfilesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listSnapshotInstanceProfilesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_snapshot_instance_profiles", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSnapshotInstanceProfileCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListShareProfiles : List file share profiles
// This request lists [file share profiles](https://cloud.ibm.com/docs/vpc?topic=vpc-file-storage-profiles) available in
// the region. A file share profile specifies the performance characteristics and pricing model for a file share.
func (vpc *VpcV1) ListShareProfiles(listShareProfilesOptions *ListShareProfilesOptions) (result *ShareProfileCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListShareProfilesWithContext(context.Background(), listShareProfilesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListShareProfilesWithContext is an alternate form of the ListShareProfiles method which supports a Context parameter
func (vpc *VpcV1) ListShareProfilesWithContext(ctx context.Context, listShareProfilesOptions *ListShareProfilesOptions) (result *ShareProfileCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listShareProfilesOptions, "listShareProfilesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/share/profiles`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListShareProfiles")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listShareProfilesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listShareProfilesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listShareProfilesOptions.Start))
	}
	if listShareProfilesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listShareProfilesOptions.Limit))
	}
	if listShareProfilesOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listShareProfilesOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_share_profiles", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareProfileCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetShareProfile : Retrieve a file share profile
// This request retrieves a single file share profile specified by the name in the URL.
func (vpc *VpcV1) GetShareProfile(getShareProfileOptions *GetShareProfileOptions) (result *ShareProfile, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetShareProfileWithContext(context.Background(), getShareProfileOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetShareProfileWithContext is an alternate form of the GetShareProfile method which supports a Context parameter
func (vpc *VpcV1) GetShareProfileWithContext(ctx context.Context, getShareProfileOptions *GetShareProfileOptions) (result *ShareProfile, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getShareProfileOptions, "getShareProfileOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getShareProfileOptions, "getShareProfileOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"name": *getShareProfileOptions.Name,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/share/profiles/{name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetShareProfile")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getShareProfileOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_share_profile", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareProfile)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListShares : List file shares
// This request lists file shares in the region.
func (vpc *VpcV1) ListShares(listSharesOptions *ListSharesOptions) (result *ShareCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSharesWithContext(context.Background(), listSharesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSharesWithContext is an alternate form of the ListShares method which supports a Context parameter
func (vpc *VpcV1) ListSharesWithContext(ctx context.Context, listSharesOptions *ListSharesOptions) (result *ShareCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listSharesOptions, "listSharesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListShares")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSharesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listSharesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listSharesOptions.Start))
	}
	if listSharesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listSharesOptions.Limit))
	}
	if listSharesOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listSharesOptions.ResourceGroupID))
	}
	if listSharesOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listSharesOptions.Name))
	}
	if listSharesOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listSharesOptions.Sort))
	}
	if listSharesOptions.ReplicationRole != nil {
		builder.AddQuery("replication_role", fmt.Sprint(*listSharesOptions.ReplicationRole))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_shares", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateShare : Create a file share
// This request provisions new file shares from a share prototype object. The new file shares can be a standalone share,
// a replica share, or both a source and replica share.
//
// The prototype object is structured in the same way as a retrieved share, and contains the information necessary to
// provision the new file shares.
func (vpc *VpcV1) CreateShare(createShareOptions *CreateShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateShareWithContext(context.Background(), createShareOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateShareWithContext is an alternate form of the CreateShare method which supports a Context parameter
func (vpc *VpcV1) CreateShareWithContext(ctx context.Context, createShareOptions *CreateShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createShareOptions, "createShareOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createShareOptions, "createShareOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateShare")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createShareOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createShareOptions.SharePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_share", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShare)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteShare : Delete a file share
// This request deletes a share. This operation cannot be reversed. A share cannot be deleted if it:
// - has share mount targets
// - has a `lifecycle_state` of `updating`
// - has a replication operation in progress
//
// If the request is accepted, the share `lifecycle_state` will be set to `deleting`. Once deletion processing
// completes, it will no longer be retrievable.
func (vpc *VpcV1) DeleteShare(deleteShareOptions *DeleteShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteShareWithContext(context.Background(), deleteShareOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteShareWithContext is an alternate form of the DeleteShare method which supports a Context parameter
func (vpc *VpcV1) DeleteShareWithContext(ctx context.Context, deleteShareOptions *DeleteShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteShareOptions, "deleteShareOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteShareOptions, "deleteShareOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteShareOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteShare")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteShareOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteShareOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteShareOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_share", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShare)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetShare : Retrieve a file share
// This request retrieves a single file share specified by the identifier in the URL.
func (vpc *VpcV1) GetShare(getShareOptions *GetShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetShareWithContext(context.Background(), getShareOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetShareWithContext is an alternate form of the GetShare method which supports a Context parameter
func (vpc *VpcV1) GetShareWithContext(ctx context.Context, getShareOptions *GetShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getShareOptions, "getShareOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getShareOptions, "getShareOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getShareOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetShare")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getShareOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_share", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShare)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateShare : Update a file share
// This request updates a share with the information in a provided share patch. The share patch object is structured in
// the same way as a retrieved share and contains only the information to be updated.
func (vpc *VpcV1) UpdateShare(updateShareOptions *UpdateShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateShareWithContext(context.Background(), updateShareOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateShareWithContext is an alternate form of the UpdateShare method which supports a Context parameter
func (vpc *VpcV1) UpdateShareWithContext(ctx context.Context, updateShareOptions *UpdateShareOptions) (result *Share, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateShareOptions, "updateShareOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateShareOptions, "updateShareOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateShareOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateShare")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateShareOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateShareOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateShareOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateShareOptions.SharePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_share", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShare)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListShareAccessorBindings : List accessor bindings for a file share
// This request lists accessor bindings for a share. Each accessor binding identifies a resource (possibly in another
// account) with access to this file share including its snapshots.
//
// The share accessor bindings will be sorted by their `created_at` property values, with newest bindings first.
func (vpc *VpcV1) ListShareAccessorBindings(listShareAccessorBindingsOptions *ListShareAccessorBindingsOptions) (result *ShareAccessorBindingCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListShareAccessorBindingsWithContext(context.Background(), listShareAccessorBindingsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListShareAccessorBindingsWithContext is an alternate form of the ListShareAccessorBindings method which supports a Context parameter
func (vpc *VpcV1) ListShareAccessorBindingsWithContext(ctx context.Context, listShareAccessorBindingsOptions *ListShareAccessorBindingsOptions) (result *ShareAccessorBindingCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listShareAccessorBindingsOptions, "listShareAccessorBindingsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listShareAccessorBindingsOptions, "listShareAccessorBindingsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *listShareAccessorBindingsOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{id}/accessor_bindings`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListShareAccessorBindings")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listShareAccessorBindingsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listShareAccessorBindingsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listShareAccessorBindingsOptions.Start))
	}
	if listShareAccessorBindingsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listShareAccessorBindingsOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_share_accessor_bindings", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareAccessorBindingCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteShareAccessorBinding : Delete a file share accessor binding
// This request deletes a share accessor binding. This operation cannot be reversed.
func (vpc *VpcV1) DeleteShareAccessorBinding(deleteShareAccessorBindingOptions *DeleteShareAccessorBindingOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteShareAccessorBindingWithContext(context.Background(), deleteShareAccessorBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteShareAccessorBindingWithContext is an alternate form of the DeleteShareAccessorBinding method which supports a Context parameter
func (vpc *VpcV1) DeleteShareAccessorBindingWithContext(ctx context.Context, deleteShareAccessorBindingOptions *DeleteShareAccessorBindingOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteShareAccessorBindingOptions, "deleteShareAccessorBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteShareAccessorBindingOptions, "deleteShareAccessorBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *deleteShareAccessorBindingOptions.ShareID,
		"id":       *deleteShareAccessorBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/accessor_bindings/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteShareAccessorBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteShareAccessorBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_share_accessor_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetShareAccessorBinding : Retrieve a file share accessor binding
// This request retrieves a single accessor binding specified by the identifier in the URL.
func (vpc *VpcV1) GetShareAccessorBinding(getShareAccessorBindingOptions *GetShareAccessorBindingOptions) (result *ShareAccessorBinding, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetShareAccessorBindingWithContext(context.Background(), getShareAccessorBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetShareAccessorBindingWithContext is an alternate form of the GetShareAccessorBinding method which supports a Context parameter
func (vpc *VpcV1) GetShareAccessorBindingWithContext(ctx context.Context, getShareAccessorBindingOptions *GetShareAccessorBindingOptions) (result *ShareAccessorBinding, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getShareAccessorBindingOptions, "getShareAccessorBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getShareAccessorBindingOptions, "getShareAccessorBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *getShareAccessorBindingOptions.ShareID,
		"id":       *getShareAccessorBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/accessor_bindings/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetShareAccessorBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getShareAccessorBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_share_accessor_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareAccessorBinding)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// FailoverShare : Failover to replica file share
// This request triggers a failover to the replica file share specified by the identifier in the URL. The failover
// cannot be started if a source share or the replica share has a `lifecycle_state` of `updating`, or has a replication
// operation in progress.
//
// If `fallback_policy` is specified as `split`, and the request is accepted but the failover operation cannot be
// performed, a split will be triggered.
func (vpc *VpcV1) FailoverShare(failoverShareOptions *FailoverShareOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.FailoverShareWithContext(context.Background(), failoverShareOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// FailoverShareWithContext is an alternate form of the FailoverShare method which supports a Context parameter
func (vpc *VpcV1) FailoverShareWithContext(ctx context.Context, failoverShareOptions *FailoverShareOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(failoverShareOptions, "failoverShareOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(failoverShareOptions, "failoverShareOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *failoverShareOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/failover`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "FailoverShare")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range failoverShareOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if failoverShareOptions.FallbackPolicy != nil {
		body["fallback_policy"] = failoverShareOptions.FallbackPolicy
	}
	if failoverShareOptions.Timeout != nil {
		body["timeout"] = failoverShareOptions.Timeout
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "failover_share", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListShareMountTargets : List mount targets for a file share
// This request lists mount targets for a file share. A mount target is a network endpoint at which a file share may be
// mounted. The file share can be mounted by clients in the same VPC and zone after creating share mount targets.
//
// The share mount targets will be sorted by their `created_at` property values, with newest targets first.
func (vpc *VpcV1) ListShareMountTargets(listShareMountTargetsOptions *ListShareMountTargetsOptions) (result *ShareMountTargetCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListShareMountTargetsWithContext(context.Background(), listShareMountTargetsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListShareMountTargetsWithContext is an alternate form of the ListShareMountTargets method which supports a Context parameter
func (vpc *VpcV1) ListShareMountTargetsWithContext(ctx context.Context, listShareMountTargetsOptions *ListShareMountTargetsOptions) (result *ShareMountTargetCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listShareMountTargetsOptions, "listShareMountTargetsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listShareMountTargetsOptions, "listShareMountTargetsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *listShareMountTargetsOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/mount_targets`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListShareMountTargets")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listShareMountTargetsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listShareMountTargetsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listShareMountTargetsOptions.Name))
	}
	if listShareMountTargetsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listShareMountTargetsOptions.Start))
	}
	if listShareMountTargetsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listShareMountTargetsOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_share_mount_targets", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareMountTargetCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateShareMountTarget : Create a mount target for a file share
// This request creates a new share mount target from a share mount target prototype object.
//
// The prototype object is structured in the same way as a retrieved share mount target, and contains the information
// necessary to provision the new file share mount target.
func (vpc *VpcV1) CreateShareMountTarget(createShareMountTargetOptions *CreateShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateShareMountTargetWithContext(context.Background(), createShareMountTargetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateShareMountTargetWithContext is an alternate form of the CreateShareMountTarget method which supports a Context parameter
func (vpc *VpcV1) CreateShareMountTargetWithContext(ctx context.Context, createShareMountTargetOptions *CreateShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createShareMountTargetOptions, "createShareMountTargetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createShareMountTargetOptions, "createShareMountTargetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *createShareMountTargetOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/mount_targets`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateShareMountTarget")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createShareMountTargetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createShareMountTargetOptions.ShareMountTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_share_mount_target", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareMountTarget)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteShareMountTarget : Delete a file share mount target
// This request deletes a share mount target. This operation cannot be reversed.
//
// If the request is accepted, the share mount target `lifecycle_state` will be set to
// `deleting`. Once deletion processing completes, it will no longer be retrievable.
func (vpc *VpcV1) DeleteShareMountTarget(deleteShareMountTargetOptions *DeleteShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteShareMountTargetWithContext(context.Background(), deleteShareMountTargetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteShareMountTargetWithContext is an alternate form of the DeleteShareMountTarget method which supports a Context parameter
func (vpc *VpcV1) DeleteShareMountTargetWithContext(ctx context.Context, deleteShareMountTargetOptions *DeleteShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteShareMountTargetOptions, "deleteShareMountTargetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteShareMountTargetOptions, "deleteShareMountTargetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *deleteShareMountTargetOptions.ShareID,
		"id":       *deleteShareMountTargetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/mount_targets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteShareMountTarget")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteShareMountTargetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_share_mount_target", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareMountTarget)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetShareMountTarget : Retrieve a file share mount target
// This request retrieves a single share mount target specified by the identifier in the URL.
func (vpc *VpcV1) GetShareMountTarget(getShareMountTargetOptions *GetShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetShareMountTargetWithContext(context.Background(), getShareMountTargetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetShareMountTargetWithContext is an alternate form of the GetShareMountTarget method which supports a Context parameter
func (vpc *VpcV1) GetShareMountTargetWithContext(ctx context.Context, getShareMountTargetOptions *GetShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getShareMountTargetOptions, "getShareMountTargetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getShareMountTargetOptions, "getShareMountTargetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *getShareMountTargetOptions.ShareID,
		"id":       *getShareMountTargetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/mount_targets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetShareMountTarget")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getShareMountTargetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_share_mount_target", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareMountTarget)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateShareMountTarget : Update a file share mount target
// This request updates a share mount target with the information provided in a share mount target patch object. The
// share mount target patch object is structured in the same way as a retrieved share mount target and needs to contain
// only the information to be updated.
func (vpc *VpcV1) UpdateShareMountTarget(updateShareMountTargetOptions *UpdateShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateShareMountTargetWithContext(context.Background(), updateShareMountTargetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateShareMountTargetWithContext is an alternate form of the UpdateShareMountTarget method which supports a Context parameter
func (vpc *VpcV1) UpdateShareMountTargetWithContext(ctx context.Context, updateShareMountTargetOptions *UpdateShareMountTargetOptions) (result *ShareMountTarget, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateShareMountTargetOptions, "updateShareMountTargetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateShareMountTargetOptions, "updateShareMountTargetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *updateShareMountTargetOptions.ShareID,
		"id":       *updateShareMountTargetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/mount_targets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateShareMountTarget")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateShareMountTargetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateShareMountTargetOptions.ShareMountTargetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_share_mount_target", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareMountTarget)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListShareSnapshots : List file share snapshots
// This request lists snapshots for the specified file share, or across all accessible file shares. A snapshot preserves
// the data of a share at the time the snapshot was captured.
//
// If the file share is a replica, the list will contain snapshots corresponding to snapshots on the source.
func (vpc *VpcV1) ListShareSnapshots(listShareSnapshotsOptions *ListShareSnapshotsOptions) (result *ShareSnapshotCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListShareSnapshotsWithContext(context.Background(), listShareSnapshotsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListShareSnapshotsWithContext is an alternate form of the ListShareSnapshots method which supports a Context parameter
func (vpc *VpcV1) ListShareSnapshotsWithContext(ctx context.Context, listShareSnapshotsOptions *ListShareSnapshotsOptions) (result *ShareSnapshotCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listShareSnapshotsOptions, "listShareSnapshotsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listShareSnapshotsOptions, "listShareSnapshotsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *listShareSnapshotsOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/snapshots`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListShareSnapshots")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listShareSnapshotsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listShareSnapshotsOptions.BackupPolicyPlanID != nil {
		builder.AddQuery("backup_policy_plan.id", fmt.Sprint(*listShareSnapshotsOptions.BackupPolicyPlanID))
	}
	if listShareSnapshotsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listShareSnapshotsOptions.Name))
	}
	if listShareSnapshotsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listShareSnapshotsOptions.Start))
	}
	if listShareSnapshotsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listShareSnapshotsOptions.Limit))
	}
	if listShareSnapshotsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listShareSnapshotsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_share_snapshots", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareSnapshotCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateShareSnapshot : Create a snapshot for a file share
// This request creates a new share snapshot from a share snapshot prototype object. The prototype object is structured
// in the same way as a retrieved share snapshot, and contains the information necessary to create the new share
// snapshot.
//
// The share must have an `access_control_mode` of `security_group` and a `replication_role` of `source` or `none`.
//
// The snapshot will inherit its `resource_group` and encryption settings from the share.
//
// If the share has a `replication_role` of `source`, a corresponding snapshot on the replica share will be created with
// a `status` of `pending`. It will remain in
// `pending` until the data is synchronized per the replication schedule determined by the replica share's
// `replication_cron_spec`.
func (vpc *VpcV1) CreateShareSnapshot(createShareSnapshotOptions *CreateShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateShareSnapshotWithContext(context.Background(), createShareSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateShareSnapshotWithContext is an alternate form of the CreateShareSnapshot method which supports a Context parameter
func (vpc *VpcV1) CreateShareSnapshotWithContext(ctx context.Context, createShareSnapshotOptions *CreateShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createShareSnapshotOptions, "createShareSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createShareSnapshotOptions, "createShareSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *createShareSnapshotOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/snapshots`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateShareSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createShareSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createShareSnapshotOptions.Name != nil {
		body["name"] = createShareSnapshotOptions.Name
	}
	if createShareSnapshotOptions.UserTags != nil {
		body["user_tags"] = createShareSnapshotOptions.UserTags
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_share_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteShareSnapshot : Delete a share snapshot
// This request deletes a share snapshot. This operation cannot be reversed. For this request to succeed, the share must
// have a `replication_role` of `source` or `none`.
//
// If the request is accepted, the share snapshot `lifecycle_state` will be set to
// `deleting`. Once deletion processing completes, the share snapshot will no longer be retrievable.
//
// Deleting a share snapshot will not affect any previously-accepted requests to create a share from it.
//
// If the share has a `replication_role` of `source`, the corresponding snapshot on the replica share will be
// subsequently moved to a `lifecycle_state` of `deleting`. If the data for the corresponding snapshot has already been
// synchronized via the replication schedule determined by `replication_cron_spec`, the snapshot will remain available
// in the replica share's `.snapshot` directory until the next replication sync.
func (vpc *VpcV1) DeleteShareSnapshot(deleteShareSnapshotOptions *DeleteShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteShareSnapshotWithContext(context.Background(), deleteShareSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteShareSnapshotWithContext is an alternate form of the DeleteShareSnapshot method which supports a Context parameter
func (vpc *VpcV1) DeleteShareSnapshotWithContext(ctx context.Context, deleteShareSnapshotOptions *DeleteShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteShareSnapshotOptions, "deleteShareSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteShareSnapshotOptions, "deleteShareSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *deleteShareSnapshotOptions.ShareID,
		"id":       *deleteShareSnapshotOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/snapshots/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteShareSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteShareSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_share_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetShareSnapshot : Retrieve a share snapshot
// This request retrieves a single share snapshot specified by the identifier in the URL.
func (vpc *VpcV1) GetShareSnapshot(getShareSnapshotOptions *GetShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetShareSnapshotWithContext(context.Background(), getShareSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetShareSnapshotWithContext is an alternate form of the GetShareSnapshot method which supports a Context parameter
func (vpc *VpcV1) GetShareSnapshotWithContext(ctx context.Context, getShareSnapshotOptions *GetShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getShareSnapshotOptions, "getShareSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getShareSnapshotOptions, "getShareSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *getShareSnapshotOptions.ShareID,
		"id":       *getShareSnapshotOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/snapshots/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetShareSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getShareSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_share_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateShareSnapshot : Update a share snapshot
// This request updates a share snapshot with the information provided in a share snapshot patch object. The share
// snapshot patch object is structured in the same way as a retrieved share snapshot and needs to contain only the
// information to be updated.
func (vpc *VpcV1) UpdateShareSnapshot(updateShareSnapshotOptions *UpdateShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateShareSnapshotWithContext(context.Background(), updateShareSnapshotOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateShareSnapshotWithContext is an alternate form of the UpdateShareSnapshot method which supports a Context parameter
func (vpc *VpcV1) UpdateShareSnapshotWithContext(ctx context.Context, updateShareSnapshotOptions *UpdateShareSnapshotOptions) (result *ShareSnapshot, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateShareSnapshotOptions, "updateShareSnapshotOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateShareSnapshotOptions, "updateShareSnapshotOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *updateShareSnapshotOptions.ShareID,
		"id":       *updateShareSnapshotOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/snapshots/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateShareSnapshot")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateShareSnapshotOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateShareSnapshotOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateShareSnapshotOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateShareSnapshotOptions.ShareSnapshotPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_share_snapshot", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareSnapshot)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteShareSource : Split the source file share from a replica file share
// This request removes the replication relationship between a source share and the replica share specified by the
// identifier in the URL. The replication relationship cannot be removed if a source share or the replica share has a
// `lifecycle_state` of `updating`, or has a replication operation in progress.
//
// This operation cannot be reversed.
func (vpc *VpcV1) DeleteShareSource(deleteShareSourceOptions *DeleteShareSourceOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteShareSourceWithContext(context.Background(), deleteShareSourceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteShareSourceWithContext is an alternate form of the DeleteShareSource method which supports a Context parameter
func (vpc *VpcV1) DeleteShareSourceWithContext(ctx context.Context, deleteShareSourceOptions *DeleteShareSourceOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteShareSourceOptions, "deleteShareSourceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteShareSourceOptions, "deleteShareSourceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *deleteShareSourceOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/source`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteShareSource")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteShareSourceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_share_source", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetShareSource : Retrieve the source file share for a replica file share
// This request retrieves the source file share associated with the replica file share specified by the identifier in
// the URL.
func (vpc *VpcV1) GetShareSource(getShareSourceOptions *GetShareSourceOptions) (result *ShareReference, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetShareSourceWithContext(context.Background(), getShareSourceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetShareSourceWithContext is an alternate form of the GetShareSource method which supports a Context parameter
func (vpc *VpcV1) GetShareSourceWithContext(ctx context.Context, getShareSourceOptions *GetShareSourceOptions) (result *ShareReference, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getShareSourceOptions, "getShareSourceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getShareSourceOptions, "getShareSourceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"share_id": *getShareSourceOptions.ShareID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/shares/{share_id}/source`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetShareSource")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getShareSourceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_share_source", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalShareReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListBackupPolicies : List backup policies
// This request lists backup policies in the region. Backup policies control which sources are selected for backup and
// include a set of backup policy plans that provide the backup schedules and deletion triggers.
func (vpc *VpcV1) ListBackupPolicies(listBackupPoliciesOptions *ListBackupPoliciesOptions) (result *BackupPolicyCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListBackupPoliciesWithContext(context.Background(), listBackupPoliciesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListBackupPoliciesWithContext is an alternate form of the ListBackupPolicies method which supports a Context parameter
func (vpc *VpcV1) ListBackupPoliciesWithContext(ctx context.Context, listBackupPoliciesOptions *ListBackupPoliciesOptions) (result *BackupPolicyCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listBackupPoliciesOptions, "listBackupPoliciesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListBackupPolicies")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listBackupPoliciesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listBackupPoliciesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listBackupPoliciesOptions.Start))
	}
	if listBackupPoliciesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listBackupPoliciesOptions.Limit))
	}
	if listBackupPoliciesOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listBackupPoliciesOptions.ResourceGroupID))
	}
	if listBackupPoliciesOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listBackupPoliciesOptions.Name))
	}
	if listBackupPoliciesOptions.Tag != nil {
		builder.AddQuery("tag", fmt.Sprint(*listBackupPoliciesOptions.Tag))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_backup_policies", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateBackupPolicy : Create a backup policy
// This request creates a new backup policy from a backup policy prototype object. The prototype object is structured in
// the same way as a retrieved backup policy, and contains the information necessary to create the new backup policy.
func (vpc *VpcV1) CreateBackupPolicy(createBackupPolicyOptions *CreateBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateBackupPolicyWithContext(context.Background(), createBackupPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateBackupPolicyWithContext is an alternate form of the CreateBackupPolicy method which supports a Context parameter
func (vpc *VpcV1) CreateBackupPolicyWithContext(ctx context.Context, createBackupPolicyOptions *CreateBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createBackupPolicyOptions, "createBackupPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createBackupPolicyOptions, "createBackupPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateBackupPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createBackupPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createBackupPolicyOptions.BackupPolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_backup_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListBackupPolicyJobs : List jobs for a backup policy
// This request retrieves jobs for a backup policy. A backup job represents the execution of a backup policy plan for a
// resource matching the policy's criteria.
func (vpc *VpcV1) ListBackupPolicyJobs(listBackupPolicyJobsOptions *ListBackupPolicyJobsOptions) (result *BackupPolicyJobCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListBackupPolicyJobsWithContext(context.Background(), listBackupPolicyJobsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListBackupPolicyJobsWithContext is an alternate form of the ListBackupPolicyJobs method which supports a Context parameter
func (vpc *VpcV1) ListBackupPolicyJobsWithContext(ctx context.Context, listBackupPolicyJobsOptions *ListBackupPolicyJobsOptions) (result *BackupPolicyJobCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listBackupPolicyJobsOptions, "listBackupPolicyJobsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listBackupPolicyJobsOptions, "listBackupPolicyJobsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *listBackupPolicyJobsOptions.BackupPolicyID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/jobs`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListBackupPolicyJobs")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listBackupPolicyJobsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listBackupPolicyJobsOptions.Status != nil {
		builder.AddQuery("status", fmt.Sprint(*listBackupPolicyJobsOptions.Status))
	}
	if listBackupPolicyJobsOptions.BackupPolicyPlanID != nil {
		builder.AddQuery("backup_policy_plan.id", fmt.Sprint(*listBackupPolicyJobsOptions.BackupPolicyPlanID))
	}
	if listBackupPolicyJobsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listBackupPolicyJobsOptions.Start))
	}
	if listBackupPolicyJobsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listBackupPolicyJobsOptions.Limit))
	}
	if listBackupPolicyJobsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listBackupPolicyJobsOptions.Sort))
	}
	if listBackupPolicyJobsOptions.SourceID != nil {
		builder.AddQuery("source.id", fmt.Sprint(*listBackupPolicyJobsOptions.SourceID))
	}
	if listBackupPolicyJobsOptions.TargetSnapshotsID != nil {
		builder.AddQuery("target_snapshots[].id", fmt.Sprint(*listBackupPolicyJobsOptions.TargetSnapshotsID))
	}
	if listBackupPolicyJobsOptions.TargetSnapshotsCRN != nil {
		builder.AddQuery("target_snapshots[].crn", fmt.Sprint(*listBackupPolicyJobsOptions.TargetSnapshotsCRN))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_backup_policy_jobs", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyJobCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetBackupPolicyJob : Retrieve a backup policy job
// This request retrieves a single backup policy job specified by the identifier in the URL.
func (vpc *VpcV1) GetBackupPolicyJob(getBackupPolicyJobOptions *GetBackupPolicyJobOptions) (result *BackupPolicyJob, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBackupPolicyJobWithContext(context.Background(), getBackupPolicyJobOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBackupPolicyJobWithContext is an alternate form of the GetBackupPolicyJob method which supports a Context parameter
func (vpc *VpcV1) GetBackupPolicyJobWithContext(ctx context.Context, getBackupPolicyJobOptions *GetBackupPolicyJobOptions) (result *BackupPolicyJob, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getBackupPolicyJobOptions, "getBackupPolicyJobOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBackupPolicyJobOptions, "getBackupPolicyJobOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *getBackupPolicyJobOptions.BackupPolicyID,
		"id":               *getBackupPolicyJobOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/jobs/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBackupPolicyJob")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBackupPolicyJobOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_backup_policy_job", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyJob)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListBackupPolicyPlans : List plans for a backup policy
// This request retrieves plans for a backup policy. Backup plans provide the backup schedule and deletion triggers.
func (vpc *VpcV1) ListBackupPolicyPlans(listBackupPolicyPlansOptions *ListBackupPolicyPlansOptions) (result *BackupPolicyPlanCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListBackupPolicyPlansWithContext(context.Background(), listBackupPolicyPlansOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListBackupPolicyPlansWithContext is an alternate form of the ListBackupPolicyPlans method which supports a Context parameter
func (vpc *VpcV1) ListBackupPolicyPlansWithContext(ctx context.Context, listBackupPolicyPlansOptions *ListBackupPolicyPlansOptions) (result *BackupPolicyPlanCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listBackupPolicyPlansOptions, "listBackupPolicyPlansOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listBackupPolicyPlansOptions, "listBackupPolicyPlansOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *listBackupPolicyPlansOptions.BackupPolicyID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/plans`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListBackupPolicyPlans")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listBackupPolicyPlansOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listBackupPolicyPlansOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listBackupPolicyPlansOptions.Name))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_backup_policy_plans", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyPlanCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateBackupPolicyPlan : Create a plan for a backup policy
// This request creates a new backup policy plan from a backup policy plan prototype object. The prototype object is
// structured in the same way as a retrieved backup policy plan, and contains the information necessary to create the
// new backup policy plan.
//
// Backups created by this plan will use the resource group of the source being backed up.
//
// Backups created by this plan will use the plan's name truncated to 46 characters, followed by a unique 16-character
// suffix.
func (vpc *VpcV1) CreateBackupPolicyPlan(createBackupPolicyPlanOptions *CreateBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateBackupPolicyPlanWithContext(context.Background(), createBackupPolicyPlanOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateBackupPolicyPlanWithContext is an alternate form of the CreateBackupPolicyPlan method which supports a Context parameter
func (vpc *VpcV1) CreateBackupPolicyPlanWithContext(ctx context.Context, createBackupPolicyPlanOptions *CreateBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createBackupPolicyPlanOptions, "createBackupPolicyPlanOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createBackupPolicyPlanOptions, "createBackupPolicyPlanOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *createBackupPolicyPlanOptions.BackupPolicyID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/plans`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateBackupPolicyPlan")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createBackupPolicyPlanOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createBackupPolicyPlanOptions.CronSpec != nil {
		body["cron_spec"] = createBackupPolicyPlanOptions.CronSpec
	}
	if createBackupPolicyPlanOptions.Active != nil {
		body["active"] = createBackupPolicyPlanOptions.Active
	}
	if createBackupPolicyPlanOptions.AttachUserTags != nil {
		body["attach_user_tags"] = createBackupPolicyPlanOptions.AttachUserTags
	}
	if createBackupPolicyPlanOptions.ClonePolicy != nil {
		body["clone_policy"] = createBackupPolicyPlanOptions.ClonePolicy
	}
	if createBackupPolicyPlanOptions.CopyUserTags != nil {
		body["copy_user_tags"] = createBackupPolicyPlanOptions.CopyUserTags
	}
	if createBackupPolicyPlanOptions.DeletionTrigger != nil {
		body["deletion_trigger"] = createBackupPolicyPlanOptions.DeletionTrigger
	}
	if createBackupPolicyPlanOptions.Name != nil {
		body["name"] = createBackupPolicyPlanOptions.Name
	}
	if createBackupPolicyPlanOptions.RemoteRegionPolicies != nil {
		body["remote_region_policies"] = createBackupPolicyPlanOptions.RemoteRegionPolicies
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_backup_policy_plan", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyPlan)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteBackupPolicyPlan : Delete a backup policy plan
// This request deletes a backup policy plan. This operation cannot be reversed. Any backups that have been created by
// the plan will remain but will no longer be subject to the plan's deletion trigger. Any running jobs associated with
// the plan will run to completion before the plan is deleted.
//
// If the request is accepted, the backup policy plan `status` will be set to `deleting`. Once deletion processing
// completes, the backup policy plan will no longer be retrievable.
func (vpc *VpcV1) DeleteBackupPolicyPlan(deleteBackupPolicyPlanOptions *DeleteBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteBackupPolicyPlanWithContext(context.Background(), deleteBackupPolicyPlanOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteBackupPolicyPlanWithContext is an alternate form of the DeleteBackupPolicyPlan method which supports a Context parameter
func (vpc *VpcV1) DeleteBackupPolicyPlanWithContext(ctx context.Context, deleteBackupPolicyPlanOptions *DeleteBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteBackupPolicyPlanOptions, "deleteBackupPolicyPlanOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteBackupPolicyPlanOptions, "deleteBackupPolicyPlanOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *deleteBackupPolicyPlanOptions.BackupPolicyID,
		"id":               *deleteBackupPolicyPlanOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/plans/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteBackupPolicyPlan")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteBackupPolicyPlanOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteBackupPolicyPlanOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteBackupPolicyPlanOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_backup_policy_plan", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyPlan)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetBackupPolicyPlan : Retrieve a backup policy plan
// This request retrieves a single backup policy plan specified by the identifier in the URL.
func (vpc *VpcV1) GetBackupPolicyPlan(getBackupPolicyPlanOptions *GetBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBackupPolicyPlanWithContext(context.Background(), getBackupPolicyPlanOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBackupPolicyPlanWithContext is an alternate form of the GetBackupPolicyPlan method which supports a Context parameter
func (vpc *VpcV1) GetBackupPolicyPlanWithContext(ctx context.Context, getBackupPolicyPlanOptions *GetBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getBackupPolicyPlanOptions, "getBackupPolicyPlanOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBackupPolicyPlanOptions, "getBackupPolicyPlanOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *getBackupPolicyPlanOptions.BackupPolicyID,
		"id":               *getBackupPolicyPlanOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/plans/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBackupPolicyPlan")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBackupPolicyPlanOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_backup_policy_plan", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyPlan)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateBackupPolicyPlan : Update a backup policy plan
// This request updates a backup policy plan with the information in a provided plan patch. The plan patch object is
// structured in the same way as a retrieved backup policy plan and can contains only the information to be updated.
func (vpc *VpcV1) UpdateBackupPolicyPlan(updateBackupPolicyPlanOptions *UpdateBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateBackupPolicyPlanWithContext(context.Background(), updateBackupPolicyPlanOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateBackupPolicyPlanWithContext is an alternate form of the UpdateBackupPolicyPlan method which supports a Context parameter
func (vpc *VpcV1) UpdateBackupPolicyPlanWithContext(ctx context.Context, updateBackupPolicyPlanOptions *UpdateBackupPolicyPlanOptions) (result *BackupPolicyPlan, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateBackupPolicyPlanOptions, "updateBackupPolicyPlanOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateBackupPolicyPlanOptions, "updateBackupPolicyPlanOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"backup_policy_id": *updateBackupPolicyPlanOptions.BackupPolicyID,
		"id":               *updateBackupPolicyPlanOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{backup_policy_id}/plans/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateBackupPolicyPlan")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateBackupPolicyPlanOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateBackupPolicyPlanOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateBackupPolicyPlanOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateBackupPolicyPlanOptions.BackupPolicyPlanPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_backup_policy_plan", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicyPlan)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteBackupPolicy : Delete a backup policy
// This request deletes a backup policy. This operation cannot be reversed.
//
// If the request is accepted, the backup policy `status` will be set to `deleting`. Once deletion processing completes,
// the backup policy will no longer be retrievable.
func (vpc *VpcV1) DeleteBackupPolicy(deleteBackupPolicyOptions *DeleteBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteBackupPolicyWithContext(context.Background(), deleteBackupPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteBackupPolicyWithContext is an alternate form of the DeleteBackupPolicy method which supports a Context parameter
func (vpc *VpcV1) DeleteBackupPolicyWithContext(ctx context.Context, deleteBackupPolicyOptions *DeleteBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteBackupPolicyOptions, "deleteBackupPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteBackupPolicyOptions, "deleteBackupPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteBackupPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteBackupPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteBackupPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteBackupPolicyOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteBackupPolicyOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_backup_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetBackupPolicy : Retrieve a backup policy
// This request retrieves a single backup policy specified by the identifier in the URL.
func (vpc *VpcV1) GetBackupPolicy(getBackupPolicyOptions *GetBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetBackupPolicyWithContext(context.Background(), getBackupPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetBackupPolicyWithContext is an alternate form of the GetBackupPolicy method which supports a Context parameter
func (vpc *VpcV1) GetBackupPolicyWithContext(ctx context.Context, getBackupPolicyOptions *GetBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getBackupPolicyOptions, "getBackupPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getBackupPolicyOptions, "getBackupPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getBackupPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetBackupPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getBackupPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_backup_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateBackupPolicy : Update a backup policy
// This request updates a backup policy with the information in a provided backup policy patch. The backup policy patch
// object is structured in the same way as a retrieved backup policy and contains only the information to be updated.
func (vpc *VpcV1) UpdateBackupPolicy(updateBackupPolicyOptions *UpdateBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateBackupPolicyWithContext(context.Background(), updateBackupPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateBackupPolicyWithContext is an alternate form of the UpdateBackupPolicy method which supports a Context parameter
func (vpc *VpcV1) UpdateBackupPolicyWithContext(ctx context.Context, updateBackupPolicyOptions *UpdateBackupPolicyOptions) (result BackupPolicyIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateBackupPolicyOptions, "updateBackupPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateBackupPolicyOptions, "updateBackupPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateBackupPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/backup_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateBackupPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateBackupPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateBackupPolicyOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateBackupPolicyOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateBackupPolicyOptions.BackupPolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_backup_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalBackupPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListRegions : List regions
// This request lists regions. Each region is a separate geographic area that contains multiple isolated zones.
// Resources can be provisioned into one or more zones in a region. Each zone is isolated, but connected to other zones
// in the same region with low-latency and high-bandwidth links. Regions represent the top-level of fault isolation
// available. Resources deployed within a single region also benefit from the low latency afforded by geographic
// proximity.
func (vpc *VpcV1) ListRegions(listRegionsOptions *ListRegionsOptions) (result *RegionCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListRegionsWithContext(context.Background(), listRegionsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListRegionsWithContext is an alternate form of the ListRegions method which supports a Context parameter
func (vpc *VpcV1) ListRegionsWithContext(ctx context.Context, listRegionsOptions *ListRegionsOptions) (result *RegionCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listRegionsOptions, "listRegionsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/regions`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListRegions")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listRegionsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_regions", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalRegionCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetRegion : Retrieve a region
// This request retrieves a single region specified by the name in the URL.
func (vpc *VpcV1) GetRegion(getRegionOptions *GetRegionOptions) (result *Region, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetRegionWithContext(context.Background(), getRegionOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetRegionWithContext is an alternate form of the GetRegion method which supports a Context parameter
func (vpc *VpcV1) GetRegionWithContext(ctx context.Context, getRegionOptions *GetRegionOptions) (result *Region, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getRegionOptions, "getRegionOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getRegionOptions, "getRegionOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"name": *getRegionOptions.Name,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/regions/{name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetRegion")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getRegionOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_region", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalRegion)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListRegionZones : List zones in a region
// This request lists zones in a region. Zones represent logically-isolated data centers with high-bandwidth and
// low-latency interconnects to other zones in the same region. Faults in a zone do not affect other zones.
func (vpc *VpcV1) ListRegionZones(listRegionZonesOptions *ListRegionZonesOptions) (result *ZoneCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListRegionZonesWithContext(context.Background(), listRegionZonesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListRegionZonesWithContext is an alternate form of the ListRegionZones method which supports a Context parameter
func (vpc *VpcV1) ListRegionZonesWithContext(ctx context.Context, listRegionZonesOptions *ListRegionZonesOptions) (result *ZoneCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listRegionZonesOptions, "listRegionZonesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listRegionZonesOptions, "listRegionZonesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"region_name": *listRegionZonesOptions.RegionName,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/regions/{region_name}/zones`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListRegionZones")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listRegionZonesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_region_zones", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalZoneCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetRegionZone : Retrieve a zone
// This request retrieves a single zone specified by the region and zone names in the URL.
func (vpc *VpcV1) GetRegionZone(getRegionZoneOptions *GetRegionZoneOptions) (result *Zone, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetRegionZoneWithContext(context.Background(), getRegionZoneOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetRegionZoneWithContext is an alternate form of the GetRegionZone method which supports a Context parameter
func (vpc *VpcV1) GetRegionZoneWithContext(ctx context.Context, getRegionZoneOptions *GetRegionZoneOptions) (result *Zone, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getRegionZoneOptions, "getRegionZoneOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getRegionZoneOptions, "getRegionZoneOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"region_name": *getRegionZoneOptions.RegionName,
		"name":        *getRegionZoneOptions.Name,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/regions/{region_name}/zones/{name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetRegionZone")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getRegionZoneOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_region_zone", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalZone)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVirtualNetworkInterfaces : List virtual network interfaces
// This request lists virtual network interfaces in the region. A virtual network interface is a logical abstraction of
// a virtual network interface in a subnet, and may be attached to a target resource.
//
// The virtual network interfaces will be sorted by their `created_at` property values, with newest virtual network
// interfaces first. Virtual network interfaces with identical
// `created_at` property values will in turn be sorted by ascending `name` property values.
func (vpc *VpcV1) ListVirtualNetworkInterfaces(listVirtualNetworkInterfacesOptions *ListVirtualNetworkInterfacesOptions) (result *VirtualNetworkInterfaceCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVirtualNetworkInterfacesWithContext(context.Background(), listVirtualNetworkInterfacesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVirtualNetworkInterfacesWithContext is an alternate form of the ListVirtualNetworkInterfaces method which supports a Context parameter
func (vpc *VpcV1) ListVirtualNetworkInterfacesWithContext(ctx context.Context, listVirtualNetworkInterfacesOptions *ListVirtualNetworkInterfacesOptions) (result *VirtualNetworkInterfaceCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listVirtualNetworkInterfacesOptions, "listVirtualNetworkInterfacesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVirtualNetworkInterfaces")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVirtualNetworkInterfacesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVirtualNetworkInterfacesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVirtualNetworkInterfacesOptions.Start))
	}
	if listVirtualNetworkInterfacesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVirtualNetworkInterfacesOptions.Limit))
	}
	if listVirtualNetworkInterfacesOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listVirtualNetworkInterfacesOptions.ResourceGroupID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_virtual_network_interfaces", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVirtualNetworkInterfaceCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateVirtualNetworkInterface : Create a virtual network interface
// This request creates a new virtual network interface from a virtual network interface prototype object. The prototype
// object is structured in the same way as a retrieved virtual network interface, and contains the information necessary
// to create the new virtual network interface.
func (vpc *VpcV1) CreateVirtualNetworkInterface(createVirtualNetworkInterfaceOptions *CreateVirtualNetworkInterfaceOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateVirtualNetworkInterfaceWithContext(context.Background(), createVirtualNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateVirtualNetworkInterfaceWithContext is an alternate form of the CreateVirtualNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) CreateVirtualNetworkInterfaceWithContext(ctx context.Context, createVirtualNetworkInterfaceOptions *CreateVirtualNetworkInterfaceOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createVirtualNetworkInterfaceOptions, "createVirtualNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createVirtualNetworkInterfaceOptions, "createVirtualNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateVirtualNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createVirtualNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createVirtualNetworkInterfaceOptions.AllowIPSpoofing != nil {
		body["allow_ip_spoofing"] = createVirtualNetworkInterfaceOptions.AllowIPSpoofing
	}
	if createVirtualNetworkInterfaceOptions.AutoDelete != nil {
		body["auto_delete"] = createVirtualNetworkInterfaceOptions.AutoDelete
	}
	if createVirtualNetworkInterfaceOptions.EnableInfrastructureNat != nil {
		body["enable_infrastructure_nat"] = createVirtualNetworkInterfaceOptions.EnableInfrastructureNat
	}
	if createVirtualNetworkInterfaceOptions.Ips != nil {
		body["ips"] = createVirtualNetworkInterfaceOptions.Ips
	}
	if createVirtualNetworkInterfaceOptions.Name != nil {
		body["name"] = createVirtualNetworkInterfaceOptions.Name
	}
	if createVirtualNetworkInterfaceOptions.PrimaryIP != nil {
		body["primary_ip"] = createVirtualNetworkInterfaceOptions.PrimaryIP
	}
	if createVirtualNetworkInterfaceOptions.ProtocolStateFilteringMode != nil {
		body["protocol_state_filtering_mode"] = createVirtualNetworkInterfaceOptions.ProtocolStateFilteringMode
	}
	if createVirtualNetworkInterfaceOptions.ResourceGroup != nil {
		body["resource_group"] = createVirtualNetworkInterfaceOptions.ResourceGroup
	}
	if createVirtualNetworkInterfaceOptions.SecurityGroups != nil {
		body["security_groups"] = createVirtualNetworkInterfaceOptions.SecurityGroups
	}
	if createVirtualNetworkInterfaceOptions.Subnet != nil {
		body["subnet"] = createVirtualNetworkInterfaceOptions.Subnet
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_virtual_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVirtualNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVirtualNetworkInterfaces : Delete a virtual network interface
// This request deletes a virtual network interface. This operation cannot be reversed. For this request to succeed, the
// virtual network interface must not be required by another resource, such as the primary network attachment for an
// instance.
func (vpc *VpcV1) DeleteVirtualNetworkInterfaces(deleteVirtualNetworkInterfacesOptions *DeleteVirtualNetworkInterfacesOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteVirtualNetworkInterfacesWithContext(context.Background(), deleteVirtualNetworkInterfacesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVirtualNetworkInterfacesWithContext is an alternate form of the DeleteVirtualNetworkInterfaces method which supports a Context parameter
func (vpc *VpcV1) DeleteVirtualNetworkInterfacesWithContext(ctx context.Context, deleteVirtualNetworkInterfacesOptions *DeleteVirtualNetworkInterfacesOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVirtualNetworkInterfacesOptions, "deleteVirtualNetworkInterfacesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVirtualNetworkInterfacesOptions, "deleteVirtualNetworkInterfacesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteVirtualNetworkInterfacesOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVirtualNetworkInterfaces")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVirtualNetworkInterfacesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_virtual_network_interfaces", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVirtualNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetVirtualNetworkInterface : Retrieve a virtual network interface
// This request retrieves a single virtual network interface specified by the identifier in the URL.
func (vpc *VpcV1) GetVirtualNetworkInterface(getVirtualNetworkInterfaceOptions *GetVirtualNetworkInterfaceOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVirtualNetworkInterfaceWithContext(context.Background(), getVirtualNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVirtualNetworkInterfaceWithContext is an alternate form of the GetVirtualNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) GetVirtualNetworkInterfaceWithContext(ctx context.Context, getVirtualNetworkInterfaceOptions *GetVirtualNetworkInterfaceOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVirtualNetworkInterfaceOptions, "getVirtualNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVirtualNetworkInterfaceOptions, "getVirtualNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getVirtualNetworkInterfaceOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVirtualNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVirtualNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_virtual_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVirtualNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateVirtualNetworkInterface : Update a virtual network interface
// This request updates a virtual network interface with the information in a provided virtual network interface patch.
// The virtual network interface patch object is structured in the same way as a retrieved virtual network interface and
// contains only the information to be updated.
func (vpc *VpcV1) UpdateVirtualNetworkInterface(updateVirtualNetworkInterfaceOptions *UpdateVirtualNetworkInterfaceOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateVirtualNetworkInterfaceWithContext(context.Background(), updateVirtualNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateVirtualNetworkInterfaceWithContext is an alternate form of the UpdateVirtualNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) UpdateVirtualNetworkInterfaceWithContext(ctx context.Context, updateVirtualNetworkInterfaceOptions *UpdateVirtualNetworkInterfaceOptions) (result *VirtualNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateVirtualNetworkInterfaceOptions, "updateVirtualNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateVirtualNetworkInterfaceOptions, "updateVirtualNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateVirtualNetworkInterfaceOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateVirtualNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateVirtualNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateVirtualNetworkInterfaceOptions.VirtualNetworkInterfacePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_virtual_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVirtualNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListNetworkInterfaceFloatingIps : List floating IPs associated with a virtual network interface
// This request lists floating IPs associated with a virtual network interface.
func (vpc *VpcV1) ListNetworkInterfaceFloatingIps(listNetworkInterfaceFloatingIpsOptions *ListNetworkInterfaceFloatingIpsOptions) (result *FloatingIPCollectionVirtualNetworkInterfaceContext, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListNetworkInterfaceFloatingIpsWithContext(context.Background(), listNetworkInterfaceFloatingIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListNetworkInterfaceFloatingIpsWithContext is an alternate form of the ListNetworkInterfaceFloatingIps method which supports a Context parameter
func (vpc *VpcV1) ListNetworkInterfaceFloatingIpsWithContext(ctx context.Context, listNetworkInterfaceFloatingIpsOptions *ListNetworkInterfaceFloatingIpsOptions) (result *FloatingIPCollectionVirtualNetworkInterfaceContext, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listNetworkInterfaceFloatingIpsOptions, "listNetworkInterfaceFloatingIpsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listNetworkInterfaceFloatingIpsOptions, "listNetworkInterfaceFloatingIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *listNetworkInterfaceFloatingIpsOptions.VirtualNetworkInterfaceID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/floating_ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListNetworkInterfaceFloatingIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listNetworkInterfaceFloatingIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listNetworkInterfaceFloatingIpsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listNetworkInterfaceFloatingIpsOptions.Start))
	}
	if listNetworkInterfaceFloatingIpsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listNetworkInterfaceFloatingIpsOptions.Limit))
	}
	if listNetworkInterfaceFloatingIpsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listNetworkInterfaceFloatingIpsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_network_interface_floating_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIPCollectionVirtualNetworkInterfaceContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RemoveNetworkInterfaceFloatingIP : Disassociate a floating IP from a virtual network interface
// This request disassociates the specified floating IP from the specified virtual network interface.
func (vpc *VpcV1) RemoveNetworkInterfaceFloatingIP(removeNetworkInterfaceFloatingIPOptions *RemoveNetworkInterfaceFloatingIPOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RemoveNetworkInterfaceFloatingIPWithContext(context.Background(), removeNetworkInterfaceFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RemoveNetworkInterfaceFloatingIPWithContext is an alternate form of the RemoveNetworkInterfaceFloatingIP method which supports a Context parameter
func (vpc *VpcV1) RemoveNetworkInterfaceFloatingIPWithContext(ctx context.Context, removeNetworkInterfaceFloatingIPOptions *RemoveNetworkInterfaceFloatingIPOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(removeNetworkInterfaceFloatingIPOptions, "removeNetworkInterfaceFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(removeNetworkInterfaceFloatingIPOptions, "removeNetworkInterfaceFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *removeNetworkInterfaceFloatingIPOptions.VirtualNetworkInterfaceID,
		"id":                           *removeNetworkInterfaceFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RemoveNetworkInterfaceFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range removeNetworkInterfaceFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "remove_network_interface_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetNetworkInterfaceFloatingIP : Retrieve associated floating IP
// This request retrieves a specified floating IP if it is associated with the virtual network interface specified in
// the URL.
func (vpc *VpcV1) GetNetworkInterfaceFloatingIP(getNetworkInterfaceFloatingIPOptions *GetNetworkInterfaceFloatingIPOptions) (result *FloatingIPReference, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetNetworkInterfaceFloatingIPWithContext(context.Background(), getNetworkInterfaceFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetNetworkInterfaceFloatingIPWithContext is an alternate form of the GetNetworkInterfaceFloatingIP method which supports a Context parameter
func (vpc *VpcV1) GetNetworkInterfaceFloatingIPWithContext(ctx context.Context, getNetworkInterfaceFloatingIPOptions *GetNetworkInterfaceFloatingIPOptions) (result *FloatingIPReference, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getNetworkInterfaceFloatingIPOptions, "getNetworkInterfaceFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getNetworkInterfaceFloatingIPOptions, "getNetworkInterfaceFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *getNetworkInterfaceFloatingIPOptions.VirtualNetworkInterfaceID,
		"id":                           *getNetworkInterfaceFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetNetworkInterfaceFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getNetworkInterfaceFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_network_interface_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIPReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// AddNetworkInterfaceFloatingIP : Add an association between a floating IP and a virtual network interface
// This request adds an association between the specified floating IP and the specified virtual network interface.
//
// If the virtual network interface has `enable_infrastructure_nat` set to `true`, no more than one floating IP can be
// associated, and network address translation is performed between the floating IP address and the virtual network
// interface's `primary_ip` address.
//
// If the virtual network interface has `enable_infrastructure_nat` set to `false`, packets are passed unchanged to/from
// the virtual network interface.
//
// The floating IP must:
// - be in the same `zone` as the virtual network interface
// - not currently be associated with another resource
//
// The virtual network interface's `target` must not currently be a file share mount target.
//
// A request body is not required, and if provided, is ignored.
func (vpc *VpcV1) AddNetworkInterfaceFloatingIP(addNetworkInterfaceFloatingIPOptions *AddNetworkInterfaceFloatingIPOptions) (result *FloatingIPReference, response *core.DetailedResponse, err error) {
	result, response, err = vpc.AddNetworkInterfaceFloatingIPWithContext(context.Background(), addNetworkInterfaceFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// AddNetworkInterfaceFloatingIPWithContext is an alternate form of the AddNetworkInterfaceFloatingIP method which supports a Context parameter
func (vpc *VpcV1) AddNetworkInterfaceFloatingIPWithContext(ctx context.Context, addNetworkInterfaceFloatingIPOptions *AddNetworkInterfaceFloatingIPOptions) (result *FloatingIPReference, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(addNetworkInterfaceFloatingIPOptions, "addNetworkInterfaceFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(addNetworkInterfaceFloatingIPOptions, "addNetworkInterfaceFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *addNetworkInterfaceFloatingIPOptions.VirtualNetworkInterfaceID,
		"id":                           *addNetworkInterfaceFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "AddNetworkInterfaceFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range addNetworkInterfaceFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "add_network_interface_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIPReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVirtualNetworkInterfaceIps : List reserved IPs bound to a virtual network interface
// This request lists reserved IPs bound to a virtual network interface.
func (vpc *VpcV1) ListVirtualNetworkInterfaceIps(listVirtualNetworkInterfaceIpsOptions *ListVirtualNetworkInterfaceIpsOptions) (result *ReservedIPCollectionVirtualNetworkInterfaceContext, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVirtualNetworkInterfaceIpsWithContext(context.Background(), listVirtualNetworkInterfaceIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVirtualNetworkInterfaceIpsWithContext is an alternate form of the ListVirtualNetworkInterfaceIps method which supports a Context parameter
func (vpc *VpcV1) ListVirtualNetworkInterfaceIpsWithContext(ctx context.Context, listVirtualNetworkInterfaceIpsOptions *ListVirtualNetworkInterfaceIpsOptions) (result *ReservedIPCollectionVirtualNetworkInterfaceContext, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVirtualNetworkInterfaceIpsOptions, "listVirtualNetworkInterfaceIpsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVirtualNetworkInterfaceIpsOptions, "listVirtualNetworkInterfaceIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *listVirtualNetworkInterfaceIpsOptions.VirtualNetworkInterfaceID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVirtualNetworkInterfaceIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVirtualNetworkInterfaceIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVirtualNetworkInterfaceIpsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVirtualNetworkInterfaceIpsOptions.Start))
	}
	if listVirtualNetworkInterfaceIpsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVirtualNetworkInterfaceIpsOptions.Limit))
	}
	if listVirtualNetworkInterfaceIpsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listVirtualNetworkInterfaceIpsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_virtual_network_interface_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIPCollectionVirtualNetworkInterfaceContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RemoveVirtualNetworkInterfaceIP : Unbind a reserved IP from a virtual network interface
// This request unbinds the specified reserved IP from the specified virtual network interface. If the reserved IP has
// `auto_delete` set to `true`, the reserved IP will be deleted.
//
// The reserved IP for the `primary_ip` cannot be unbound.
func (vpc *VpcV1) RemoveVirtualNetworkInterfaceIP(removeVirtualNetworkInterfaceIPOptions *RemoveVirtualNetworkInterfaceIPOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RemoveVirtualNetworkInterfaceIPWithContext(context.Background(), removeVirtualNetworkInterfaceIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RemoveVirtualNetworkInterfaceIPWithContext is an alternate form of the RemoveVirtualNetworkInterfaceIP method which supports a Context parameter
func (vpc *VpcV1) RemoveVirtualNetworkInterfaceIPWithContext(ctx context.Context, removeVirtualNetworkInterfaceIPOptions *RemoveVirtualNetworkInterfaceIPOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(removeVirtualNetworkInterfaceIPOptions, "removeVirtualNetworkInterfaceIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(removeVirtualNetworkInterfaceIPOptions, "removeVirtualNetworkInterfaceIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *removeVirtualNetworkInterfaceIPOptions.VirtualNetworkInterfaceID,
		"id":                           *removeVirtualNetworkInterfaceIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RemoveVirtualNetworkInterfaceIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range removeVirtualNetworkInterfaceIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "remove_virtual_network_interface_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVirtualNetworkInterfaceIP : Retrieve bound reserved IP
// This request retrieves the specified reserved IP address if it is bound to the virtual network interface specified in
// the URL.
func (vpc *VpcV1) GetVirtualNetworkInterfaceIP(getVirtualNetworkInterfaceIPOptions *GetVirtualNetworkInterfaceIPOptions) (result *ReservedIPReference, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVirtualNetworkInterfaceIPWithContext(context.Background(), getVirtualNetworkInterfaceIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVirtualNetworkInterfaceIPWithContext is an alternate form of the GetVirtualNetworkInterfaceIP method which supports a Context parameter
func (vpc *VpcV1) GetVirtualNetworkInterfaceIPWithContext(ctx context.Context, getVirtualNetworkInterfaceIPOptions *GetVirtualNetworkInterfaceIPOptions) (result *ReservedIPReference, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVirtualNetworkInterfaceIPOptions, "getVirtualNetworkInterfaceIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVirtualNetworkInterfaceIPOptions, "getVirtualNetworkInterfaceIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *getVirtualNetworkInterfaceIPOptions.VirtualNetworkInterfaceID,
		"id":                           *getVirtualNetworkInterfaceIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVirtualNetworkInterfaceIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVirtualNetworkInterfaceIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_virtual_network_interface_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIPReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// AddVirtualNetworkInterfaceIP : Bind a reserved IP to a virtual network interface
// This request binds the specified reserved IP to the specified virtual network interface.
//
// The reserved IP must currently be unbound and in the primary IP's subnet. The virtual network interface's `target`
// must not currently be a file share mount target.
func (vpc *VpcV1) AddVirtualNetworkInterfaceIP(addVirtualNetworkInterfaceIPOptions *AddVirtualNetworkInterfaceIPOptions) (result *ReservedIPReference, response *core.DetailedResponse, err error) {
	result, response, err = vpc.AddVirtualNetworkInterfaceIPWithContext(context.Background(), addVirtualNetworkInterfaceIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// AddVirtualNetworkInterfaceIPWithContext is an alternate form of the AddVirtualNetworkInterfaceIP method which supports a Context parameter
func (vpc *VpcV1) AddVirtualNetworkInterfaceIPWithContext(ctx context.Context, addVirtualNetworkInterfaceIPOptions *AddVirtualNetworkInterfaceIPOptions) (result *ReservedIPReference, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(addVirtualNetworkInterfaceIPOptions, "addVirtualNetworkInterfaceIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(addVirtualNetworkInterfaceIPOptions, "addVirtualNetworkInterfaceIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"virtual_network_interface_id": *addVirtualNetworkInterfaceIPOptions.VirtualNetworkInterfaceID,
		"id":                           *addVirtualNetworkInterfaceIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/virtual_network_interfaces/{virtual_network_interface_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "AddVirtualNetworkInterfaceIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range addVirtualNetworkInterfaceIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "add_virtual_network_interface_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIPReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListClusterNetworkProfiles : List cluster network profiles
// This request lists cluster network profiles available in the region. A cluster network profile specifies the
// performance characteristics and capabilities for a cluster network.
func (vpc *VpcV1) ListClusterNetworkProfiles(listClusterNetworkProfilesOptions *ListClusterNetworkProfilesOptions) (result *ClusterNetworkProfileCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListClusterNetworkProfilesWithContext(context.Background(), listClusterNetworkProfilesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListClusterNetworkProfilesWithContext is an alternate form of the ListClusterNetworkProfiles method which supports a Context parameter
func (vpc *VpcV1) ListClusterNetworkProfilesWithContext(ctx context.Context, listClusterNetworkProfilesOptions *ListClusterNetworkProfilesOptions) (result *ClusterNetworkProfileCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listClusterNetworkProfilesOptions, "listClusterNetworkProfilesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_network/profiles`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListClusterNetworkProfiles")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listClusterNetworkProfilesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listClusterNetworkProfilesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listClusterNetworkProfilesOptions.Start))
	}
	if listClusterNetworkProfilesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listClusterNetworkProfilesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_cluster_network_profiles", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkProfileCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetClusterNetworkProfile : Retrieve a cluster network profile
// This request retrieves a single cluster network profile specified by the name in the URL.
func (vpc *VpcV1) GetClusterNetworkProfile(getClusterNetworkProfileOptions *GetClusterNetworkProfileOptions) (result *ClusterNetworkProfile, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetClusterNetworkProfileWithContext(context.Background(), getClusterNetworkProfileOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetClusterNetworkProfileWithContext is an alternate form of the GetClusterNetworkProfile method which supports a Context parameter
func (vpc *VpcV1) GetClusterNetworkProfileWithContext(ctx context.Context, getClusterNetworkProfileOptions *GetClusterNetworkProfileOptions) (result *ClusterNetworkProfile, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getClusterNetworkProfileOptions, "getClusterNetworkProfileOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getClusterNetworkProfileOptions, "getClusterNetworkProfileOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"name": *getClusterNetworkProfileOptions.Name,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_network/profiles/{name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetClusterNetworkProfile")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getClusterNetworkProfileOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_cluster_network_profile", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkProfile)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListClusterNetworks : List cluster networks
// This request lists [cluster networks](https://cloud.ibm.com/docs/vpc?topic=vpc-about-cluster-network) in the region.
// A cluster network is a grouping of resources in a separate networking space for high performance computing and
// networking.
func (vpc *VpcV1) ListClusterNetworks(listClusterNetworksOptions *ListClusterNetworksOptions) (result *ClusterNetworkCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListClusterNetworksWithContext(context.Background(), listClusterNetworksOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListClusterNetworksWithContext is an alternate form of the ListClusterNetworks method which supports a Context parameter
func (vpc *VpcV1) ListClusterNetworksWithContext(ctx context.Context, listClusterNetworksOptions *ListClusterNetworksOptions) (result *ClusterNetworkCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listClusterNetworksOptions, "listClusterNetworksOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListClusterNetworks")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listClusterNetworksOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listClusterNetworksOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listClusterNetworksOptions.Start))
	}
	if listClusterNetworksOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listClusterNetworksOptions.Limit))
	}
	if listClusterNetworksOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listClusterNetworksOptions.ResourceGroupID))
	}
	if listClusterNetworksOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listClusterNetworksOptions.Name))
	}
	if listClusterNetworksOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listClusterNetworksOptions.Sort))
	}
	if listClusterNetworksOptions.VPCID != nil {
		builder.AddQuery("vpc.id", fmt.Sprint(*listClusterNetworksOptions.VPCID))
	}
	if listClusterNetworksOptions.VPCCRN != nil {
		builder.AddQuery("vpc.crn", fmt.Sprint(*listClusterNetworksOptions.VPCCRN))
	}
	if listClusterNetworksOptions.VPCName != nil {
		builder.AddQuery("vpc.name", fmt.Sprint(*listClusterNetworksOptions.VPCName))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_cluster_networks", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateClusterNetwork : Create a cluster network
// This request creates a new cluster network from a cluster network prototype object. The prototype object is
// structured in the same way as a retrieved cluster network, and contains the information necessary to create the new
// cluster network.
func (vpc *VpcV1) CreateClusterNetwork(createClusterNetworkOptions *CreateClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateClusterNetworkWithContext(context.Background(), createClusterNetworkOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateClusterNetworkWithContext is an alternate form of the CreateClusterNetwork method which supports a Context parameter
func (vpc *VpcV1) CreateClusterNetworkWithContext(ctx context.Context, createClusterNetworkOptions *CreateClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createClusterNetworkOptions, "createClusterNetworkOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createClusterNetworkOptions, "createClusterNetworkOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateClusterNetwork")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createClusterNetworkOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createClusterNetworkOptions.Profile != nil {
		body["profile"] = createClusterNetworkOptions.Profile
	}
	if createClusterNetworkOptions.VPC != nil {
		body["vpc"] = createClusterNetworkOptions.VPC
	}
	if createClusterNetworkOptions.Zone != nil {
		body["zone"] = createClusterNetworkOptions.Zone
	}
	if createClusterNetworkOptions.Name != nil {
		body["name"] = createClusterNetworkOptions.Name
	}
	if createClusterNetworkOptions.ResourceGroup != nil {
		body["resource_group"] = createClusterNetworkOptions.ResourceGroup
	}
	if createClusterNetworkOptions.SubnetPrefixes != nil {
		body["subnet_prefixes"] = createClusterNetworkOptions.SubnetPrefixes
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_cluster_network", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetwork)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListClusterNetworkInterfaces : List cluster network interfaces
// This request lists cluster network interfaces in the region. A cluster network interface is a logical abstraction of
// a cluster network interface in a subnet, and may be attached to a target resource.
//
// The cluster network interfaces will be sorted by their `created_at` property values, with newest cluster network
// interfaces first. Cluster network interfaces with identical
// `created_at` property values will in turn be sorted by ascending `name` property values.
func (vpc *VpcV1) ListClusterNetworkInterfaces(listClusterNetworkInterfacesOptions *ListClusterNetworkInterfacesOptions) (result *ClusterNetworkInterfaceCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListClusterNetworkInterfacesWithContext(context.Background(), listClusterNetworkInterfacesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListClusterNetworkInterfacesWithContext is an alternate form of the ListClusterNetworkInterfaces method which supports a Context parameter
func (vpc *VpcV1) ListClusterNetworkInterfacesWithContext(ctx context.Context, listClusterNetworkInterfacesOptions *ListClusterNetworkInterfacesOptions) (result *ClusterNetworkInterfaceCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listClusterNetworkInterfacesOptions, "listClusterNetworkInterfacesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listClusterNetworkInterfacesOptions, "listClusterNetworkInterfacesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *listClusterNetworkInterfacesOptions.ClusterNetworkID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/interfaces`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListClusterNetworkInterfaces")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listClusterNetworkInterfacesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listClusterNetworkInterfacesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listClusterNetworkInterfacesOptions.Start))
	}
	if listClusterNetworkInterfacesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listClusterNetworkInterfacesOptions.Limit))
	}
	if listClusterNetworkInterfacesOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listClusterNetworkInterfacesOptions.Name))
	}
	if listClusterNetworkInterfacesOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listClusterNetworkInterfacesOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_cluster_network_interfaces", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkInterfaceCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateClusterNetworkInterface : Create a cluster network interface
// This request creates a new cluster network interface from a cluster network interface prototype object. The prototype
// object is structured in the same way as a retrieved cluster network interface, and contains the information necessary
// to create the new cluster network interface.
func (vpc *VpcV1) CreateClusterNetworkInterface(createClusterNetworkInterfaceOptions *CreateClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateClusterNetworkInterfaceWithContext(context.Background(), createClusterNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateClusterNetworkInterfaceWithContext is an alternate form of the CreateClusterNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) CreateClusterNetworkInterfaceWithContext(ctx context.Context, createClusterNetworkInterfaceOptions *CreateClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createClusterNetworkInterfaceOptions, "createClusterNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createClusterNetworkInterfaceOptions, "createClusterNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *createClusterNetworkInterfaceOptions.ClusterNetworkID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/interfaces`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateClusterNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createClusterNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createClusterNetworkInterfaceOptions.Name != nil {
		body["name"] = createClusterNetworkInterfaceOptions.Name
	}
	if createClusterNetworkInterfaceOptions.PrimaryIP != nil {
		body["primary_ip"] = createClusterNetworkInterfaceOptions.PrimaryIP
	}
	if createClusterNetworkInterfaceOptions.Subnet != nil {
		body["subnet"] = createClusterNetworkInterfaceOptions.Subnet
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_cluster_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteClusterNetworkInterface : Delete a cluster network interface
// This request deletes a cluster network interface. This operation cannot be reversed. For this request to succeed,
// the cluster network interface must not be required by another resource, such as a cluster network attachment for a
// virtual server instance.
func (vpc *VpcV1) DeleteClusterNetworkInterface(deleteClusterNetworkInterfaceOptions *DeleteClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteClusterNetworkInterfaceWithContext(context.Background(), deleteClusterNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteClusterNetworkInterfaceWithContext is an alternate form of the DeleteClusterNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) DeleteClusterNetworkInterfaceWithContext(ctx context.Context, deleteClusterNetworkInterfaceOptions *DeleteClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteClusterNetworkInterfaceOptions, "deleteClusterNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteClusterNetworkInterfaceOptions, "deleteClusterNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *deleteClusterNetworkInterfaceOptions.ClusterNetworkID,
		"id":                 *deleteClusterNetworkInterfaceOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/interfaces/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteClusterNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteClusterNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteClusterNetworkInterfaceOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteClusterNetworkInterfaceOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_cluster_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetClusterNetworkInterface : Retrieve a cluster network interface
// This request retrieves a single cluster network interface specified by the identifier in the URL.
func (vpc *VpcV1) GetClusterNetworkInterface(getClusterNetworkInterfaceOptions *GetClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetClusterNetworkInterfaceWithContext(context.Background(), getClusterNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetClusterNetworkInterfaceWithContext is an alternate form of the GetClusterNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) GetClusterNetworkInterfaceWithContext(ctx context.Context, getClusterNetworkInterfaceOptions *GetClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getClusterNetworkInterfaceOptions, "getClusterNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getClusterNetworkInterfaceOptions, "getClusterNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *getClusterNetworkInterfaceOptions.ClusterNetworkID,
		"id":                 *getClusterNetworkInterfaceOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/interfaces/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetClusterNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getClusterNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_cluster_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateClusterNetworkInterface : Update a cluster network interface
// This request updates a cluster network interface with the information provided in a cluster network interface patch
// object. The patch object is structured in the same way as a retrieved cluster network interface and needs to contain
// only the information to be updated.
func (vpc *VpcV1) UpdateClusterNetworkInterface(updateClusterNetworkInterfaceOptions *UpdateClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateClusterNetworkInterfaceWithContext(context.Background(), updateClusterNetworkInterfaceOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateClusterNetworkInterfaceWithContext is an alternate form of the UpdateClusterNetworkInterface method which supports a Context parameter
func (vpc *VpcV1) UpdateClusterNetworkInterfaceWithContext(ctx context.Context, updateClusterNetworkInterfaceOptions *UpdateClusterNetworkInterfaceOptions) (result *ClusterNetworkInterface, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateClusterNetworkInterfaceOptions, "updateClusterNetworkInterfaceOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateClusterNetworkInterfaceOptions, "updateClusterNetworkInterfaceOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *updateClusterNetworkInterfaceOptions.ClusterNetworkID,
		"id":                 *updateClusterNetworkInterfaceOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/interfaces/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateClusterNetworkInterface")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateClusterNetworkInterfaceOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateClusterNetworkInterfaceOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateClusterNetworkInterfaceOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateClusterNetworkInterfaceOptions.ClusterNetworkInterfacePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_cluster_network_interface", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkInterface)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListClusterNetworkSubnets : List cluster network subnets
// This request lists cluster network subnets in the cluster network. A cluster network subnet provides network routing
// between other cluster network subnets within a cluster network.
func (vpc *VpcV1) ListClusterNetworkSubnets(listClusterNetworkSubnetsOptions *ListClusterNetworkSubnetsOptions) (result *ClusterNetworkSubnetCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListClusterNetworkSubnetsWithContext(context.Background(), listClusterNetworkSubnetsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListClusterNetworkSubnetsWithContext is an alternate form of the ListClusterNetworkSubnets method which supports a Context parameter
func (vpc *VpcV1) ListClusterNetworkSubnetsWithContext(ctx context.Context, listClusterNetworkSubnetsOptions *ListClusterNetworkSubnetsOptions) (result *ClusterNetworkSubnetCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listClusterNetworkSubnetsOptions, "listClusterNetworkSubnetsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listClusterNetworkSubnetsOptions, "listClusterNetworkSubnetsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *listClusterNetworkSubnetsOptions.ClusterNetworkID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListClusterNetworkSubnets")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listClusterNetworkSubnetsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listClusterNetworkSubnetsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listClusterNetworkSubnetsOptions.Start))
	}
	if listClusterNetworkSubnetsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listClusterNetworkSubnetsOptions.Limit))
	}
	if listClusterNetworkSubnetsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listClusterNetworkSubnetsOptions.Name))
	}
	if listClusterNetworkSubnetsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listClusterNetworkSubnetsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_cluster_network_subnets", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnetCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateClusterNetworkSubnet : Create a cluster network subnet
// This request creates a new cluster network subnet from a cluster network subnet prototype object. The prototype
// object is structured in the same way as a retrieved cluster network subnet, and contains the information necessary to
// create the new cluster network subnet.
func (vpc *VpcV1) CreateClusterNetworkSubnet(createClusterNetworkSubnetOptions *CreateClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateClusterNetworkSubnetWithContext(context.Background(), createClusterNetworkSubnetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateClusterNetworkSubnetWithContext is an alternate form of the CreateClusterNetworkSubnet method which supports a Context parameter
func (vpc *VpcV1) CreateClusterNetworkSubnetWithContext(ctx context.Context, createClusterNetworkSubnetOptions *CreateClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createClusterNetworkSubnetOptions, "createClusterNetworkSubnetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createClusterNetworkSubnetOptions, "createClusterNetworkSubnetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *createClusterNetworkSubnetOptions.ClusterNetworkID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateClusterNetworkSubnet")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createClusterNetworkSubnetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createClusterNetworkSubnetOptions.ClusterNetworkSubnetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_cluster_network_subnet", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnet)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListClusterNetworkSubnetReservedIps : List cluster network subnet reserved IPs
// This request lists cluster network subnet reserved IPs in the cluster network.
func (vpc *VpcV1) ListClusterNetworkSubnetReservedIps(listClusterNetworkSubnetReservedIpsOptions *ListClusterNetworkSubnetReservedIpsOptions) (result *ClusterNetworkSubnetReservedIPCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListClusterNetworkSubnetReservedIpsWithContext(context.Background(), listClusterNetworkSubnetReservedIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListClusterNetworkSubnetReservedIpsWithContext is an alternate form of the ListClusterNetworkSubnetReservedIps method which supports a Context parameter
func (vpc *VpcV1) ListClusterNetworkSubnetReservedIpsWithContext(ctx context.Context, listClusterNetworkSubnetReservedIpsOptions *ListClusterNetworkSubnetReservedIpsOptions) (result *ClusterNetworkSubnetReservedIPCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listClusterNetworkSubnetReservedIpsOptions, "listClusterNetworkSubnetReservedIpsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listClusterNetworkSubnetReservedIpsOptions, "listClusterNetworkSubnetReservedIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id":        *listClusterNetworkSubnetReservedIpsOptions.ClusterNetworkID,
		"cluster_network_subnet_id": *listClusterNetworkSubnetReservedIpsOptions.ClusterNetworkSubnetID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{cluster_network_subnet_id}/reserved_ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListClusterNetworkSubnetReservedIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listClusterNetworkSubnetReservedIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listClusterNetworkSubnetReservedIpsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listClusterNetworkSubnetReservedIpsOptions.Start))
	}
	if listClusterNetworkSubnetReservedIpsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listClusterNetworkSubnetReservedIpsOptions.Limit))
	}
	if listClusterNetworkSubnetReservedIpsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listClusterNetworkSubnetReservedIpsOptions.Name))
	}
	if listClusterNetworkSubnetReservedIpsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listClusterNetworkSubnetReservedIpsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_cluster_network_subnet_reserved_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnetReservedIPCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateClusterNetworkSubnetReservedIP : Create a cluster network subnet reserved IP
// This request creates a new cluster network subnet reserved IP from a cluster network subnet reserved IP prototype
// object. The prototype object is structured in the same way as a retrieved cluster network subnet reserved IP, and
// contains the information necessary to create the new cluster network subnet reserved IP.
func (vpc *VpcV1) CreateClusterNetworkSubnetReservedIP(createClusterNetworkSubnetReservedIPOptions *CreateClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateClusterNetworkSubnetReservedIPWithContext(context.Background(), createClusterNetworkSubnetReservedIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateClusterNetworkSubnetReservedIPWithContext is an alternate form of the CreateClusterNetworkSubnetReservedIP method which supports a Context parameter
func (vpc *VpcV1) CreateClusterNetworkSubnetReservedIPWithContext(ctx context.Context, createClusterNetworkSubnetReservedIPOptions *CreateClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createClusterNetworkSubnetReservedIPOptions, "createClusterNetworkSubnetReservedIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createClusterNetworkSubnetReservedIPOptions, "createClusterNetworkSubnetReservedIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id":        *createClusterNetworkSubnetReservedIPOptions.ClusterNetworkID,
		"cluster_network_subnet_id": *createClusterNetworkSubnetReservedIPOptions.ClusterNetworkSubnetID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{cluster_network_subnet_id}/reserved_ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateClusterNetworkSubnetReservedIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createClusterNetworkSubnetReservedIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createClusterNetworkSubnetReservedIPOptions.Address != nil {
		body["address"] = createClusterNetworkSubnetReservedIPOptions.Address
	}
	if createClusterNetworkSubnetReservedIPOptions.Name != nil {
		body["name"] = createClusterNetworkSubnetReservedIPOptions.Name
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_cluster_network_subnet_reserved_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnetReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteClusterNetworkSubnetReservedIP : Delete a cluster network subnet reserved IP
// This request deletes a cluster network subnet reserved IP. This operation cannot be reversed.
//
// For this request to succeed, the reserved IP must be unbound. A provider-owned reserved IP is not allowed to be
// deleted.
func (vpc *VpcV1) DeleteClusterNetworkSubnetReservedIP(deleteClusterNetworkSubnetReservedIPOptions *DeleteClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteClusterNetworkSubnetReservedIPWithContext(context.Background(), deleteClusterNetworkSubnetReservedIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteClusterNetworkSubnetReservedIPWithContext is an alternate form of the DeleteClusterNetworkSubnetReservedIP method which supports a Context parameter
func (vpc *VpcV1) DeleteClusterNetworkSubnetReservedIPWithContext(ctx context.Context, deleteClusterNetworkSubnetReservedIPOptions *DeleteClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteClusterNetworkSubnetReservedIPOptions, "deleteClusterNetworkSubnetReservedIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteClusterNetworkSubnetReservedIPOptions, "deleteClusterNetworkSubnetReservedIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id":        *deleteClusterNetworkSubnetReservedIPOptions.ClusterNetworkID,
		"cluster_network_subnet_id": *deleteClusterNetworkSubnetReservedIPOptions.ClusterNetworkSubnetID,
		"id":                        *deleteClusterNetworkSubnetReservedIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{cluster_network_subnet_id}/reserved_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteClusterNetworkSubnetReservedIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteClusterNetworkSubnetReservedIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteClusterNetworkSubnetReservedIPOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteClusterNetworkSubnetReservedIPOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_cluster_network_subnet_reserved_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnetReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetClusterNetworkSubnetReservedIP : Retrieve a cluster network subnet reserved IP
// This request retrieves a single cluster network subnet reserved IP specified by the identifier in the URL.
func (vpc *VpcV1) GetClusterNetworkSubnetReservedIP(getClusterNetworkSubnetReservedIPOptions *GetClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetClusterNetworkSubnetReservedIPWithContext(context.Background(), getClusterNetworkSubnetReservedIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetClusterNetworkSubnetReservedIPWithContext is an alternate form of the GetClusterNetworkSubnetReservedIP method which supports a Context parameter
func (vpc *VpcV1) GetClusterNetworkSubnetReservedIPWithContext(ctx context.Context, getClusterNetworkSubnetReservedIPOptions *GetClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getClusterNetworkSubnetReservedIPOptions, "getClusterNetworkSubnetReservedIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getClusterNetworkSubnetReservedIPOptions, "getClusterNetworkSubnetReservedIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id":        *getClusterNetworkSubnetReservedIPOptions.ClusterNetworkID,
		"cluster_network_subnet_id": *getClusterNetworkSubnetReservedIPOptions.ClusterNetworkSubnetID,
		"id":                        *getClusterNetworkSubnetReservedIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{cluster_network_subnet_id}/reserved_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetClusterNetworkSubnetReservedIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getClusterNetworkSubnetReservedIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_cluster_network_subnet_reserved_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnetReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateClusterNetworkSubnetReservedIP : Update a cluster network subnet reserved IP
// This request updates a cluster network subnet reserved IP with the information provided in a cluster network subnet
// reserved IP patch object. The patch object is structured in the same way as a retrieved cluster network subnet
// reserved IP and needs to contain only the information to be updated.
func (vpc *VpcV1) UpdateClusterNetworkSubnetReservedIP(updateClusterNetworkSubnetReservedIPOptions *UpdateClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateClusterNetworkSubnetReservedIPWithContext(context.Background(), updateClusterNetworkSubnetReservedIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateClusterNetworkSubnetReservedIPWithContext is an alternate form of the UpdateClusterNetworkSubnetReservedIP method which supports a Context parameter
func (vpc *VpcV1) UpdateClusterNetworkSubnetReservedIPWithContext(ctx context.Context, updateClusterNetworkSubnetReservedIPOptions *UpdateClusterNetworkSubnetReservedIPOptions) (result *ClusterNetworkSubnetReservedIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateClusterNetworkSubnetReservedIPOptions, "updateClusterNetworkSubnetReservedIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateClusterNetworkSubnetReservedIPOptions, "updateClusterNetworkSubnetReservedIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id":        *updateClusterNetworkSubnetReservedIPOptions.ClusterNetworkID,
		"cluster_network_subnet_id": *updateClusterNetworkSubnetReservedIPOptions.ClusterNetworkSubnetID,
		"id":                        *updateClusterNetworkSubnetReservedIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{cluster_network_subnet_id}/reserved_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateClusterNetworkSubnetReservedIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateClusterNetworkSubnetReservedIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateClusterNetworkSubnetReservedIPOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateClusterNetworkSubnetReservedIPOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateClusterNetworkSubnetReservedIPOptions.ClusterNetworkSubnetReservedIPPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_cluster_network_subnet_reserved_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnetReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteClusterNetworkSubnet : Delete a cluster network subnet
// This request deletes a cluster network subnet. This operation cannot be reversed.
//
// For this request to succeed, this cluster subnet must not be attached to a cluster network interface.
func (vpc *VpcV1) DeleteClusterNetworkSubnet(deleteClusterNetworkSubnetOptions *DeleteClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteClusterNetworkSubnetWithContext(context.Background(), deleteClusterNetworkSubnetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteClusterNetworkSubnetWithContext is an alternate form of the DeleteClusterNetworkSubnet method which supports a Context parameter
func (vpc *VpcV1) DeleteClusterNetworkSubnetWithContext(ctx context.Context, deleteClusterNetworkSubnetOptions *DeleteClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteClusterNetworkSubnetOptions, "deleteClusterNetworkSubnetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteClusterNetworkSubnetOptions, "deleteClusterNetworkSubnetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *deleteClusterNetworkSubnetOptions.ClusterNetworkID,
		"id":                 *deleteClusterNetworkSubnetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteClusterNetworkSubnet")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteClusterNetworkSubnetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteClusterNetworkSubnetOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteClusterNetworkSubnetOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_cluster_network_subnet", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnet)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetClusterNetworkSubnet : Retrieve a cluster network subnet
// This request retrieves a single cluster network subnet specified by the identifier in the URL.
func (vpc *VpcV1) GetClusterNetworkSubnet(getClusterNetworkSubnetOptions *GetClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetClusterNetworkSubnetWithContext(context.Background(), getClusterNetworkSubnetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetClusterNetworkSubnetWithContext is an alternate form of the GetClusterNetworkSubnet method which supports a Context parameter
func (vpc *VpcV1) GetClusterNetworkSubnetWithContext(ctx context.Context, getClusterNetworkSubnetOptions *GetClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getClusterNetworkSubnetOptions, "getClusterNetworkSubnetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getClusterNetworkSubnetOptions, "getClusterNetworkSubnetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *getClusterNetworkSubnetOptions.ClusterNetworkID,
		"id":                 *getClusterNetworkSubnetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetClusterNetworkSubnet")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getClusterNetworkSubnetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_cluster_network_subnet", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnet)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateClusterNetworkSubnet : Update a cluster network subnet
// This request updates a cluster network subnet with the information provided in a cluster network subnet patch object.
// The patch object is structured in the same way as a retrieved cluster network subnet and needs to contain only the
// information to be updated.
func (vpc *VpcV1) UpdateClusterNetworkSubnet(updateClusterNetworkSubnetOptions *UpdateClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateClusterNetworkSubnetWithContext(context.Background(), updateClusterNetworkSubnetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateClusterNetworkSubnetWithContext is an alternate form of the UpdateClusterNetworkSubnet method which supports a Context parameter
func (vpc *VpcV1) UpdateClusterNetworkSubnetWithContext(ctx context.Context, updateClusterNetworkSubnetOptions *UpdateClusterNetworkSubnetOptions) (result *ClusterNetworkSubnet, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateClusterNetworkSubnetOptions, "updateClusterNetworkSubnetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateClusterNetworkSubnetOptions, "updateClusterNetworkSubnetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"cluster_network_id": *updateClusterNetworkSubnetOptions.ClusterNetworkID,
		"id":                 *updateClusterNetworkSubnetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{cluster_network_id}/subnets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateClusterNetworkSubnet")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateClusterNetworkSubnetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateClusterNetworkSubnetOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateClusterNetworkSubnetOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateClusterNetworkSubnetOptions.ClusterNetworkSubnetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_cluster_network_subnet", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetworkSubnet)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteClusterNetwork : Delete a cluster network
// This request deletes a cluster network. This operation cannot be reversed.
//
// For this request to succeed, virtual server instances must not reside in this cluster network.
func (vpc *VpcV1) DeleteClusterNetwork(deleteClusterNetworkOptions *DeleteClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeleteClusterNetworkWithContext(context.Background(), deleteClusterNetworkOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteClusterNetworkWithContext is an alternate form of the DeleteClusterNetwork method which supports a Context parameter
func (vpc *VpcV1) DeleteClusterNetworkWithContext(ctx context.Context, deleteClusterNetworkOptions *DeleteClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteClusterNetworkOptions, "deleteClusterNetworkOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteClusterNetworkOptions, "deleteClusterNetworkOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteClusterNetworkOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteClusterNetwork")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteClusterNetworkOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	if deleteClusterNetworkOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteClusterNetworkOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_cluster_network", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetwork)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetClusterNetwork : Retrieve a cluster network
// This request retrieves a single cluster network specified by the identifier in the URL.
func (vpc *VpcV1) GetClusterNetwork(getClusterNetworkOptions *GetClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetClusterNetworkWithContext(context.Background(), getClusterNetworkOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetClusterNetworkWithContext is an alternate form of the GetClusterNetwork method which supports a Context parameter
func (vpc *VpcV1) GetClusterNetworkWithContext(ctx context.Context, getClusterNetworkOptions *GetClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getClusterNetworkOptions, "getClusterNetworkOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getClusterNetworkOptions, "getClusterNetworkOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getClusterNetworkOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetClusterNetwork")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getClusterNetworkOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_cluster_network", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetwork)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateClusterNetwork : Update a cluster
// This request updates a cluster network with the information provided in a cluster network patch object. The patch
// object is structured in the same way as a retrieved cluster network and needs to contain only the information to be
// updated.
func (vpc *VpcV1) UpdateClusterNetwork(updateClusterNetworkOptions *UpdateClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateClusterNetworkWithContext(context.Background(), updateClusterNetworkOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateClusterNetworkWithContext is an alternate form of the UpdateClusterNetwork method which supports a Context parameter
func (vpc *VpcV1) UpdateClusterNetworkWithContext(ctx context.Context, updateClusterNetworkOptions *UpdateClusterNetworkOptions) (result *ClusterNetwork, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateClusterNetworkOptions, "updateClusterNetworkOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateClusterNetworkOptions, "updateClusterNetworkOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateClusterNetworkOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/cluster_networks/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateClusterNetwork")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateClusterNetworkOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateClusterNetworkOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateClusterNetworkOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateClusterNetworkOptions.ClusterNetworkPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_cluster_network", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalClusterNetwork)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListPublicGateways : List public gateways
// This request lists public gateways in the region. A public gateway is a virtual network device associated with a VPC,
// which allows access to the Internet. A public gateway resides in a zone and can be connected to subnets in the same
// zone only.
func (vpc *VpcV1) ListPublicGateways(listPublicGatewaysOptions *ListPublicGatewaysOptions) (result *PublicGatewayCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListPublicGatewaysWithContext(context.Background(), listPublicGatewaysOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListPublicGatewaysWithContext is an alternate form of the ListPublicGateways method which supports a Context parameter
func (vpc *VpcV1) ListPublicGatewaysWithContext(ctx context.Context, listPublicGatewaysOptions *ListPublicGatewaysOptions) (result *PublicGatewayCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listPublicGatewaysOptions, "listPublicGatewaysOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListPublicGateways")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listPublicGatewaysOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listPublicGatewaysOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listPublicGatewaysOptions.Start))
	}
	if listPublicGatewaysOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listPublicGatewaysOptions.Limit))
	}
	if listPublicGatewaysOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listPublicGatewaysOptions.ResourceGroupID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_public_gateways", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicGatewayCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreatePublicGateway : Create a public gateway
// This request creates a new public gateway from a public gateway prototype object. For this to succeed, the VPC must
// not already have a public gateway in the specified zone.
//
// If a floating IP is provided, it must be unbound. If a floating IP is not provided, one will be created and bound to
// the public gateway. Once a public gateway has been created, its floating IP cannot be unbound. A public gateway must
// be explicitly attached to each subnet it will provide connectivity for.
func (vpc *VpcV1) CreatePublicGateway(createPublicGatewayOptions *CreatePublicGatewayOptions) (result *PublicGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreatePublicGatewayWithContext(context.Background(), createPublicGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreatePublicGatewayWithContext is an alternate form of the CreatePublicGateway method which supports a Context parameter
func (vpc *VpcV1) CreatePublicGatewayWithContext(ctx context.Context, createPublicGatewayOptions *CreatePublicGatewayOptions) (result *PublicGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createPublicGatewayOptions, "createPublicGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createPublicGatewayOptions, "createPublicGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreatePublicGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createPublicGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createPublicGatewayOptions.VPC != nil {
		body["vpc"] = createPublicGatewayOptions.VPC
	}
	if createPublicGatewayOptions.Zone != nil {
		body["zone"] = createPublicGatewayOptions.Zone
	}
	if createPublicGatewayOptions.FloatingIP != nil {
		body["floating_ip"] = createPublicGatewayOptions.FloatingIP
	}
	if createPublicGatewayOptions.Name != nil {
		body["name"] = createPublicGatewayOptions.Name
	}
	if createPublicGatewayOptions.ResourceGroup != nil {
		body["resource_group"] = createPublicGatewayOptions.ResourceGroup
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_public_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeletePublicGateway : Delete a public gateway
// This request deletes a public gateway. This operation cannot be reversed. For this request to succeed, the public
// gateway must not be attached to any subnets. The public gateway's floating IP will be automatically unbound. If the
// floating IP was created when the public gateway was created, it will be deleted.
func (vpc *VpcV1) DeletePublicGateway(deletePublicGatewayOptions *DeletePublicGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeletePublicGatewayWithContext(context.Background(), deletePublicGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeletePublicGatewayWithContext is an alternate form of the DeletePublicGateway method which supports a Context parameter
func (vpc *VpcV1) DeletePublicGatewayWithContext(ctx context.Context, deletePublicGatewayOptions *DeletePublicGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deletePublicGatewayOptions, "deletePublicGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deletePublicGatewayOptions, "deletePublicGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deletePublicGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeletePublicGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deletePublicGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_public_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetPublicGateway : Retrieve a public gateway
// This request retrieves a single public gateway specified by the identifier in the URL.
func (vpc *VpcV1) GetPublicGateway(getPublicGatewayOptions *GetPublicGatewayOptions) (result *PublicGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetPublicGatewayWithContext(context.Background(), getPublicGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetPublicGatewayWithContext is an alternate form of the GetPublicGateway method which supports a Context parameter
func (vpc *VpcV1) GetPublicGatewayWithContext(ctx context.Context, getPublicGatewayOptions *GetPublicGatewayOptions) (result *PublicGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getPublicGatewayOptions, "getPublicGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getPublicGatewayOptions, "getPublicGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getPublicGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetPublicGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getPublicGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_public_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdatePublicGateway : Update a public gateway
// This request updates a public gateway's name.
func (vpc *VpcV1) UpdatePublicGateway(updatePublicGatewayOptions *UpdatePublicGatewayOptions) (result *PublicGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdatePublicGatewayWithContext(context.Background(), updatePublicGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdatePublicGatewayWithContext is an alternate form of the UpdatePublicGateway method which supports a Context parameter
func (vpc *VpcV1) UpdatePublicGatewayWithContext(ctx context.Context, updatePublicGatewayOptions *UpdatePublicGatewayOptions) (result *PublicGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updatePublicGatewayOptions, "updatePublicGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updatePublicGatewayOptions, "updatePublicGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updatePublicGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdatePublicGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updatePublicGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updatePublicGatewayOptions.PublicGatewayPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_public_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListFloatingIps : List floating IPs
// This request lists floating IPs in the region. Floating IPs allow inbound and outbound traffic from the Internet to
// an instance.
func (vpc *VpcV1) ListFloatingIps(listFloatingIpsOptions *ListFloatingIpsOptions) (result *FloatingIPCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListFloatingIpsWithContext(context.Background(), listFloatingIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListFloatingIpsWithContext is an alternate form of the ListFloatingIps method which supports a Context parameter
func (vpc *VpcV1) ListFloatingIpsWithContext(ctx context.Context, listFloatingIpsOptions *ListFloatingIpsOptions) (result *FloatingIPCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listFloatingIpsOptions, "listFloatingIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/floating_ips`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListFloatingIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listFloatingIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listFloatingIpsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listFloatingIpsOptions.Start))
	}
	if listFloatingIpsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listFloatingIpsOptions.Limit))
	}
	if listFloatingIpsOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listFloatingIpsOptions.ResourceGroupID))
	}
	if listFloatingIpsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listFloatingIpsOptions.Sort))
	}
	if listFloatingIpsOptions.TargetID != nil {
		builder.AddQuery("target.id", fmt.Sprint(*listFloatingIpsOptions.TargetID))
	}
	if listFloatingIpsOptions.TargetCRN != nil {
		builder.AddQuery("target.crn", fmt.Sprint(*listFloatingIpsOptions.TargetCRN))
	}
	if listFloatingIpsOptions.TargetName != nil {
		builder.AddQuery("target.name", fmt.Sprint(*listFloatingIpsOptions.TargetName))
	}
	if listFloatingIpsOptions.TargetResourceType != nil {
		builder.AddQuery("target.resource_type", fmt.Sprint(*listFloatingIpsOptions.TargetResourceType))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_floating_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIPCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateFloatingIP : Reserve a floating IP
// This request reserves a new floating IP.
func (vpc *VpcV1) CreateFloatingIP(createFloatingIPOptions *CreateFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateFloatingIPWithContext(context.Background(), createFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateFloatingIPWithContext is an alternate form of the CreateFloatingIP method which supports a Context parameter
func (vpc *VpcV1) CreateFloatingIPWithContext(ctx context.Context, createFloatingIPOptions *CreateFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createFloatingIPOptions, "createFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createFloatingIPOptions, "createFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/floating_ips`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createFloatingIPOptions.FloatingIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteFloatingIP : Delete a floating IP
// This request disassociates (if associated) and releases a floating IP. This operation cannot be reversed. For this
// request to succeed, the floating IP must not be required by another resource, such as a public gateway.
func (vpc *VpcV1) DeleteFloatingIP(deleteFloatingIPOptions *DeleteFloatingIPOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteFloatingIPWithContext(context.Background(), deleteFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteFloatingIPWithContext is an alternate form of the DeleteFloatingIP method which supports a Context parameter
func (vpc *VpcV1) DeleteFloatingIPWithContext(ctx context.Context, deleteFloatingIPOptions *DeleteFloatingIPOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteFloatingIPOptions, "deleteFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteFloatingIPOptions, "deleteFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetFloatingIP : Retrieve a floating IP
// This request retrieves a single floating IP specified by the identifier in the URL.
func (vpc *VpcV1) GetFloatingIP(getFloatingIPOptions *GetFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetFloatingIPWithContext(context.Background(), getFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetFloatingIPWithContext is an alternate form of the GetFloatingIP method which supports a Context parameter
func (vpc *VpcV1) GetFloatingIPWithContext(ctx context.Context, getFloatingIPOptions *GetFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getFloatingIPOptions, "getFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getFloatingIPOptions, "getFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateFloatingIP : Update a floating IP
// This request updates a floating IP's name and/or target.
func (vpc *VpcV1) UpdateFloatingIP(updateFloatingIPOptions *UpdateFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateFloatingIPWithContext(context.Background(), updateFloatingIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateFloatingIPWithContext is an alternate form of the UpdateFloatingIP method which supports a Context parameter
func (vpc *VpcV1) UpdateFloatingIPWithContext(ctx context.Context, updateFloatingIPOptions *UpdateFloatingIPOptions) (result *FloatingIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateFloatingIPOptions, "updateFloatingIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateFloatingIPOptions, "updateFloatingIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateFloatingIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/floating_ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateFloatingIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateFloatingIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateFloatingIPOptions.FloatingIPPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_floating_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFloatingIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListPublicAddressRanges : List public address ranges
// This request lists [public address ranges](https://cloud.ibm.com/docs/vpc?topic=vpc-about-par) in the region. A
// public address range is a contiguous block of public IP addresses that can be bound to a `target` that specifies a
// `vpc` and a `zone`. Incoming traffic for these IP addresses will be routed according to the VPC's ingress routing
// table.
func (vpc *VpcV1) ListPublicAddressRanges(listPublicAddressRangesOptions *ListPublicAddressRangesOptions) (result *PublicAddressRangeCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListPublicAddressRangesWithContext(context.Background(), listPublicAddressRangesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListPublicAddressRangesWithContext is an alternate form of the ListPublicAddressRanges method which supports a Context parameter
func (vpc *VpcV1) ListPublicAddressRangesWithContext(ctx context.Context, listPublicAddressRangesOptions *ListPublicAddressRangesOptions) (result *PublicAddressRangeCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listPublicAddressRangesOptions, "listPublicAddressRangesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_address_ranges`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListPublicAddressRanges")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listPublicAddressRangesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listPublicAddressRangesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listPublicAddressRangesOptions.Start))
	}
	if listPublicAddressRangesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listPublicAddressRangesOptions.Limit))
	}
	if listPublicAddressRangesOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listPublicAddressRangesOptions.ResourceGroupID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_public_address_ranges", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicAddressRangeCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreatePublicAddressRange : Create a public address range
// This request creates a new public address range from a public address range prototype object. The prototype object is
// structured in the same way as a retrieved public address range, and contains the information necessary to create the
// new public address range.
func (vpc *VpcV1) CreatePublicAddressRange(createPublicAddressRangeOptions *CreatePublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreatePublicAddressRangeWithContext(context.Background(), createPublicAddressRangeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreatePublicAddressRangeWithContext is an alternate form of the CreatePublicAddressRange method which supports a Context parameter
func (vpc *VpcV1) CreatePublicAddressRangeWithContext(ctx context.Context, createPublicAddressRangeOptions *CreatePublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createPublicAddressRangeOptions, "createPublicAddressRangeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createPublicAddressRangeOptions, "createPublicAddressRangeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_address_ranges`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreatePublicAddressRange")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createPublicAddressRangeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createPublicAddressRangeOptions.Ipv4AddressCount != nil {
		body["ipv4_address_count"] = createPublicAddressRangeOptions.Ipv4AddressCount
	}
	if createPublicAddressRangeOptions.Name != nil {
		body["name"] = createPublicAddressRangeOptions.Name
	}
	if createPublicAddressRangeOptions.ResourceGroup != nil {
		body["resource_group"] = createPublicAddressRangeOptions.ResourceGroup
	}
	if createPublicAddressRangeOptions.Target != nil {
		body["target"] = createPublicAddressRangeOptions.Target
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_public_address_range", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicAddressRange)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeletePublicAddressRange : Delete a public address range
// This request deletes a public address range. If the public address range is bound to a
// `target`, it will be unbound. This operation cannot be reversed.
func (vpc *VpcV1) DeletePublicAddressRange(deletePublicAddressRangeOptions *DeletePublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	result, response, err = vpc.DeletePublicAddressRangeWithContext(context.Background(), deletePublicAddressRangeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeletePublicAddressRangeWithContext is an alternate form of the DeletePublicAddressRange method which supports a Context parameter
func (vpc *VpcV1) DeletePublicAddressRangeWithContext(ctx context.Context, deletePublicAddressRangeOptions *DeletePublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deletePublicAddressRangeOptions, "deletePublicAddressRangeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deletePublicAddressRangeOptions, "deletePublicAddressRangeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deletePublicAddressRangeOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_address_ranges/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeletePublicAddressRange")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deletePublicAddressRangeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_public_address_range", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicAddressRange)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetPublicAddressRange : Retrieve a public address range
// This request retrieves a single public address range specified by the identifier in the URL.
func (vpc *VpcV1) GetPublicAddressRange(getPublicAddressRangeOptions *GetPublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetPublicAddressRangeWithContext(context.Background(), getPublicAddressRangeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetPublicAddressRangeWithContext is an alternate form of the GetPublicAddressRange method which supports a Context parameter
func (vpc *VpcV1) GetPublicAddressRangeWithContext(ctx context.Context, getPublicAddressRangeOptions *GetPublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getPublicAddressRangeOptions, "getPublicAddressRangeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getPublicAddressRangeOptions, "getPublicAddressRangeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getPublicAddressRangeOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_address_ranges/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetPublicAddressRange")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getPublicAddressRangeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_public_address_range", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicAddressRange)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdatePublicAddressRange : Update a public address range
// This request updates a public address range with the information in a provided public address range patch. The public
// address range patch object is structured in the same way as a retrieved public address range and contains only the
// information to be updated.
func (vpc *VpcV1) UpdatePublicAddressRange(updatePublicAddressRangeOptions *UpdatePublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdatePublicAddressRangeWithContext(context.Background(), updatePublicAddressRangeOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdatePublicAddressRangeWithContext is an alternate form of the UpdatePublicAddressRange method which supports a Context parameter
func (vpc *VpcV1) UpdatePublicAddressRangeWithContext(ctx context.Context, updatePublicAddressRangeOptions *UpdatePublicAddressRangeOptions) (result *PublicAddressRange, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updatePublicAddressRangeOptions, "updatePublicAddressRangeOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updatePublicAddressRangeOptions, "updatePublicAddressRangeOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updatePublicAddressRangeOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/public_address_ranges/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdatePublicAddressRange")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updatePublicAddressRangeOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updatePublicAddressRangeOptions.PublicAddressRangePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_public_address_range", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPublicAddressRange)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListNetworkAcls : List network ACLs
// This request lists network ACLs in the region. A network ACL defines a set of packet filtering rules for traffic in
// and out of the subnets the network ACL is attached to. No traffic is allowed by default. Both allow and deny rules
// can be defined, and rules are stateless so that reverse traffic in response to allowed traffic is not automatically
// allowed.
func (vpc *VpcV1) ListNetworkAcls(listNetworkAclsOptions *ListNetworkAclsOptions) (result *NetworkACLCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListNetworkAclsWithContext(context.Background(), listNetworkAclsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListNetworkAclsWithContext is an alternate form of the ListNetworkAcls method which supports a Context parameter
func (vpc *VpcV1) ListNetworkAclsWithContext(ctx context.Context, listNetworkAclsOptions *ListNetworkAclsOptions) (result *NetworkACLCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listNetworkAclsOptions, "listNetworkAclsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListNetworkAcls")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listNetworkAclsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listNetworkAclsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listNetworkAclsOptions.Start))
	}
	if listNetworkAclsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listNetworkAclsOptions.Limit))
	}
	if listNetworkAclsOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listNetworkAclsOptions.ResourceGroupID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_network_acls", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACLCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateNetworkACL : Create a network ACL
// This request creates a new stateless network ACL from a network ACL prototype object. The prototype object is
// structured in the same way as a retrieved network ACL, and contains the information necessary to create the new
// network ACL.
func (vpc *VpcV1) CreateNetworkACL(createNetworkACLOptions *CreateNetworkACLOptions) (result *NetworkACL, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateNetworkACLWithContext(context.Background(), createNetworkACLOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateNetworkACLWithContext is an alternate form of the CreateNetworkACL method which supports a Context parameter
func (vpc *VpcV1) CreateNetworkACLWithContext(ctx context.Context, createNetworkACLOptions *CreateNetworkACLOptions) (result *NetworkACL, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createNetworkACLOptions, "createNetworkACLOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createNetworkACLOptions, "createNetworkACLOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateNetworkACL")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createNetworkACLOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createNetworkACLOptions.NetworkACLPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_network_acl", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACL)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteNetworkACL : Delete a network ACL
// This request deletes a network ACL. This operation cannot be reversed. For this request to succeed, the network ACL
// must not be the default network ACL for any VPCs, and the network ACL must not be attached to any subnets.
func (vpc *VpcV1) DeleteNetworkACL(deleteNetworkACLOptions *DeleteNetworkACLOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteNetworkACLWithContext(context.Background(), deleteNetworkACLOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteNetworkACLWithContext is an alternate form of the DeleteNetworkACL method which supports a Context parameter
func (vpc *VpcV1) DeleteNetworkACLWithContext(ctx context.Context, deleteNetworkACLOptions *DeleteNetworkACLOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteNetworkACLOptions, "deleteNetworkACLOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteNetworkACLOptions, "deleteNetworkACLOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteNetworkACLOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteNetworkACL")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteNetworkACLOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_network_acl", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetNetworkACL : Retrieve a network ACL
// This request retrieves a single network ACL specified by the identifier in the URL.
func (vpc *VpcV1) GetNetworkACL(getNetworkACLOptions *GetNetworkACLOptions) (result *NetworkACL, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetNetworkACLWithContext(context.Background(), getNetworkACLOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetNetworkACLWithContext is an alternate form of the GetNetworkACL method which supports a Context parameter
func (vpc *VpcV1) GetNetworkACLWithContext(ctx context.Context, getNetworkACLOptions *GetNetworkACLOptions) (result *NetworkACL, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getNetworkACLOptions, "getNetworkACLOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getNetworkACLOptions, "getNetworkACLOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getNetworkACLOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetNetworkACL")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getNetworkACLOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_network_acl", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACL)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateNetworkACL : Update a network ACL
// This request updates a network ACL's name.
func (vpc *VpcV1) UpdateNetworkACL(updateNetworkACLOptions *UpdateNetworkACLOptions) (result *NetworkACL, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateNetworkACLWithContext(context.Background(), updateNetworkACLOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateNetworkACLWithContext is an alternate form of the UpdateNetworkACL method which supports a Context parameter
func (vpc *VpcV1) UpdateNetworkACLWithContext(ctx context.Context, updateNetworkACLOptions *UpdateNetworkACLOptions) (result *NetworkACL, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateNetworkACLOptions, "updateNetworkACLOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateNetworkACLOptions, "updateNetworkACLOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateNetworkACLOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateNetworkACL")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateNetworkACLOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateNetworkACLOptions.NetworkACLPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_network_acl", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACL)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListNetworkACLRules : List rules for a network ACL
// This request lists rules for a network ACL. These rules can allow or deny traffic between a source CIDR block and a
// destination CIDR block over a particular protocol and port range.
func (vpc *VpcV1) ListNetworkACLRules(listNetworkACLRulesOptions *ListNetworkACLRulesOptions) (result *NetworkACLRuleCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListNetworkACLRulesWithContext(context.Background(), listNetworkACLRulesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListNetworkACLRulesWithContext is an alternate form of the ListNetworkACLRules method which supports a Context parameter
func (vpc *VpcV1) ListNetworkACLRulesWithContext(ctx context.Context, listNetworkACLRulesOptions *ListNetworkACLRulesOptions) (result *NetworkACLRuleCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listNetworkACLRulesOptions, "listNetworkACLRulesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listNetworkACLRulesOptions, "listNetworkACLRulesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"network_acl_id": *listNetworkACLRulesOptions.NetworkACLID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{network_acl_id}/rules`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListNetworkACLRules")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listNetworkACLRulesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listNetworkACLRulesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listNetworkACLRulesOptions.Start))
	}
	if listNetworkACLRulesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listNetworkACLRulesOptions.Limit))
	}
	if listNetworkACLRulesOptions.Direction != nil {
		builder.AddQuery("direction", fmt.Sprint(*listNetworkACLRulesOptions.Direction))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_network_acl_rules", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACLRuleCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateNetworkACLRule : Create a rule for a network ACL
// This request creates a new rule from a network ACL rule prototype object. The prototype object is structured in the
// same way as a retrieved rule, and contains the information necessary to create the new rule.
func (vpc *VpcV1) CreateNetworkACLRule(createNetworkACLRuleOptions *CreateNetworkACLRuleOptions) (result NetworkACLRuleIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateNetworkACLRuleWithContext(context.Background(), createNetworkACLRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateNetworkACLRuleWithContext is an alternate form of the CreateNetworkACLRule method which supports a Context parameter
func (vpc *VpcV1) CreateNetworkACLRuleWithContext(ctx context.Context, createNetworkACLRuleOptions *CreateNetworkACLRuleOptions) (result NetworkACLRuleIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createNetworkACLRuleOptions, "createNetworkACLRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createNetworkACLRuleOptions, "createNetworkACLRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"network_acl_id": *createNetworkACLRuleOptions.NetworkACLID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{network_acl_id}/rules`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateNetworkACLRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createNetworkACLRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createNetworkACLRuleOptions.NetworkACLRulePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_network_acl_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACLRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteNetworkACLRule : Delete a network ACL rule
// This request deletes a rule. This operation cannot be reversed.
func (vpc *VpcV1) DeleteNetworkACLRule(deleteNetworkACLRuleOptions *DeleteNetworkACLRuleOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteNetworkACLRuleWithContext(context.Background(), deleteNetworkACLRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteNetworkACLRuleWithContext is an alternate form of the DeleteNetworkACLRule method which supports a Context parameter
func (vpc *VpcV1) DeleteNetworkACLRuleWithContext(ctx context.Context, deleteNetworkACLRuleOptions *DeleteNetworkACLRuleOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteNetworkACLRuleOptions, "deleteNetworkACLRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteNetworkACLRuleOptions, "deleteNetworkACLRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"network_acl_id": *deleteNetworkACLRuleOptions.NetworkACLID,
		"id":             *deleteNetworkACLRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{network_acl_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteNetworkACLRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteNetworkACLRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_network_acl_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetNetworkACLRule : Retrieve a network ACL rule
// This request retrieves a single rule specified by the identifier in the URL.
func (vpc *VpcV1) GetNetworkACLRule(getNetworkACLRuleOptions *GetNetworkACLRuleOptions) (result NetworkACLRuleIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetNetworkACLRuleWithContext(context.Background(), getNetworkACLRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetNetworkACLRuleWithContext is an alternate form of the GetNetworkACLRule method which supports a Context parameter
func (vpc *VpcV1) GetNetworkACLRuleWithContext(ctx context.Context, getNetworkACLRuleOptions *GetNetworkACLRuleOptions) (result NetworkACLRuleIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getNetworkACLRuleOptions, "getNetworkACLRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getNetworkACLRuleOptions, "getNetworkACLRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"network_acl_id": *getNetworkACLRuleOptions.NetworkACLID,
		"id":             *getNetworkACLRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{network_acl_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetNetworkACLRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getNetworkACLRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_network_acl_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACLRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateNetworkACLRule : Update a network ACL rule
// This request updates a rule with the information in a provided rule patch. The rule patch object contains only the
// information to be updated. The request will fail if the provided patch includes properties that are not used by the
// rule's protocol.
func (vpc *VpcV1) UpdateNetworkACLRule(updateNetworkACLRuleOptions *UpdateNetworkACLRuleOptions) (result NetworkACLRuleIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateNetworkACLRuleWithContext(context.Background(), updateNetworkACLRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateNetworkACLRuleWithContext is an alternate form of the UpdateNetworkACLRule method which supports a Context parameter
func (vpc *VpcV1) UpdateNetworkACLRuleWithContext(ctx context.Context, updateNetworkACLRuleOptions *UpdateNetworkACLRuleOptions) (result NetworkACLRuleIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateNetworkACLRuleOptions, "updateNetworkACLRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateNetworkACLRuleOptions, "updateNetworkACLRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"network_acl_id": *updateNetworkACLRuleOptions.NetworkACLID,
		"id":             *updateNetworkACLRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/network_acls/{network_acl_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateNetworkACLRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateNetworkACLRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateNetworkACLRuleOptions.NetworkACLRulePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_network_acl_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalNetworkACLRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListSecurityGroups : List security groups
// This request lists security groups in the region. A security group defines a set of packet filtering rules to allow
// traffic in and out of the resources targeted by the security group. No traffic is allowed by default. Security group
// rules are stateful so that reverse traffic in response to allowed traffic is automatically allowed.
func (vpc *VpcV1) ListSecurityGroups(listSecurityGroupsOptions *ListSecurityGroupsOptions) (result *SecurityGroupCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSecurityGroupsWithContext(context.Background(), listSecurityGroupsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSecurityGroupsWithContext is an alternate form of the ListSecurityGroups method which supports a Context parameter
func (vpc *VpcV1) ListSecurityGroupsWithContext(ctx context.Context, listSecurityGroupsOptions *ListSecurityGroupsOptions) (result *SecurityGroupCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listSecurityGroupsOptions, "listSecurityGroupsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSecurityGroups")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSecurityGroupsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listSecurityGroupsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listSecurityGroupsOptions.Start))
	}
	if listSecurityGroupsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listSecurityGroupsOptions.Limit))
	}
	if listSecurityGroupsOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listSecurityGroupsOptions.ResourceGroupID))
	}
	if listSecurityGroupsOptions.VPCID != nil {
		builder.AddQuery("vpc.id", fmt.Sprint(*listSecurityGroupsOptions.VPCID))
	}
	if listSecurityGroupsOptions.VPCCRN != nil {
		builder.AddQuery("vpc.crn", fmt.Sprint(*listSecurityGroupsOptions.VPCCRN))
	}
	if listSecurityGroupsOptions.VPCName != nil {
		builder.AddQuery("vpc.name", fmt.Sprint(*listSecurityGroupsOptions.VPCName))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_security_groups", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateSecurityGroup : Create a security group
// This request creates a new security group from a security group prototype object. The prototype object is structured
// in the same way as a retrieved security group, and contains the information necessary to create the new security
// group. If security group rules are included in the prototype object, those rules will be added to the security group.
// Each security group is scoped to one VPC. Only resources in that VPC can be added to the security group.
func (vpc *VpcV1) CreateSecurityGroup(createSecurityGroupOptions *CreateSecurityGroupOptions) (result *SecurityGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateSecurityGroupWithContext(context.Background(), createSecurityGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateSecurityGroupWithContext is an alternate form of the CreateSecurityGroup method which supports a Context parameter
func (vpc *VpcV1) CreateSecurityGroupWithContext(ctx context.Context, createSecurityGroupOptions *CreateSecurityGroupOptions) (result *SecurityGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createSecurityGroupOptions, "createSecurityGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createSecurityGroupOptions, "createSecurityGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateSecurityGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createSecurityGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createSecurityGroupOptions.VPC != nil {
		body["vpc"] = createSecurityGroupOptions.VPC
	}
	if createSecurityGroupOptions.Name != nil {
		body["name"] = createSecurityGroupOptions.Name
	}
	if createSecurityGroupOptions.ResourceGroup != nil {
		body["resource_group"] = createSecurityGroupOptions.ResourceGroup
	}
	if createSecurityGroupOptions.Rules != nil {
		body["rules"] = createSecurityGroupOptions.Rules
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_security_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSecurityGroup : Delete a security group
// This request deletes a security group. A security group cannot be deleted if it is referenced by any security group
// targets or rules. Additionally, a VPC's default security group cannot be deleted. This operation cannot be reversed.
func (vpc *VpcV1) DeleteSecurityGroup(deleteSecurityGroupOptions *DeleteSecurityGroupOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteSecurityGroupWithContext(context.Background(), deleteSecurityGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSecurityGroupWithContext is an alternate form of the DeleteSecurityGroup method which supports a Context parameter
func (vpc *VpcV1) DeleteSecurityGroupWithContext(ctx context.Context, deleteSecurityGroupOptions *DeleteSecurityGroupOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSecurityGroupOptions, "deleteSecurityGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSecurityGroupOptions, "deleteSecurityGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteSecurityGroupOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSecurityGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSecurityGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_security_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetSecurityGroup : Retrieve a security group
// This request retrieves a single security group specified by the identifier in the URL path.
func (vpc *VpcV1) GetSecurityGroup(getSecurityGroupOptions *GetSecurityGroupOptions) (result *SecurityGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetSecurityGroupWithContext(context.Background(), getSecurityGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetSecurityGroupWithContext is an alternate form of the GetSecurityGroup method which supports a Context parameter
func (vpc *VpcV1) GetSecurityGroupWithContext(ctx context.Context, getSecurityGroupOptions *GetSecurityGroupOptions) (result *SecurityGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getSecurityGroupOptions, "getSecurityGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getSecurityGroupOptions, "getSecurityGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getSecurityGroupOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetSecurityGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getSecurityGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_security_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateSecurityGroup : Update a security group
// This request updates a security group with the information provided in a security group patch object. The security
// group patch object is structured in the same way as a retrieved security group and contains only the information to
// be updated.
func (vpc *VpcV1) UpdateSecurityGroup(updateSecurityGroupOptions *UpdateSecurityGroupOptions) (result *SecurityGroup, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateSecurityGroupWithContext(context.Background(), updateSecurityGroupOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateSecurityGroupWithContext is an alternate form of the UpdateSecurityGroup method which supports a Context parameter
func (vpc *VpcV1) UpdateSecurityGroupWithContext(ctx context.Context, updateSecurityGroupOptions *UpdateSecurityGroupOptions) (result *SecurityGroup, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateSecurityGroupOptions, "updateSecurityGroupOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateSecurityGroupOptions, "updateSecurityGroupOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateSecurityGroupOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateSecurityGroup")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateSecurityGroupOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateSecurityGroupOptions.SecurityGroupPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_security_group", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroup)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListSecurityGroupRules : List rules in a security group
// This request lists rules in a security group. These rules define what traffic the security group permits. Security
// group rules are stateful, such that reverse traffic in response to allowed traffic is automatically permitted.
func (vpc *VpcV1) ListSecurityGroupRules(listSecurityGroupRulesOptions *ListSecurityGroupRulesOptions) (result *SecurityGroupRuleCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSecurityGroupRulesWithContext(context.Background(), listSecurityGroupRulesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSecurityGroupRulesWithContext is an alternate form of the ListSecurityGroupRules method which supports a Context parameter
func (vpc *VpcV1) ListSecurityGroupRulesWithContext(ctx context.Context, listSecurityGroupRulesOptions *ListSecurityGroupRulesOptions) (result *SecurityGroupRuleCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listSecurityGroupRulesOptions, "listSecurityGroupRulesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listSecurityGroupRulesOptions, "listSecurityGroupRulesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *listSecurityGroupRulesOptions.SecurityGroupID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/rules`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSecurityGroupRules")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSecurityGroupRulesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_security_group_rules", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupRuleCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateSecurityGroupRule : Create a rule for a security group
// This request creates a new security group rule from a security group rule prototype object. The prototype object is
// structured in the same way as a retrieved security group rule and contains the information necessary to create the
// rule. As part of creating a new rule in a security group, the rule is applied to all the networking interfaces in the
// security group. Rules specify which IP traffic a security group will allow. Security group rules are stateful, such
// that reverse traffic in response to allowed traffic is automatically permitted. A rule allowing inbound TCP traffic
// on port 80 also allows outbound TCP traffic on port 80 without the need for an additional rule.
func (vpc *VpcV1) CreateSecurityGroupRule(createSecurityGroupRuleOptions *CreateSecurityGroupRuleOptions) (result SecurityGroupRuleIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateSecurityGroupRuleWithContext(context.Background(), createSecurityGroupRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateSecurityGroupRuleWithContext is an alternate form of the CreateSecurityGroupRule method which supports a Context parameter
func (vpc *VpcV1) CreateSecurityGroupRuleWithContext(ctx context.Context, createSecurityGroupRuleOptions *CreateSecurityGroupRuleOptions) (result SecurityGroupRuleIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createSecurityGroupRuleOptions, "createSecurityGroupRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createSecurityGroupRuleOptions, "createSecurityGroupRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *createSecurityGroupRuleOptions.SecurityGroupID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/rules`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateSecurityGroupRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createSecurityGroupRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createSecurityGroupRuleOptions.SecurityGroupRulePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_security_group_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSecurityGroupRule : Delete a security group rule
// This request deletes a security group rule. This operation cannot be reversed. Removing a security group rule will
// not end existing connections allowed by that rule.
func (vpc *VpcV1) DeleteSecurityGroupRule(deleteSecurityGroupRuleOptions *DeleteSecurityGroupRuleOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteSecurityGroupRuleWithContext(context.Background(), deleteSecurityGroupRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSecurityGroupRuleWithContext is an alternate form of the DeleteSecurityGroupRule method which supports a Context parameter
func (vpc *VpcV1) DeleteSecurityGroupRuleWithContext(ctx context.Context, deleteSecurityGroupRuleOptions *DeleteSecurityGroupRuleOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSecurityGroupRuleOptions, "deleteSecurityGroupRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSecurityGroupRuleOptions, "deleteSecurityGroupRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *deleteSecurityGroupRuleOptions.SecurityGroupID,
		"id":                *deleteSecurityGroupRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSecurityGroupRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSecurityGroupRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_security_group_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetSecurityGroupRule : Retrieve a security group rule
// This request retrieves a single security group rule specified by the identifier in the URL path.
func (vpc *VpcV1) GetSecurityGroupRule(getSecurityGroupRuleOptions *GetSecurityGroupRuleOptions) (result SecurityGroupRuleIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetSecurityGroupRuleWithContext(context.Background(), getSecurityGroupRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetSecurityGroupRuleWithContext is an alternate form of the GetSecurityGroupRule method which supports a Context parameter
func (vpc *VpcV1) GetSecurityGroupRuleWithContext(ctx context.Context, getSecurityGroupRuleOptions *GetSecurityGroupRuleOptions) (result SecurityGroupRuleIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getSecurityGroupRuleOptions, "getSecurityGroupRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getSecurityGroupRuleOptions, "getSecurityGroupRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *getSecurityGroupRuleOptions.SecurityGroupID,
		"id":                *getSecurityGroupRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetSecurityGroupRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getSecurityGroupRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_security_group_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateSecurityGroupRule : Update a security group rule
// This request updates a security group rule with the information in a provided rule patch object. The rule patch
// object contains only the information to be updated. The request will fail if the provided patch includes properties
// that are not used by the rule's protocol.
func (vpc *VpcV1) UpdateSecurityGroupRule(updateSecurityGroupRuleOptions *UpdateSecurityGroupRuleOptions) (result SecurityGroupRuleIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateSecurityGroupRuleWithContext(context.Background(), updateSecurityGroupRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateSecurityGroupRuleWithContext is an alternate form of the UpdateSecurityGroupRule method which supports a Context parameter
func (vpc *VpcV1) UpdateSecurityGroupRuleWithContext(ctx context.Context, updateSecurityGroupRuleOptions *UpdateSecurityGroupRuleOptions) (result SecurityGroupRuleIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateSecurityGroupRuleOptions, "updateSecurityGroupRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateSecurityGroupRuleOptions, "updateSecurityGroupRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *updateSecurityGroupRuleOptions.SecurityGroupID,
		"id":                *updateSecurityGroupRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateSecurityGroupRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateSecurityGroupRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateSecurityGroupRuleOptions.SecurityGroupRulePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_security_group_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListSecurityGroupTargets : List targets associated with a security group
// This request lists targets associated with a security group, to which the rules in the security group are applied.
func (vpc *VpcV1) ListSecurityGroupTargets(listSecurityGroupTargetsOptions *ListSecurityGroupTargetsOptions) (result *SecurityGroupTargetCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListSecurityGroupTargetsWithContext(context.Background(), listSecurityGroupTargetsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListSecurityGroupTargetsWithContext is an alternate form of the ListSecurityGroupTargets method which supports a Context parameter
func (vpc *VpcV1) ListSecurityGroupTargetsWithContext(ctx context.Context, listSecurityGroupTargetsOptions *ListSecurityGroupTargetsOptions) (result *SecurityGroupTargetCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listSecurityGroupTargetsOptions, "listSecurityGroupTargetsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listSecurityGroupTargetsOptions, "listSecurityGroupTargetsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *listSecurityGroupTargetsOptions.SecurityGroupID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/targets`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListSecurityGroupTargets")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listSecurityGroupTargetsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listSecurityGroupTargetsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listSecurityGroupTargetsOptions.Start))
	}
	if listSecurityGroupTargetsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listSecurityGroupTargetsOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_security_group_targets", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupTargetCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteSecurityGroupTargetBinding : Remove a target from a security group
// This request removes a target from a security group. For this request to succeed, the target must be attached to at
// least one other security group.  The specified target identifier can be:
//
// - A bare metal server network interface identifier
// - A virtual network interface identifier
// - A VPN server identifier
// - A load balancer identifier
// - An endpoint gateway identifier
// - An instance network interface identifier
//
// Security groups are stateful, so any changes to a target's security groups are applied to new connections. Existing
// connections are not affected.
func (vpc *VpcV1) DeleteSecurityGroupTargetBinding(deleteSecurityGroupTargetBindingOptions *DeleteSecurityGroupTargetBindingOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteSecurityGroupTargetBindingWithContext(context.Background(), deleteSecurityGroupTargetBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteSecurityGroupTargetBindingWithContext is an alternate form of the DeleteSecurityGroupTargetBinding method which supports a Context parameter
func (vpc *VpcV1) DeleteSecurityGroupTargetBindingWithContext(ctx context.Context, deleteSecurityGroupTargetBindingOptions *DeleteSecurityGroupTargetBindingOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteSecurityGroupTargetBindingOptions, "deleteSecurityGroupTargetBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteSecurityGroupTargetBindingOptions, "deleteSecurityGroupTargetBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *deleteSecurityGroupTargetBindingOptions.SecurityGroupID,
		"id":                *deleteSecurityGroupTargetBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/targets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteSecurityGroupTargetBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteSecurityGroupTargetBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_security_group_target_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetSecurityGroupTarget : Retrieve a security group target
// This request retrieves a single target specified by the identifier in the URL path. The target must be an existing
// target of the security group.
func (vpc *VpcV1) GetSecurityGroupTarget(getSecurityGroupTargetOptions *GetSecurityGroupTargetOptions) (result SecurityGroupTargetReferenceIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetSecurityGroupTargetWithContext(context.Background(), getSecurityGroupTargetOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetSecurityGroupTargetWithContext is an alternate form of the GetSecurityGroupTarget method which supports a Context parameter
func (vpc *VpcV1) GetSecurityGroupTargetWithContext(ctx context.Context, getSecurityGroupTargetOptions *GetSecurityGroupTargetOptions) (result SecurityGroupTargetReferenceIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getSecurityGroupTargetOptions, "getSecurityGroupTargetOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getSecurityGroupTargetOptions, "getSecurityGroupTargetOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *getSecurityGroupTargetOptions.SecurityGroupID,
		"id":                *getSecurityGroupTargetOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/targets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetSecurityGroupTarget")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getSecurityGroupTargetOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_security_group_target", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupTargetReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateSecurityGroupTargetBinding : Add a target to a security group
// This request adds a resource to an existing security group. The specified target identifier can be:
//
// - A bare metal server network interface identifier
// - A virtual network interface identifier
// - A VPN server identifier
// - A load balancer identifier
// - An endpoint gateway identifier
// - An instance network interface identifier
//
// When a target is added to a security group, the security group rules are applied to the target. A request body is not
// required, and if provided, is ignored.
func (vpc *VpcV1) CreateSecurityGroupTargetBinding(createSecurityGroupTargetBindingOptions *CreateSecurityGroupTargetBindingOptions) (result SecurityGroupTargetReferenceIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateSecurityGroupTargetBindingWithContext(context.Background(), createSecurityGroupTargetBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateSecurityGroupTargetBindingWithContext is an alternate form of the CreateSecurityGroupTargetBinding method which supports a Context parameter
func (vpc *VpcV1) CreateSecurityGroupTargetBindingWithContext(ctx context.Context, createSecurityGroupTargetBindingOptions *CreateSecurityGroupTargetBindingOptions) (result SecurityGroupTargetReferenceIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createSecurityGroupTargetBindingOptions, "createSecurityGroupTargetBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createSecurityGroupTargetBindingOptions, "createSecurityGroupTargetBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"security_group_id": *createSecurityGroupTargetBindingOptions.SecurityGroupID,
		"id":                *createSecurityGroupTargetBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/security_groups/{security_group_id}/targets/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateSecurityGroupTargetBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createSecurityGroupTargetBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_security_group_target_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalSecurityGroupTargetReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListIkePolicies : List IKE policies
// This request lists IKE policies in the region.
func (vpc *VpcV1) ListIkePolicies(listIkePoliciesOptions *ListIkePoliciesOptions) (result *IkePolicyCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListIkePoliciesWithContext(context.Background(), listIkePoliciesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListIkePoliciesWithContext is an alternate form of the ListIkePolicies method which supports a Context parameter
func (vpc *VpcV1) ListIkePoliciesWithContext(ctx context.Context, listIkePoliciesOptions *ListIkePoliciesOptions) (result *IkePolicyCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listIkePoliciesOptions, "listIkePoliciesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ike_policies`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListIkePolicies")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listIkePoliciesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listIkePoliciesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listIkePoliciesOptions.Start))
	}
	if listIkePoliciesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listIkePoliciesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_ike_policies", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIkePolicyCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateIkePolicy : Create an IKE policy
// This request creates a new IKE policy.
func (vpc *VpcV1) CreateIkePolicy(createIkePolicyOptions *CreateIkePolicyOptions) (result *IkePolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateIkePolicyWithContext(context.Background(), createIkePolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateIkePolicyWithContext is an alternate form of the CreateIkePolicy method which supports a Context parameter
func (vpc *VpcV1) CreateIkePolicyWithContext(ctx context.Context, createIkePolicyOptions *CreateIkePolicyOptions) (result *IkePolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createIkePolicyOptions, "createIkePolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createIkePolicyOptions, "createIkePolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ike_policies`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateIkePolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createIkePolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createIkePolicyOptions.AuthenticationAlgorithm != nil {
		body["authentication_algorithm"] = createIkePolicyOptions.AuthenticationAlgorithm
	}
	if createIkePolicyOptions.DhGroup != nil {
		body["dh_group"] = createIkePolicyOptions.DhGroup
	}
	if createIkePolicyOptions.EncryptionAlgorithm != nil {
		body["encryption_algorithm"] = createIkePolicyOptions.EncryptionAlgorithm
	}
	if createIkePolicyOptions.IkeVersion != nil {
		body["ike_version"] = createIkePolicyOptions.IkeVersion
	}
	if createIkePolicyOptions.KeyLifetime != nil {
		body["key_lifetime"] = createIkePolicyOptions.KeyLifetime
	}
	if createIkePolicyOptions.Name != nil {
		body["name"] = createIkePolicyOptions.Name
	}
	if createIkePolicyOptions.ResourceGroup != nil {
		body["resource_group"] = createIkePolicyOptions.ResourceGroup
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_ike_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIkePolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteIkePolicy : Delete an IKE policy
// This request deletes an IKE policy. This operation cannot be reversed. For this request to succeed, there must not be
// any VPN gateway connections using this policy.
func (vpc *VpcV1) DeleteIkePolicy(deleteIkePolicyOptions *DeleteIkePolicyOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteIkePolicyWithContext(context.Background(), deleteIkePolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteIkePolicyWithContext is an alternate form of the DeleteIkePolicy method which supports a Context parameter
func (vpc *VpcV1) DeleteIkePolicyWithContext(ctx context.Context, deleteIkePolicyOptions *DeleteIkePolicyOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteIkePolicyOptions, "deleteIkePolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteIkePolicyOptions, "deleteIkePolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteIkePolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ike_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteIkePolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteIkePolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_ike_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetIkePolicy : Retrieve an IKE policy
// This request retrieves a single IKE policy specified by the identifier in the URL.
func (vpc *VpcV1) GetIkePolicy(getIkePolicyOptions *GetIkePolicyOptions) (result *IkePolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetIkePolicyWithContext(context.Background(), getIkePolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetIkePolicyWithContext is an alternate form of the GetIkePolicy method which supports a Context parameter
func (vpc *VpcV1) GetIkePolicyWithContext(ctx context.Context, getIkePolicyOptions *GetIkePolicyOptions) (result *IkePolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getIkePolicyOptions, "getIkePolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getIkePolicyOptions, "getIkePolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getIkePolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ike_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetIkePolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getIkePolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_ike_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIkePolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateIkePolicy : Update an IKE policy
// This request updates the properties of an existing IKE policy.
func (vpc *VpcV1) UpdateIkePolicy(updateIkePolicyOptions *UpdateIkePolicyOptions) (result *IkePolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateIkePolicyWithContext(context.Background(), updateIkePolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateIkePolicyWithContext is an alternate form of the UpdateIkePolicy method which supports a Context parameter
func (vpc *VpcV1) UpdateIkePolicyWithContext(ctx context.Context, updateIkePolicyOptions *UpdateIkePolicyOptions) (result *IkePolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateIkePolicyOptions, "updateIkePolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateIkePolicyOptions, "updateIkePolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateIkePolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ike_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateIkePolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateIkePolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateIkePolicyOptions.IkePolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_ike_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIkePolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListIkePolicyConnections : List VPN gateway connections that use a specified IKE policy
// This request lists VPN gateway connections that use an IKE policy.
func (vpc *VpcV1) ListIkePolicyConnections(listIkePolicyConnectionsOptions *ListIkePolicyConnectionsOptions) (result *IkePolicyConnectionCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListIkePolicyConnectionsWithContext(context.Background(), listIkePolicyConnectionsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListIkePolicyConnectionsWithContext is an alternate form of the ListIkePolicyConnections method which supports a Context parameter
func (vpc *VpcV1) ListIkePolicyConnectionsWithContext(ctx context.Context, listIkePolicyConnectionsOptions *ListIkePolicyConnectionsOptions) (result *IkePolicyConnectionCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listIkePolicyConnectionsOptions, "listIkePolicyConnectionsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listIkePolicyConnectionsOptions, "listIkePolicyConnectionsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *listIkePolicyConnectionsOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ike_policies/{id}/connections`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListIkePolicyConnections")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listIkePolicyConnectionsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listIkePolicyConnectionsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listIkePolicyConnectionsOptions.Start))
	}
	if listIkePolicyConnectionsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listIkePolicyConnectionsOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_ike_policy_connections", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIkePolicyConnectionCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListIpsecPolicies : List IPsec policies
// This request lists IPsec policies in the region.
func (vpc *VpcV1) ListIpsecPolicies(listIpsecPoliciesOptions *ListIpsecPoliciesOptions) (result *IPsecPolicyCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListIpsecPoliciesWithContext(context.Background(), listIpsecPoliciesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListIpsecPoliciesWithContext is an alternate form of the ListIpsecPolicies method which supports a Context parameter
func (vpc *VpcV1) ListIpsecPoliciesWithContext(ctx context.Context, listIpsecPoliciesOptions *ListIpsecPoliciesOptions) (result *IPsecPolicyCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listIpsecPoliciesOptions, "listIpsecPoliciesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ipsec_policies`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListIpsecPolicies")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listIpsecPoliciesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listIpsecPoliciesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listIpsecPoliciesOptions.Start))
	}
	if listIpsecPoliciesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listIpsecPoliciesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_ipsec_policies", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIPsecPolicyCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateIpsecPolicy : Create an IPsec policy
// This request creates a new IPsec policy.
func (vpc *VpcV1) CreateIpsecPolicy(createIpsecPolicyOptions *CreateIpsecPolicyOptions) (result *IPsecPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateIpsecPolicyWithContext(context.Background(), createIpsecPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateIpsecPolicyWithContext is an alternate form of the CreateIpsecPolicy method which supports a Context parameter
func (vpc *VpcV1) CreateIpsecPolicyWithContext(ctx context.Context, createIpsecPolicyOptions *CreateIpsecPolicyOptions) (result *IPsecPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createIpsecPolicyOptions, "createIpsecPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createIpsecPolicyOptions, "createIpsecPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ipsec_policies`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateIpsecPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createIpsecPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createIpsecPolicyOptions.AuthenticationAlgorithm != nil {
		body["authentication_algorithm"] = createIpsecPolicyOptions.AuthenticationAlgorithm
	}
	if createIpsecPolicyOptions.EncryptionAlgorithm != nil {
		body["encryption_algorithm"] = createIpsecPolicyOptions.EncryptionAlgorithm
	}
	if createIpsecPolicyOptions.Pfs != nil {
		body["pfs"] = createIpsecPolicyOptions.Pfs
	}
	if createIpsecPolicyOptions.KeyLifetime != nil {
		body["key_lifetime"] = createIpsecPolicyOptions.KeyLifetime
	}
	if createIpsecPolicyOptions.Name != nil {
		body["name"] = createIpsecPolicyOptions.Name
	}
	if createIpsecPolicyOptions.ResourceGroup != nil {
		body["resource_group"] = createIpsecPolicyOptions.ResourceGroup
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_ipsec_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIPsecPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteIpsecPolicy : Delete an IPsec policy
// This request deletes an IPsec policy. This operation cannot be reversed. For this request to succeed, there must not
// be any VPN gateway connections using this policy.
func (vpc *VpcV1) DeleteIpsecPolicy(deleteIpsecPolicyOptions *DeleteIpsecPolicyOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteIpsecPolicyWithContext(context.Background(), deleteIpsecPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteIpsecPolicyWithContext is an alternate form of the DeleteIpsecPolicy method which supports a Context parameter
func (vpc *VpcV1) DeleteIpsecPolicyWithContext(ctx context.Context, deleteIpsecPolicyOptions *DeleteIpsecPolicyOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteIpsecPolicyOptions, "deleteIpsecPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteIpsecPolicyOptions, "deleteIpsecPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteIpsecPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ipsec_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteIpsecPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteIpsecPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_ipsec_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetIpsecPolicy : Retrieve an IPsec policy
// This request retrieves a single IPsec policy specified by the identifier in the URL.
func (vpc *VpcV1) GetIpsecPolicy(getIpsecPolicyOptions *GetIpsecPolicyOptions) (result *IPsecPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetIpsecPolicyWithContext(context.Background(), getIpsecPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetIpsecPolicyWithContext is an alternate form of the GetIpsecPolicy method which supports a Context parameter
func (vpc *VpcV1) GetIpsecPolicyWithContext(ctx context.Context, getIpsecPolicyOptions *GetIpsecPolicyOptions) (result *IPsecPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getIpsecPolicyOptions, "getIpsecPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getIpsecPolicyOptions, "getIpsecPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getIpsecPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ipsec_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetIpsecPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getIpsecPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_ipsec_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIPsecPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateIpsecPolicy : Update an IPsec policy
// This request updates the properties of an existing IPsec policy.
func (vpc *VpcV1) UpdateIpsecPolicy(updateIpsecPolicyOptions *UpdateIpsecPolicyOptions) (result *IPsecPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateIpsecPolicyWithContext(context.Background(), updateIpsecPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateIpsecPolicyWithContext is an alternate form of the UpdateIpsecPolicy method which supports a Context parameter
func (vpc *VpcV1) UpdateIpsecPolicyWithContext(ctx context.Context, updateIpsecPolicyOptions *UpdateIpsecPolicyOptions) (result *IPsecPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateIpsecPolicyOptions, "updateIpsecPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateIpsecPolicyOptions, "updateIpsecPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateIpsecPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ipsec_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateIpsecPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateIpsecPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateIpsecPolicyOptions.IPsecPolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_ipsec_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIPsecPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListIpsecPolicyConnections : List VPN gateway connections that use a specified IPsec policy
// This request lists VPN gateway connections that use an IPsec policy.
func (vpc *VpcV1) ListIpsecPolicyConnections(listIpsecPolicyConnectionsOptions *ListIpsecPolicyConnectionsOptions) (result *IPsecPolicyConnectionCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListIpsecPolicyConnectionsWithContext(context.Background(), listIpsecPolicyConnectionsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListIpsecPolicyConnectionsWithContext is an alternate form of the ListIpsecPolicyConnections method which supports a Context parameter
func (vpc *VpcV1) ListIpsecPolicyConnectionsWithContext(ctx context.Context, listIpsecPolicyConnectionsOptions *ListIpsecPolicyConnectionsOptions) (result *IPsecPolicyConnectionCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listIpsecPolicyConnectionsOptions, "listIpsecPolicyConnectionsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listIpsecPolicyConnectionsOptions, "listIpsecPolicyConnectionsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *listIpsecPolicyConnectionsOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/ipsec_policies/{id}/connections`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListIpsecPolicyConnections")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listIpsecPolicyConnectionsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listIpsecPolicyConnectionsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listIpsecPolicyConnectionsOptions.Start))
	}
	if listIpsecPolicyConnectionsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listIpsecPolicyConnectionsOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_ipsec_policy_connections", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalIPsecPolicyConnectionCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVPNGateways : List VPN gateways
// This request lists VPN gateways in the region.
func (vpc *VpcV1) ListVPNGateways(listVPNGatewaysOptions *ListVPNGatewaysOptions) (result *VPNGatewayCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNGatewaysWithContext(context.Background(), listVPNGatewaysOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNGatewaysWithContext is an alternate form of the ListVPNGateways method which supports a Context parameter
func (vpc *VpcV1) ListVPNGatewaysWithContext(ctx context.Context, listVPNGatewaysOptions *ListVPNGatewaysOptions) (result *VPNGatewayCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listVPNGatewaysOptions, "listVPNGatewaysOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNGateways")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNGatewaysOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVPNGatewaysOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVPNGatewaysOptions.Start))
	}
	if listVPNGatewaysOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVPNGatewaysOptions.Limit))
	}
	if listVPNGatewaysOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listVPNGatewaysOptions.ResourceGroupID))
	}
	if listVPNGatewaysOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listVPNGatewaysOptions.Sort))
	}
	if listVPNGatewaysOptions.Mode != nil {
		builder.AddQuery("mode", fmt.Sprint(*listVPNGatewaysOptions.Mode))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_gateways", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateVPNGateway : Create a VPN gateway
// This request creates a new VPN gateway.
func (vpc *VpcV1) CreateVPNGateway(createVPNGatewayOptions *CreateVPNGatewayOptions) (result VPNGatewayIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateVPNGatewayWithContext(context.Background(), createVPNGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateVPNGatewayWithContext is an alternate form of the CreateVPNGateway method which supports a Context parameter
func (vpc *VpcV1) CreateVPNGatewayWithContext(ctx context.Context, createVPNGatewayOptions *CreateVPNGatewayOptions) (result VPNGatewayIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createVPNGatewayOptions, "createVPNGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createVPNGatewayOptions, "createVPNGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateVPNGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createVPNGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createVPNGatewayOptions.VPNGatewayPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_vpn_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVPNGateway : Delete a VPN gateway
// This request deletes a VPN gateway. This operation cannot be reversed. For this request to succeed, the VPN gateway
// must not have a `status` of `pending`, and there must not be any VPC routes using the VPN gateway's connections as a
// next hop.
func (vpc *VpcV1) DeleteVPNGateway(deleteVPNGatewayOptions *DeleteVPNGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteVPNGatewayWithContext(context.Background(), deleteVPNGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVPNGatewayWithContext is an alternate form of the DeleteVPNGateway method which supports a Context parameter
func (vpc *VpcV1) DeleteVPNGatewayWithContext(ctx context.Context, deleteVPNGatewayOptions *DeleteVPNGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVPNGatewayOptions, "deleteVPNGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVPNGatewayOptions, "deleteVPNGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteVPNGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVPNGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVPNGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_vpn_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVPNGateway : Retrieve a VPN gateway
// This request retrieves a single VPN gateway specified by the identifier in the URL.
func (vpc *VpcV1) GetVPNGateway(getVPNGatewayOptions *GetVPNGatewayOptions) (result VPNGatewayIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVPNGatewayWithContext(context.Background(), getVPNGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVPNGatewayWithContext is an alternate form of the GetVPNGateway method which supports a Context parameter
func (vpc *VpcV1) GetVPNGatewayWithContext(ctx context.Context, getVPNGatewayOptions *GetVPNGatewayOptions) (result VPNGatewayIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVPNGatewayOptions, "getVPNGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVPNGatewayOptions, "getVPNGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getVPNGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVPNGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVPNGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_vpn_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateVPNGateway : Update a VPN gateway
// This request updates the properties of an existing VPN gateway.
func (vpc *VpcV1) UpdateVPNGateway(updateVPNGatewayOptions *UpdateVPNGatewayOptions) (result VPNGatewayIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateVPNGatewayWithContext(context.Background(), updateVPNGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateVPNGatewayWithContext is an alternate form of the UpdateVPNGateway method which supports a Context parameter
func (vpc *VpcV1) UpdateVPNGatewayWithContext(ctx context.Context, updateVPNGatewayOptions *UpdateVPNGatewayOptions) (result VPNGatewayIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateVPNGatewayOptions, "updateVPNGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateVPNGatewayOptions, "updateVPNGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateVPNGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateVPNGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateVPNGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateVPNGatewayOptions.VPNGatewayPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_vpn_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVPNGatewayConnections : List connections of a VPN gateway
// This request lists connections of a VPN gateway.
func (vpc *VpcV1) ListVPNGatewayConnections(listVPNGatewayConnectionsOptions *ListVPNGatewayConnectionsOptions) (result *VPNGatewayConnectionCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNGatewayConnectionsWithContext(context.Background(), listVPNGatewayConnectionsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNGatewayConnectionsWithContext is an alternate form of the ListVPNGatewayConnections method which supports a Context parameter
func (vpc *VpcV1) ListVPNGatewayConnectionsWithContext(ctx context.Context, listVPNGatewayConnectionsOptions *ListVPNGatewayConnectionsOptions) (result *VPNGatewayConnectionCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVPNGatewayConnectionsOptions, "listVPNGatewayConnectionsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVPNGatewayConnectionsOptions, "listVPNGatewayConnectionsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *listVPNGatewayConnectionsOptions.VPNGatewayID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNGatewayConnections")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNGatewayConnectionsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVPNGatewayConnectionsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVPNGatewayConnectionsOptions.Start))
	}
	if listVPNGatewayConnectionsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVPNGatewayConnectionsOptions.Limit))
	}
	if listVPNGatewayConnectionsOptions.Status != nil {
		builder.AddQuery("status", fmt.Sprint(*listVPNGatewayConnectionsOptions.Status))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_gateway_connections", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayConnectionCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateVPNGatewayConnection : Create a connection for a VPN gateway
// This request creates a new VPN gateway connection.
func (vpc *VpcV1) CreateVPNGatewayConnection(createVPNGatewayConnectionOptions *CreateVPNGatewayConnectionOptions) (result VPNGatewayConnectionIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateVPNGatewayConnectionWithContext(context.Background(), createVPNGatewayConnectionOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateVPNGatewayConnectionWithContext is an alternate form of the CreateVPNGatewayConnection method which supports a Context parameter
func (vpc *VpcV1) CreateVPNGatewayConnectionWithContext(ctx context.Context, createVPNGatewayConnectionOptions *CreateVPNGatewayConnectionOptions) (result VPNGatewayConnectionIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createVPNGatewayConnectionOptions, "createVPNGatewayConnectionOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createVPNGatewayConnectionOptions, "createVPNGatewayConnectionOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *createVPNGatewayConnectionOptions.VPNGatewayID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateVPNGatewayConnection")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createVPNGatewayConnectionOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(createVPNGatewayConnectionOptions.VPNGatewayConnectionPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_vpn_gateway_connection", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayConnection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVPNGatewayConnection : Delete a VPN gateway connection
// This request deletes a VPN gateway connection. This operation cannot be reversed. For this request to succeed, there
// must not be VPC routes using this VPN connection as a next hop.
func (vpc *VpcV1) DeleteVPNGatewayConnection(deleteVPNGatewayConnectionOptions *DeleteVPNGatewayConnectionOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteVPNGatewayConnectionWithContext(context.Background(), deleteVPNGatewayConnectionOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVPNGatewayConnectionWithContext is an alternate form of the DeleteVPNGatewayConnection method which supports a Context parameter
func (vpc *VpcV1) DeleteVPNGatewayConnectionWithContext(ctx context.Context, deleteVPNGatewayConnectionOptions *DeleteVPNGatewayConnectionOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVPNGatewayConnectionOptions, "deleteVPNGatewayConnectionOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVPNGatewayConnectionOptions, "deleteVPNGatewayConnectionOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *deleteVPNGatewayConnectionOptions.VPNGatewayID,
		"id":             *deleteVPNGatewayConnectionOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVPNGatewayConnection")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVPNGatewayConnectionOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_vpn_gateway_connection", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVPNGatewayConnection : Retrieve a VPN gateway connection
// This request retrieves a single VPN gateway connection specified by the identifier in the URL.
func (vpc *VpcV1) GetVPNGatewayConnection(getVPNGatewayConnectionOptions *GetVPNGatewayConnectionOptions) (result VPNGatewayConnectionIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVPNGatewayConnectionWithContext(context.Background(), getVPNGatewayConnectionOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVPNGatewayConnectionWithContext is an alternate form of the GetVPNGatewayConnection method which supports a Context parameter
func (vpc *VpcV1) GetVPNGatewayConnectionWithContext(ctx context.Context, getVPNGatewayConnectionOptions *GetVPNGatewayConnectionOptions) (result VPNGatewayConnectionIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVPNGatewayConnectionOptions, "getVPNGatewayConnectionOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVPNGatewayConnectionOptions, "getVPNGatewayConnectionOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *getVPNGatewayConnectionOptions.VPNGatewayID,
		"id":             *getVPNGatewayConnectionOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVPNGatewayConnection")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVPNGatewayConnectionOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_vpn_gateway_connection", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayConnection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateVPNGatewayConnection : Update a VPN gateway connection
// This request updates the properties of an existing VPN gateway connection.
func (vpc *VpcV1) UpdateVPNGatewayConnection(updateVPNGatewayConnectionOptions *UpdateVPNGatewayConnectionOptions) (result VPNGatewayConnectionIntf, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateVPNGatewayConnectionWithContext(context.Background(), updateVPNGatewayConnectionOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateVPNGatewayConnectionWithContext is an alternate form of the UpdateVPNGatewayConnection method which supports a Context parameter
func (vpc *VpcV1) UpdateVPNGatewayConnectionWithContext(ctx context.Context, updateVPNGatewayConnectionOptions *UpdateVPNGatewayConnectionOptions) (result VPNGatewayConnectionIntf, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateVPNGatewayConnectionOptions, "updateVPNGatewayConnectionOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateVPNGatewayConnectionOptions, "updateVPNGatewayConnectionOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *updateVPNGatewayConnectionOptions.VPNGatewayID,
		"id":             *updateVPNGatewayConnectionOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateVPNGatewayConnection")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateVPNGatewayConnectionOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateVPNGatewayConnectionOptions.VPNGatewayConnectionPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_vpn_gateway_connection", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayConnection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListVPNGatewayConnectionsLocalCIDRs : List local CIDRs for a VPN gateway connection
// This request lists local CIDRs for a VPN gateway connection.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) ListVPNGatewayConnectionsLocalCIDRs(listVPNGatewayConnectionsLocalCIDRsOptions *ListVPNGatewayConnectionsLocalCIDRsOptions) (result *VPNGatewayConnectionCIDRs, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNGatewayConnectionsLocalCIDRsWithContext(context.Background(), listVPNGatewayConnectionsLocalCIDRsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNGatewayConnectionsLocalCIDRsWithContext is an alternate form of the ListVPNGatewayConnectionsLocalCIDRs method which supports a Context parameter
func (vpc *VpcV1) ListVPNGatewayConnectionsLocalCIDRsWithContext(ctx context.Context, listVPNGatewayConnectionsLocalCIDRsOptions *ListVPNGatewayConnectionsLocalCIDRsOptions) (result *VPNGatewayConnectionCIDRs, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVPNGatewayConnectionsLocalCIDRsOptions, "listVPNGatewayConnectionsLocalCIDRsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVPNGatewayConnectionsLocalCIDRsOptions, "listVPNGatewayConnectionsLocalCIDRsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *listVPNGatewayConnectionsLocalCIDRsOptions.VPNGatewayID,
		"id":             *listVPNGatewayConnectionsLocalCIDRsOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/local/cidrs`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNGatewayConnectionsLocalCIDRs")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNGatewayConnectionsLocalCIDRsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_gateway_connections_local_cidrs", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayConnectionCIDRs)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RemoveVPNGatewayConnectionsLocalCIDR : Remove a local CIDR from a VPN gateway connection
// This request removes a CIDR from a VPN gateway connection.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) RemoveVPNGatewayConnectionsLocalCIDR(removeVPNGatewayConnectionsLocalCIDROptions *RemoveVPNGatewayConnectionsLocalCIDROptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RemoveVPNGatewayConnectionsLocalCIDRWithContext(context.Background(), removeVPNGatewayConnectionsLocalCIDROptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RemoveVPNGatewayConnectionsLocalCIDRWithContext is an alternate form of the RemoveVPNGatewayConnectionsLocalCIDR method which supports a Context parameter
func (vpc *VpcV1) RemoveVPNGatewayConnectionsLocalCIDRWithContext(ctx context.Context, removeVPNGatewayConnectionsLocalCIDROptions *RemoveVPNGatewayConnectionsLocalCIDROptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(removeVPNGatewayConnectionsLocalCIDROptions, "removeVPNGatewayConnectionsLocalCIDROptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(removeVPNGatewayConnectionsLocalCIDROptions, "removeVPNGatewayConnectionsLocalCIDROptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *removeVPNGatewayConnectionsLocalCIDROptions.VPNGatewayID,
		"id":             *removeVPNGatewayConnectionsLocalCIDROptions.ID,
		"cidr":           *removeVPNGatewayConnectionsLocalCIDROptions.CIDR,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/local/cidrs/{cidr}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RemoveVPNGatewayConnectionsLocalCIDR")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range removeVPNGatewayConnectionsLocalCIDROptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "remove_vpn_gateway_connections_local_cidr", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// CheckVPNGatewayConnectionsLocalCIDR : Check if the specified local CIDR exists on a VPN gateway connection
// This request succeeds if a CIDR exists on the specified VPN gateway connection, and fails otherwise.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) CheckVPNGatewayConnectionsLocalCIDR(checkVPNGatewayConnectionsLocalCIDROptions *CheckVPNGatewayConnectionsLocalCIDROptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.CheckVPNGatewayConnectionsLocalCIDRWithContext(context.Background(), checkVPNGatewayConnectionsLocalCIDROptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CheckVPNGatewayConnectionsLocalCIDRWithContext is an alternate form of the CheckVPNGatewayConnectionsLocalCIDR method which supports a Context parameter
func (vpc *VpcV1) CheckVPNGatewayConnectionsLocalCIDRWithContext(ctx context.Context, checkVPNGatewayConnectionsLocalCIDROptions *CheckVPNGatewayConnectionsLocalCIDROptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(checkVPNGatewayConnectionsLocalCIDROptions, "checkVPNGatewayConnectionsLocalCIDROptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(checkVPNGatewayConnectionsLocalCIDROptions, "checkVPNGatewayConnectionsLocalCIDROptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *checkVPNGatewayConnectionsLocalCIDROptions.VPNGatewayID,
		"id":             *checkVPNGatewayConnectionsLocalCIDROptions.ID,
		"cidr":           *checkVPNGatewayConnectionsLocalCIDROptions.CIDR,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/local/cidrs/{cidr}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CheckVPNGatewayConnectionsLocalCIDR")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range checkVPNGatewayConnectionsLocalCIDROptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "check_vpn_gateway_connections_local_cidr", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// AddVPNGatewayConnectionsLocalCIDR : Set a local CIDR on a VPN gateway connection
// This request adds the specified CIDR to the specified VPN gateway connection. This request succeeds if the specified
// CIDR already exists. A request body is not required, and if provided, is ignored.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) AddVPNGatewayConnectionsLocalCIDR(addVPNGatewayConnectionsLocalCIDROptions *AddVPNGatewayConnectionsLocalCIDROptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.AddVPNGatewayConnectionsLocalCIDRWithContext(context.Background(), addVPNGatewayConnectionsLocalCIDROptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// AddVPNGatewayConnectionsLocalCIDRWithContext is an alternate form of the AddVPNGatewayConnectionsLocalCIDR method which supports a Context parameter
func (vpc *VpcV1) AddVPNGatewayConnectionsLocalCIDRWithContext(ctx context.Context, addVPNGatewayConnectionsLocalCIDROptions *AddVPNGatewayConnectionsLocalCIDROptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(addVPNGatewayConnectionsLocalCIDROptions, "addVPNGatewayConnectionsLocalCIDROptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(addVPNGatewayConnectionsLocalCIDROptions, "addVPNGatewayConnectionsLocalCIDROptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *addVPNGatewayConnectionsLocalCIDROptions.VPNGatewayID,
		"id":             *addVPNGatewayConnectionsLocalCIDROptions.ID,
		"cidr":           *addVPNGatewayConnectionsLocalCIDROptions.CIDR,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/local/cidrs/{cidr}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "AddVPNGatewayConnectionsLocalCIDR")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range addVPNGatewayConnectionsLocalCIDROptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "add_vpn_gateway_connections_local_cidr", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListVPNGatewayConnectionsPeerCIDRs : List peer CIDRs for a VPN gateway connection
// This request lists peer CIDRs for a VPN gateway connection.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) ListVPNGatewayConnectionsPeerCIDRs(listVPNGatewayConnectionsPeerCIDRsOptions *ListVPNGatewayConnectionsPeerCIDRsOptions) (result *VPNGatewayConnectionCIDRs, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNGatewayConnectionsPeerCIDRsWithContext(context.Background(), listVPNGatewayConnectionsPeerCIDRsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNGatewayConnectionsPeerCIDRsWithContext is an alternate form of the ListVPNGatewayConnectionsPeerCIDRs method which supports a Context parameter
func (vpc *VpcV1) ListVPNGatewayConnectionsPeerCIDRsWithContext(ctx context.Context, listVPNGatewayConnectionsPeerCIDRsOptions *ListVPNGatewayConnectionsPeerCIDRsOptions) (result *VPNGatewayConnectionCIDRs, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVPNGatewayConnectionsPeerCIDRsOptions, "listVPNGatewayConnectionsPeerCIDRsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVPNGatewayConnectionsPeerCIDRsOptions, "listVPNGatewayConnectionsPeerCIDRsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *listVPNGatewayConnectionsPeerCIDRsOptions.VPNGatewayID,
		"id":             *listVPNGatewayConnectionsPeerCIDRsOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/peer/cidrs`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNGatewayConnectionsPeerCIDRs")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNGatewayConnectionsPeerCIDRsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_gateway_connections_peer_cidrs", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNGatewayConnectionCIDRs)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RemoveVPNGatewayConnectionsPeerCIDR : Remove a peer CIDR from a VPN gateway connection
// This request removes a CIDR from a VPN gateway connection.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) RemoveVPNGatewayConnectionsPeerCIDR(removeVPNGatewayConnectionsPeerCIDROptions *RemoveVPNGatewayConnectionsPeerCIDROptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RemoveVPNGatewayConnectionsPeerCIDRWithContext(context.Background(), removeVPNGatewayConnectionsPeerCIDROptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RemoveVPNGatewayConnectionsPeerCIDRWithContext is an alternate form of the RemoveVPNGatewayConnectionsPeerCIDR method which supports a Context parameter
func (vpc *VpcV1) RemoveVPNGatewayConnectionsPeerCIDRWithContext(ctx context.Context, removeVPNGatewayConnectionsPeerCIDROptions *RemoveVPNGatewayConnectionsPeerCIDROptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(removeVPNGatewayConnectionsPeerCIDROptions, "removeVPNGatewayConnectionsPeerCIDROptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(removeVPNGatewayConnectionsPeerCIDROptions, "removeVPNGatewayConnectionsPeerCIDROptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *removeVPNGatewayConnectionsPeerCIDROptions.VPNGatewayID,
		"id":             *removeVPNGatewayConnectionsPeerCIDROptions.ID,
		"cidr":           *removeVPNGatewayConnectionsPeerCIDROptions.CIDR,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/peer/cidrs/{cidr}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RemoveVPNGatewayConnectionsPeerCIDR")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range removeVPNGatewayConnectionsPeerCIDROptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "remove_vpn_gateway_connections_peer_cidr", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// CheckVPNGatewayConnectionsPeerCIDR : Check if the specified peer CIDR exists on a VPN gateway connection
// This request succeeds if a CIDR exists on the specified VPN gateway connection, and fails otherwise.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) CheckVPNGatewayConnectionsPeerCIDR(checkVPNGatewayConnectionsPeerCIDROptions *CheckVPNGatewayConnectionsPeerCIDROptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.CheckVPNGatewayConnectionsPeerCIDRWithContext(context.Background(), checkVPNGatewayConnectionsPeerCIDROptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CheckVPNGatewayConnectionsPeerCIDRWithContext is an alternate form of the CheckVPNGatewayConnectionsPeerCIDR method which supports a Context parameter
func (vpc *VpcV1) CheckVPNGatewayConnectionsPeerCIDRWithContext(ctx context.Context, checkVPNGatewayConnectionsPeerCIDROptions *CheckVPNGatewayConnectionsPeerCIDROptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(checkVPNGatewayConnectionsPeerCIDROptions, "checkVPNGatewayConnectionsPeerCIDROptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(checkVPNGatewayConnectionsPeerCIDROptions, "checkVPNGatewayConnectionsPeerCIDROptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *checkVPNGatewayConnectionsPeerCIDROptions.VPNGatewayID,
		"id":             *checkVPNGatewayConnectionsPeerCIDROptions.ID,
		"cidr":           *checkVPNGatewayConnectionsPeerCIDROptions.CIDR,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/peer/cidrs/{cidr}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CheckVPNGatewayConnectionsPeerCIDR")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range checkVPNGatewayConnectionsPeerCIDROptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "check_vpn_gateway_connections_peer_cidr", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// AddVPNGatewayConnectionsPeerCIDR : Set a peer CIDR on a VPN gateway connection
// This request adds the specified CIDR to the specified VPN gateway connection. This request succeeds if the specified
// CIDR already exists. A request body is not required, and if provided, is ignored.
//
// This request is only supported for policy mode VPN gateways.
func (vpc *VpcV1) AddVPNGatewayConnectionsPeerCIDR(addVPNGatewayConnectionsPeerCIDROptions *AddVPNGatewayConnectionsPeerCIDROptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.AddVPNGatewayConnectionsPeerCIDRWithContext(context.Background(), addVPNGatewayConnectionsPeerCIDROptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// AddVPNGatewayConnectionsPeerCIDRWithContext is an alternate form of the AddVPNGatewayConnectionsPeerCIDR method which supports a Context parameter
func (vpc *VpcV1) AddVPNGatewayConnectionsPeerCIDRWithContext(ctx context.Context, addVPNGatewayConnectionsPeerCIDROptions *AddVPNGatewayConnectionsPeerCIDROptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(addVPNGatewayConnectionsPeerCIDROptions, "addVPNGatewayConnectionsPeerCIDROptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(addVPNGatewayConnectionsPeerCIDROptions, "addVPNGatewayConnectionsPeerCIDROptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_gateway_id": *addVPNGatewayConnectionsPeerCIDROptions.VPNGatewayID,
		"id":             *addVPNGatewayConnectionsPeerCIDROptions.ID,
		"cidr":           *addVPNGatewayConnectionsPeerCIDROptions.CIDR,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_gateways/{vpn_gateway_id}/connections/{id}/peer/cidrs/{cidr}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "AddVPNGatewayConnectionsPeerCIDR")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range addVPNGatewayConnectionsPeerCIDROptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "add_vpn_gateway_connections_peer_cidr", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListVPNServers : List VPN servers
// This request lists VPN servers.
func (vpc *VpcV1) ListVPNServers(listVPNServersOptions *ListVPNServersOptions) (result *VPNServerCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNServersWithContext(context.Background(), listVPNServersOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNServersWithContext is an alternate form of the ListVPNServers method which supports a Context parameter
func (vpc *VpcV1) ListVPNServersWithContext(ctx context.Context, listVPNServersOptions *ListVPNServersOptions) (result *VPNServerCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listVPNServersOptions, "listVPNServersOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNServers")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNServersOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVPNServersOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listVPNServersOptions.Name))
	}
	if listVPNServersOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVPNServersOptions.Start))
	}
	if listVPNServersOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVPNServersOptions.Limit))
	}
	if listVPNServersOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listVPNServersOptions.ResourceGroupID))
	}
	if listVPNServersOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listVPNServersOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_servers", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateVPNServer : Create a VPN server
// This request creates a new VPN server.
func (vpc *VpcV1) CreateVPNServer(createVPNServerOptions *CreateVPNServerOptions) (result *VPNServer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateVPNServerWithContext(context.Background(), createVPNServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateVPNServerWithContext is an alternate form of the CreateVPNServer method which supports a Context parameter
func (vpc *VpcV1) CreateVPNServerWithContext(ctx context.Context, createVPNServerOptions *CreateVPNServerOptions) (result *VPNServer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createVPNServerOptions, "createVPNServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createVPNServerOptions, "createVPNServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateVPNServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createVPNServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createVPNServerOptions.Certificate != nil {
		body["certificate"] = createVPNServerOptions.Certificate
	}
	if createVPNServerOptions.ClientAuthentication != nil {
		body["client_authentication"] = createVPNServerOptions.ClientAuthentication
	}
	if createVPNServerOptions.ClientIPPool != nil {
		body["client_ip_pool"] = createVPNServerOptions.ClientIPPool
	}
	if createVPNServerOptions.Subnets != nil {
		body["subnets"] = createVPNServerOptions.Subnets
	}
	if createVPNServerOptions.ClientDnsServerIps != nil {
		body["client_dns_server_ips"] = createVPNServerOptions.ClientDnsServerIps
	}
	if createVPNServerOptions.ClientIdleTimeout != nil {
		body["client_idle_timeout"] = createVPNServerOptions.ClientIdleTimeout
	}
	if createVPNServerOptions.EnableSplitTunneling != nil {
		body["enable_split_tunneling"] = createVPNServerOptions.EnableSplitTunneling
	}
	if createVPNServerOptions.Name != nil {
		body["name"] = createVPNServerOptions.Name
	}
	if createVPNServerOptions.Port != nil {
		body["port"] = createVPNServerOptions.Port
	}
	if createVPNServerOptions.Protocol != nil {
		body["protocol"] = createVPNServerOptions.Protocol
	}
	if createVPNServerOptions.ResourceGroup != nil {
		body["resource_group"] = createVPNServerOptions.ResourceGroup
	}
	if createVPNServerOptions.SecurityGroups != nil {
		body["security_groups"] = createVPNServerOptions.SecurityGroups
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_vpn_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVPNServer : Delete a VPN server
// This request deletes a VPN server. This operation cannot be reversed.
func (vpc *VpcV1) DeleteVPNServer(deleteVPNServerOptions *DeleteVPNServerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteVPNServerWithContext(context.Background(), deleteVPNServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVPNServerWithContext is an alternate form of the DeleteVPNServer method which supports a Context parameter
func (vpc *VpcV1) DeleteVPNServerWithContext(ctx context.Context, deleteVPNServerOptions *DeleteVPNServerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVPNServerOptions, "deleteVPNServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVPNServerOptions, "deleteVPNServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteVPNServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVPNServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVPNServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	if deleteVPNServerOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteVPNServerOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_vpn_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVPNServer : Retrieve a VPN server
// This request retrieves a single VPN server specified by the identifier in the URL.
func (vpc *VpcV1) GetVPNServer(getVPNServerOptions *GetVPNServerOptions) (result *VPNServer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVPNServerWithContext(context.Background(), getVPNServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVPNServerWithContext is an alternate form of the GetVPNServer method which supports a Context parameter
func (vpc *VpcV1) GetVPNServerWithContext(ctx context.Context, getVPNServerOptions *GetVPNServerOptions) (result *VPNServer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVPNServerOptions, "getVPNServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVPNServerOptions, "getVPNServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getVPNServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVPNServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVPNServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_vpn_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateVPNServer : Update a VPN server
// This request updates the properties of an existing VPN server. Any updates other than to `name` will cause all
// connected VPN clients to be disconnected.
func (vpc *VpcV1) UpdateVPNServer(updateVPNServerOptions *UpdateVPNServerOptions) (result *VPNServer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateVPNServerWithContext(context.Background(), updateVPNServerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateVPNServerWithContext is an alternate form of the UpdateVPNServer method which supports a Context parameter
func (vpc *VpcV1) UpdateVPNServerWithContext(ctx context.Context, updateVPNServerOptions *UpdateVPNServerOptions) (result *VPNServer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateVPNServerOptions, "updateVPNServerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateVPNServerOptions, "updateVPNServerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateVPNServerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateVPNServer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateVPNServerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateVPNServerOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateVPNServerOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateVPNServerOptions.VPNServerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_vpn_server", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetVPNServerClientConfiguration : Retrieve client configuration
// This request retrieves OpenVPN client configuration on a single VPN server specified by the identifier in the URL.
// This configuration includes directives compatible with OpenVPN releases 2.4 and 2.5.
func (vpc *VpcV1) GetVPNServerClientConfiguration(getVPNServerClientConfigurationOptions *GetVPNServerClientConfigurationOptions) (result *string, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVPNServerClientConfigurationWithContext(context.Background(), getVPNServerClientConfigurationOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVPNServerClientConfigurationWithContext is an alternate form of the GetVPNServerClientConfiguration method which supports a Context parameter
func (vpc *VpcV1) GetVPNServerClientConfigurationWithContext(ctx context.Context, getVPNServerClientConfigurationOptions *GetVPNServerClientConfigurationOptions) (result *string, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVPNServerClientConfigurationOptions, "getVPNServerClientConfigurationOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVPNServerClientConfigurationOptions, "getVPNServerClientConfigurationOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getVPNServerClientConfigurationOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{id}/client_configuration`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVPNServerClientConfiguration")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVPNServerClientConfigurationOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "text/plain")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, &result)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_vpn_server_client_configuration", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListVPNServerClients : List VPN clients for a VPN server
// This request retrieves connected VPN clients, and any disconnected VPN clients that the VPN server has not yet
// deleted based on its auto-deletion policy.
func (vpc *VpcV1) ListVPNServerClients(listVPNServerClientsOptions *ListVPNServerClientsOptions) (result *VPNServerClientCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNServerClientsWithContext(context.Background(), listVPNServerClientsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNServerClientsWithContext is an alternate form of the ListVPNServerClients method which supports a Context parameter
func (vpc *VpcV1) ListVPNServerClientsWithContext(ctx context.Context, listVPNServerClientsOptions *ListVPNServerClientsOptions) (result *VPNServerClientCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVPNServerClientsOptions, "listVPNServerClientsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVPNServerClientsOptions, "listVPNServerClientsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *listVPNServerClientsOptions.VPNServerID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/clients`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNServerClients")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNServerClientsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVPNServerClientsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVPNServerClientsOptions.Start))
	}
	if listVPNServerClientsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVPNServerClientsOptions.Limit))
	}
	if listVPNServerClientsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listVPNServerClientsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_server_clients", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerClientCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVPNServerClient : Delete a VPN client
// This request disconnects and deletes the VPN client from the VPN server. The VPN client may reconnect unless its
// authentication permissions for the configured authentication methods (such as its client certificate) have been
// revoked.
func (vpc *VpcV1) DeleteVPNServerClient(deleteVPNServerClientOptions *DeleteVPNServerClientOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteVPNServerClientWithContext(context.Background(), deleteVPNServerClientOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVPNServerClientWithContext is an alternate form of the DeleteVPNServerClient method which supports a Context parameter
func (vpc *VpcV1) DeleteVPNServerClientWithContext(ctx context.Context, deleteVPNServerClientOptions *DeleteVPNServerClientOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVPNServerClientOptions, "deleteVPNServerClientOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVPNServerClientOptions, "deleteVPNServerClientOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *deleteVPNServerClientOptions.VPNServerID,
		"id":            *deleteVPNServerClientOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/clients/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVPNServerClient")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVPNServerClientOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_vpn_server_client", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVPNServerClient : Retrieve a VPN client
// This request retrieves a single VPN client specified by the identifier in the URL.
func (vpc *VpcV1) GetVPNServerClient(getVPNServerClientOptions *GetVPNServerClientOptions) (result *VPNServerClient, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVPNServerClientWithContext(context.Background(), getVPNServerClientOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVPNServerClientWithContext is an alternate form of the GetVPNServerClient method which supports a Context parameter
func (vpc *VpcV1) GetVPNServerClientWithContext(ctx context.Context, getVPNServerClientOptions *GetVPNServerClientOptions) (result *VPNServerClient, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVPNServerClientOptions, "getVPNServerClientOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVPNServerClientOptions, "getVPNServerClientOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *getVPNServerClientOptions.VPNServerID,
		"id":            *getVPNServerClientOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/clients/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVPNServerClient")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVPNServerClientOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_vpn_server_client", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerClient)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DisconnectVPNClient : Disconnect a VPN client
// This request disconnects the specified VPN client, and deletes the client according to the VPN server's auto-deletion
// policy. The VPN client may reconnect unless its authentication permissions for the configured authentication methods
// (such as its client certificate) have been revoked.
func (vpc *VpcV1) DisconnectVPNClient(disconnectVPNClientOptions *DisconnectVPNClientOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DisconnectVPNClientWithContext(context.Background(), disconnectVPNClientOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DisconnectVPNClientWithContext is an alternate form of the DisconnectVPNClient method which supports a Context parameter
func (vpc *VpcV1) DisconnectVPNClientWithContext(ctx context.Context, disconnectVPNClientOptions *DisconnectVPNClientOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(disconnectVPNClientOptions, "disconnectVPNClientOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(disconnectVPNClientOptions, "disconnectVPNClientOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *disconnectVPNClientOptions.VPNServerID,
		"id":            *disconnectVPNClientOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/clients/{id}/disconnect`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DisconnectVPNClient")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range disconnectVPNClientOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "disconnect_vpn_client", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// ListVPNServerRoutes : List VPN routes for a VPN server
// This request lists VPN routes in a VPN server. All VPN routes are provided to the VPN client when the connection is
// established.  Packets received from the VPN client will be dropped by the VPN server if there is no VPN route
// matching their specified destinations. All VPN routes must be unique within the VPN server.
func (vpc *VpcV1) ListVPNServerRoutes(listVPNServerRoutesOptions *ListVPNServerRoutesOptions) (result *VPNServerRouteCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListVPNServerRoutesWithContext(context.Background(), listVPNServerRoutesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListVPNServerRoutesWithContext is an alternate form of the ListVPNServerRoutes method which supports a Context parameter
func (vpc *VpcV1) ListVPNServerRoutesWithContext(ctx context.Context, listVPNServerRoutesOptions *ListVPNServerRoutesOptions) (result *VPNServerRouteCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listVPNServerRoutesOptions, "listVPNServerRoutesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listVPNServerRoutesOptions, "listVPNServerRoutesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *listVPNServerRoutesOptions.VPNServerID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/routes`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListVPNServerRoutes")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listVPNServerRoutesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listVPNServerRoutesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listVPNServerRoutesOptions.Start))
	}
	if listVPNServerRoutesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listVPNServerRoutesOptions.Limit))
	}
	if listVPNServerRoutesOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listVPNServerRoutesOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_vpn_server_routes", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerRouteCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateVPNServerRoute : Create a VPN route for a VPN server
// This request creates a new VPN route in the VPN server. All VPN routes are provided to the VPN client when the
// connection is established. Packets received from the VPN client will be dropped by the VPN server if there is no VPN
// route matching their specified destinations. All VPN routes must be unique within the VPN server.
func (vpc *VpcV1) CreateVPNServerRoute(createVPNServerRouteOptions *CreateVPNServerRouteOptions) (result *VPNServerRoute, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateVPNServerRouteWithContext(context.Background(), createVPNServerRouteOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateVPNServerRouteWithContext is an alternate form of the CreateVPNServerRoute method which supports a Context parameter
func (vpc *VpcV1) CreateVPNServerRouteWithContext(ctx context.Context, createVPNServerRouteOptions *CreateVPNServerRouteOptions) (result *VPNServerRoute, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createVPNServerRouteOptions, "createVPNServerRouteOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createVPNServerRouteOptions, "createVPNServerRouteOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *createVPNServerRouteOptions.VPNServerID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/routes`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateVPNServerRoute")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createVPNServerRouteOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createVPNServerRouteOptions.Destination != nil {
		body["destination"] = createVPNServerRouteOptions.Destination
	}
	if createVPNServerRouteOptions.Action != nil {
		body["action"] = createVPNServerRouteOptions.Action
	}
	if createVPNServerRouteOptions.Name != nil {
		body["name"] = createVPNServerRouteOptions.Name
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_vpn_server_route", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerRoute)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteVPNServerRoute : Delete a VPN route
// This request deletes a VPN route. This operation cannot be reversed.
func (vpc *VpcV1) DeleteVPNServerRoute(deleteVPNServerRouteOptions *DeleteVPNServerRouteOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteVPNServerRouteWithContext(context.Background(), deleteVPNServerRouteOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteVPNServerRouteWithContext is an alternate form of the DeleteVPNServerRoute method which supports a Context parameter
func (vpc *VpcV1) DeleteVPNServerRouteWithContext(ctx context.Context, deleteVPNServerRouteOptions *DeleteVPNServerRouteOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteVPNServerRouteOptions, "deleteVPNServerRouteOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteVPNServerRouteOptions, "deleteVPNServerRouteOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *deleteVPNServerRouteOptions.VPNServerID,
		"id":            *deleteVPNServerRouteOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/routes/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteVPNServerRoute")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteVPNServerRouteOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_vpn_server_route", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetVPNServerRoute : Retrieve a VPN route
// This request retrieves a single VPN route specified by the identifier in the URL.
func (vpc *VpcV1) GetVPNServerRoute(getVPNServerRouteOptions *GetVPNServerRouteOptions) (result *VPNServerRoute, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetVPNServerRouteWithContext(context.Background(), getVPNServerRouteOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetVPNServerRouteWithContext is an alternate form of the GetVPNServerRoute method which supports a Context parameter
func (vpc *VpcV1) GetVPNServerRouteWithContext(ctx context.Context, getVPNServerRouteOptions *GetVPNServerRouteOptions) (result *VPNServerRoute, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getVPNServerRouteOptions, "getVPNServerRouteOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getVPNServerRouteOptions, "getVPNServerRouteOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *getVPNServerRouteOptions.VPNServerID,
		"id":            *getVPNServerRouteOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/routes/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetVPNServerRoute")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getVPNServerRouteOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_vpn_server_route", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerRoute)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateVPNServerRoute : Update a VPN route
// This request updates a VPN route with the information in a provided VPN route patch. The VPN route patch object is
// structured in the same way as a retrieved VPN route and contains only the information to be updated.
func (vpc *VpcV1) UpdateVPNServerRoute(updateVPNServerRouteOptions *UpdateVPNServerRouteOptions) (result *VPNServerRoute, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateVPNServerRouteWithContext(context.Background(), updateVPNServerRouteOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateVPNServerRouteWithContext is an alternate form of the UpdateVPNServerRoute method which supports a Context parameter
func (vpc *VpcV1) UpdateVPNServerRouteWithContext(ctx context.Context, updateVPNServerRouteOptions *UpdateVPNServerRouteOptions) (result *VPNServerRoute, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateVPNServerRouteOptions, "updateVPNServerRouteOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateVPNServerRouteOptions, "updateVPNServerRouteOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"vpn_server_id": *updateVPNServerRouteOptions.VPNServerID,
		"id":            *updateVPNServerRouteOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/vpn_servers/{vpn_server_id}/routes/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateVPNServerRoute")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateVPNServerRouteOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateVPNServerRouteOptions.VPNServerRoutePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_vpn_server_route", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalVPNServerRoute)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancerProfiles : List load balancer profiles
// This request lists load balancer profiles available in the region. A load balancer profile specifies the performance
// characteristics and pricing model for a load balancer.
func (vpc *VpcV1) ListLoadBalancerProfiles(listLoadBalancerProfilesOptions *ListLoadBalancerProfilesOptions) (result *LoadBalancerProfileCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancerProfilesWithContext(context.Background(), listLoadBalancerProfilesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancerProfilesWithContext is an alternate form of the ListLoadBalancerProfiles method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancerProfilesWithContext(ctx context.Context, listLoadBalancerProfilesOptions *ListLoadBalancerProfilesOptions) (result *LoadBalancerProfileCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listLoadBalancerProfilesOptions, "listLoadBalancerProfilesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancer/profiles`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancerProfiles")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancerProfilesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listLoadBalancerProfilesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listLoadBalancerProfilesOptions.Start))
	}
	if listLoadBalancerProfilesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listLoadBalancerProfilesOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancer_profiles", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerProfileCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetLoadBalancerProfile : Retrieve a load balancer profile
// This request retrieves a load balancer profile specified by the name in the URL.
func (vpc *VpcV1) GetLoadBalancerProfile(getLoadBalancerProfileOptions *GetLoadBalancerProfileOptions) (result *LoadBalancerProfile, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerProfileWithContext(context.Background(), getLoadBalancerProfileOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerProfileWithContext is an alternate form of the GetLoadBalancerProfile method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerProfileWithContext(ctx context.Context, getLoadBalancerProfileOptions *GetLoadBalancerProfileOptions) (result *LoadBalancerProfile, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerProfileOptions, "getLoadBalancerProfileOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerProfileOptions, "getLoadBalancerProfileOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"name": *getLoadBalancerProfileOptions.Name,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancer/profiles/{name}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerProfile")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerProfileOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_profile", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerProfile)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancers : List load balancers
// This request lists load balancers in the region.
func (vpc *VpcV1) ListLoadBalancers(listLoadBalancersOptions *ListLoadBalancersOptions) (result *LoadBalancerCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancersWithContext(context.Background(), listLoadBalancersOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancersWithContext is an alternate form of the ListLoadBalancers method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancersWithContext(ctx context.Context, listLoadBalancersOptions *ListLoadBalancersOptions) (result *LoadBalancerCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listLoadBalancersOptions, "listLoadBalancersOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancers")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancersOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listLoadBalancersOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listLoadBalancersOptions.Start))
	}
	if listLoadBalancersOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listLoadBalancersOptions.Limit))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancers", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateLoadBalancer : Create a load balancer
// This request creates and provisions a new load balancer.
func (vpc *VpcV1) CreateLoadBalancer(createLoadBalancerOptions *CreateLoadBalancerOptions) (result *LoadBalancer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateLoadBalancerWithContext(context.Background(), createLoadBalancerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateLoadBalancerWithContext is an alternate form of the CreateLoadBalancer method which supports a Context parameter
func (vpc *VpcV1) CreateLoadBalancerWithContext(ctx context.Context, createLoadBalancerOptions *CreateLoadBalancerOptions) (result *LoadBalancer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createLoadBalancerOptions, "createLoadBalancerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createLoadBalancerOptions, "createLoadBalancerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateLoadBalancer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createLoadBalancerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createLoadBalancerOptions.IsPublic != nil {
		body["is_public"] = createLoadBalancerOptions.IsPublic
	}
	if createLoadBalancerOptions.Subnets != nil {
		body["subnets"] = createLoadBalancerOptions.Subnets
	}
	if createLoadBalancerOptions.Dns != nil {
		body["dns"] = createLoadBalancerOptions.Dns
	}
	if createLoadBalancerOptions.IsPrivatePath != nil {
		body["is_private_path"] = createLoadBalancerOptions.IsPrivatePath
	}
	if createLoadBalancerOptions.Listeners != nil {
		body["listeners"] = createLoadBalancerOptions.Listeners
	}
	if createLoadBalancerOptions.Logging != nil {
		body["logging"] = createLoadBalancerOptions.Logging
	}
	if createLoadBalancerOptions.Name != nil {
		body["name"] = createLoadBalancerOptions.Name
	}
	if createLoadBalancerOptions.Pools != nil {
		body["pools"] = createLoadBalancerOptions.Pools
	}
	if createLoadBalancerOptions.Profile != nil {
		body["profile"] = createLoadBalancerOptions.Profile
	}
	if createLoadBalancerOptions.ResourceGroup != nil {
		body["resource_group"] = createLoadBalancerOptions.ResourceGroup
	}
	if createLoadBalancerOptions.RouteMode != nil {
		body["route_mode"] = createLoadBalancerOptions.RouteMode
	}
	if createLoadBalancerOptions.SecurityGroups != nil {
		body["security_groups"] = createLoadBalancerOptions.SecurityGroups
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_load_balancer", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteLoadBalancer : Delete a load balancer
// This request deletes a load balancer. This operation cannot be reversed. A load balancer cannot be deleted if its
// `provisioning_status` is `delete_pending` or it is referenced by a resource.
func (vpc *VpcV1) DeleteLoadBalancer(deleteLoadBalancerOptions *DeleteLoadBalancerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteLoadBalancerWithContext(context.Background(), deleteLoadBalancerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteLoadBalancerWithContext is an alternate form of the DeleteLoadBalancer method which supports a Context parameter
func (vpc *VpcV1) DeleteLoadBalancerWithContext(ctx context.Context, deleteLoadBalancerOptions *DeleteLoadBalancerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteLoadBalancerOptions, "deleteLoadBalancerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteLoadBalancerOptions, "deleteLoadBalancerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteLoadBalancerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteLoadBalancer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteLoadBalancerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	if deleteLoadBalancerOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*deleteLoadBalancerOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_load_balancer", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetLoadBalancer : Retrieve a load balancer
// This request retrieves a single load balancer specified by the identifier in the URL path.
func (vpc *VpcV1) GetLoadBalancer(getLoadBalancerOptions *GetLoadBalancerOptions) (result *LoadBalancer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerWithContext(context.Background(), getLoadBalancerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerWithContext is an alternate form of the GetLoadBalancer method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerWithContext(ctx context.Context, getLoadBalancerOptions *GetLoadBalancerOptions) (result *LoadBalancer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerOptions, "getLoadBalancerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerOptions, "getLoadBalancerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getLoadBalancerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateLoadBalancer : Update a load balancer
// This request updates a load balancer with the information in a provided load balancer patch. The load balancer patch
// object is structured in the same way as a retrieved load balancer and contains only the information to be updated. A
// load balancer can only be updated if its `provisioning_status` is `active`.
func (vpc *VpcV1) UpdateLoadBalancer(updateLoadBalancerOptions *UpdateLoadBalancerOptions) (result *LoadBalancer, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateLoadBalancerWithContext(context.Background(), updateLoadBalancerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateLoadBalancerWithContext is an alternate form of the UpdateLoadBalancer method which supports a Context parameter
func (vpc *VpcV1) UpdateLoadBalancerWithContext(ctx context.Context, updateLoadBalancerOptions *UpdateLoadBalancerOptions) (result *LoadBalancer, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateLoadBalancerOptions, "updateLoadBalancerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateLoadBalancerOptions, "updateLoadBalancerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateLoadBalancerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateLoadBalancer")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateLoadBalancerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")
	if updateLoadBalancerOptions.IfMatch != nil {
		builder.AddHeader("If-Match", fmt.Sprint(*updateLoadBalancerOptions.IfMatch))
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateLoadBalancerOptions.LoadBalancerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_load_balancer", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancer)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetLoadBalancerStatistics : List statistics of a load balancer
// This request lists statistics of a load balancer.
func (vpc *VpcV1) GetLoadBalancerStatistics(getLoadBalancerStatisticsOptions *GetLoadBalancerStatisticsOptions) (result *LoadBalancerStatistics, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerStatisticsWithContext(context.Background(), getLoadBalancerStatisticsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerStatisticsWithContext is an alternate form of the GetLoadBalancerStatistics method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerStatisticsWithContext(ctx context.Context, getLoadBalancerStatisticsOptions *GetLoadBalancerStatisticsOptions) (result *LoadBalancerStatistics, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerStatisticsOptions, "getLoadBalancerStatisticsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerStatisticsOptions, "getLoadBalancerStatisticsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getLoadBalancerStatisticsOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{id}/statistics`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerStatistics")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerStatisticsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_statistics", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerStatistics)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancerListeners : List listeners for a load balancer
// This request lists listeners for a load balancer.
func (vpc *VpcV1) ListLoadBalancerListeners(listLoadBalancerListenersOptions *ListLoadBalancerListenersOptions) (result *LoadBalancerListenerCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancerListenersWithContext(context.Background(), listLoadBalancerListenersOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancerListenersWithContext is an alternate form of the ListLoadBalancerListeners method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancerListenersWithContext(ctx context.Context, listLoadBalancerListenersOptions *ListLoadBalancerListenersOptions) (result *LoadBalancerListenerCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listLoadBalancerListenersOptions, "listLoadBalancerListenersOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listLoadBalancerListenersOptions, "listLoadBalancerListenersOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *listLoadBalancerListenersOptions.LoadBalancerID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancerListeners")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancerListenersOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancer_listeners", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateLoadBalancerListener : Create a listener for a load balancer
// This request creates a new listener for a load balancer.
func (vpc *VpcV1) CreateLoadBalancerListener(createLoadBalancerListenerOptions *CreateLoadBalancerListenerOptions) (result *LoadBalancerListener, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateLoadBalancerListenerWithContext(context.Background(), createLoadBalancerListenerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateLoadBalancerListenerWithContext is an alternate form of the CreateLoadBalancerListener method which supports a Context parameter
func (vpc *VpcV1) CreateLoadBalancerListenerWithContext(ctx context.Context, createLoadBalancerListenerOptions *CreateLoadBalancerListenerOptions) (result *LoadBalancerListener, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createLoadBalancerListenerOptions, "createLoadBalancerListenerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createLoadBalancerListenerOptions, "createLoadBalancerListenerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *createLoadBalancerListenerOptions.LoadBalancerID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateLoadBalancerListener")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createLoadBalancerListenerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createLoadBalancerListenerOptions.Protocol != nil {
		body["protocol"] = createLoadBalancerListenerOptions.Protocol
	}
	if createLoadBalancerListenerOptions.AcceptProxyProtocol != nil {
		body["accept_proxy_protocol"] = createLoadBalancerListenerOptions.AcceptProxyProtocol
	}
	if createLoadBalancerListenerOptions.CertificateInstance != nil {
		body["certificate_instance"] = createLoadBalancerListenerOptions.CertificateInstance
	}
	if createLoadBalancerListenerOptions.ConnectionLimit != nil {
		body["connection_limit"] = createLoadBalancerListenerOptions.ConnectionLimit
	}
	if createLoadBalancerListenerOptions.DefaultPool != nil {
		body["default_pool"] = createLoadBalancerListenerOptions.DefaultPool
	}
	if createLoadBalancerListenerOptions.HTTPSRedirect != nil {
		body["https_redirect"] = createLoadBalancerListenerOptions.HTTPSRedirect
	}
	if createLoadBalancerListenerOptions.IdleConnectionTimeout != nil {
		body["idle_connection_timeout"] = createLoadBalancerListenerOptions.IdleConnectionTimeout
	}
	if createLoadBalancerListenerOptions.Policies != nil {
		body["policies"] = createLoadBalancerListenerOptions.Policies
	}
	if createLoadBalancerListenerOptions.Port != nil {
		body["port"] = createLoadBalancerListenerOptions.Port
	}
	if createLoadBalancerListenerOptions.PortMax != nil {
		body["port_max"] = createLoadBalancerListenerOptions.PortMax
	}
	if createLoadBalancerListenerOptions.PortMin != nil {
		body["port_min"] = createLoadBalancerListenerOptions.PortMin
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_load_balancer_listener", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListener)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteLoadBalancerListener : Delete a load balancer listener
// This request deletes a load balancer listener. This operation cannot be reversed. For this operation to succeed, the
// listener must not be the target of another load balancer listener.
func (vpc *VpcV1) DeleteLoadBalancerListener(deleteLoadBalancerListenerOptions *DeleteLoadBalancerListenerOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteLoadBalancerListenerWithContext(context.Background(), deleteLoadBalancerListenerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteLoadBalancerListenerWithContext is an alternate form of the DeleteLoadBalancerListener method which supports a Context parameter
func (vpc *VpcV1) DeleteLoadBalancerListenerWithContext(ctx context.Context, deleteLoadBalancerListenerOptions *DeleteLoadBalancerListenerOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteLoadBalancerListenerOptions, "deleteLoadBalancerListenerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteLoadBalancerListenerOptions, "deleteLoadBalancerListenerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *deleteLoadBalancerListenerOptions.LoadBalancerID,
		"id":               *deleteLoadBalancerListenerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteLoadBalancerListener")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteLoadBalancerListenerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_load_balancer_listener", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetLoadBalancerListener : Retrieve a load balancer listener
// This request retrieves a single listener specified by the identifier in the URL path.
func (vpc *VpcV1) GetLoadBalancerListener(getLoadBalancerListenerOptions *GetLoadBalancerListenerOptions) (result *LoadBalancerListener, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerListenerWithContext(context.Background(), getLoadBalancerListenerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerListenerWithContext is an alternate form of the GetLoadBalancerListener method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerListenerWithContext(ctx context.Context, getLoadBalancerListenerOptions *GetLoadBalancerListenerOptions) (result *LoadBalancerListener, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerListenerOptions, "getLoadBalancerListenerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerListenerOptions, "getLoadBalancerListenerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *getLoadBalancerListenerOptions.LoadBalancerID,
		"id":               *getLoadBalancerListenerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerListener")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerListenerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_listener", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListener)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateLoadBalancerListener : Update a load balancer listener
// This request updates a load balancer listener from a listener patch.
func (vpc *VpcV1) UpdateLoadBalancerListener(updateLoadBalancerListenerOptions *UpdateLoadBalancerListenerOptions) (result *LoadBalancerListener, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateLoadBalancerListenerWithContext(context.Background(), updateLoadBalancerListenerOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateLoadBalancerListenerWithContext is an alternate form of the UpdateLoadBalancerListener method which supports a Context parameter
func (vpc *VpcV1) UpdateLoadBalancerListenerWithContext(ctx context.Context, updateLoadBalancerListenerOptions *UpdateLoadBalancerListenerOptions) (result *LoadBalancerListener, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateLoadBalancerListenerOptions, "updateLoadBalancerListenerOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateLoadBalancerListenerOptions, "updateLoadBalancerListenerOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *updateLoadBalancerListenerOptions.LoadBalancerID,
		"id":               *updateLoadBalancerListenerOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateLoadBalancerListener")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateLoadBalancerListenerOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateLoadBalancerListenerOptions.LoadBalancerListenerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_load_balancer_listener", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListener)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancerListenerPolicies : List policies for a load balancer listener
// This request lists policies for a load balancer listener. A policy consists of rules to match against each incoming
// request, and an action to apply to the request if a rule matches.
func (vpc *VpcV1) ListLoadBalancerListenerPolicies(listLoadBalancerListenerPoliciesOptions *ListLoadBalancerListenerPoliciesOptions) (result *LoadBalancerListenerPolicyCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancerListenerPoliciesWithContext(context.Background(), listLoadBalancerListenerPoliciesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancerListenerPoliciesWithContext is an alternate form of the ListLoadBalancerListenerPolicies method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancerListenerPoliciesWithContext(ctx context.Context, listLoadBalancerListenerPoliciesOptions *ListLoadBalancerListenerPoliciesOptions) (result *LoadBalancerListenerPolicyCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listLoadBalancerListenerPoliciesOptions, "listLoadBalancerListenerPoliciesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listLoadBalancerListenerPoliciesOptions, "listLoadBalancerListenerPoliciesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *listLoadBalancerListenerPoliciesOptions.LoadBalancerID,
		"listener_id":      *listLoadBalancerListenerPoliciesOptions.ListenerID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancerListenerPolicies")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancerListenerPoliciesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancer_listener_policies", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicyCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateLoadBalancerListenerPolicy : Create a policy for a load balancer listener
// This request creates a new policy from a load balancer listener policy object. The prototype object is structured in
// the same way as a retrieved policy, and contains the information necessary to create the new policy. For this request
// to succeed, the load balancer must be in the `application` family.
func (vpc *VpcV1) CreateLoadBalancerListenerPolicy(createLoadBalancerListenerPolicyOptions *CreateLoadBalancerListenerPolicyOptions) (result *LoadBalancerListenerPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateLoadBalancerListenerPolicyWithContext(context.Background(), createLoadBalancerListenerPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateLoadBalancerListenerPolicyWithContext is an alternate form of the CreateLoadBalancerListenerPolicy method which supports a Context parameter
func (vpc *VpcV1) CreateLoadBalancerListenerPolicyWithContext(ctx context.Context, createLoadBalancerListenerPolicyOptions *CreateLoadBalancerListenerPolicyOptions) (result *LoadBalancerListenerPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createLoadBalancerListenerPolicyOptions, "createLoadBalancerListenerPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createLoadBalancerListenerPolicyOptions, "createLoadBalancerListenerPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *createLoadBalancerListenerPolicyOptions.LoadBalancerID,
		"listener_id":      *createLoadBalancerListenerPolicyOptions.ListenerID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateLoadBalancerListenerPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createLoadBalancerListenerPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createLoadBalancerListenerPolicyOptions.Action != nil {
		body["action"] = createLoadBalancerListenerPolicyOptions.Action
	}
	if createLoadBalancerListenerPolicyOptions.Priority != nil {
		body["priority"] = createLoadBalancerListenerPolicyOptions.Priority
	}
	if createLoadBalancerListenerPolicyOptions.Name != nil {
		body["name"] = createLoadBalancerListenerPolicyOptions.Name
	}
	if createLoadBalancerListenerPolicyOptions.Rules != nil {
		body["rules"] = createLoadBalancerListenerPolicyOptions.Rules
	}
	if createLoadBalancerListenerPolicyOptions.Target != nil {
		body["target"] = createLoadBalancerListenerPolicyOptions.Target
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_load_balancer_listener_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteLoadBalancerListenerPolicy : Delete a load balancer listener policy
// Deletes a policy of the load balancer listener. This operation cannot be reversed.
func (vpc *VpcV1) DeleteLoadBalancerListenerPolicy(deleteLoadBalancerListenerPolicyOptions *DeleteLoadBalancerListenerPolicyOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteLoadBalancerListenerPolicyWithContext(context.Background(), deleteLoadBalancerListenerPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteLoadBalancerListenerPolicyWithContext is an alternate form of the DeleteLoadBalancerListenerPolicy method which supports a Context parameter
func (vpc *VpcV1) DeleteLoadBalancerListenerPolicyWithContext(ctx context.Context, deleteLoadBalancerListenerPolicyOptions *DeleteLoadBalancerListenerPolicyOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteLoadBalancerListenerPolicyOptions, "deleteLoadBalancerListenerPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteLoadBalancerListenerPolicyOptions, "deleteLoadBalancerListenerPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *deleteLoadBalancerListenerPolicyOptions.LoadBalancerID,
		"listener_id":      *deleteLoadBalancerListenerPolicyOptions.ListenerID,
		"id":               *deleteLoadBalancerListenerPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteLoadBalancerListenerPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteLoadBalancerListenerPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_load_balancer_listener_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetLoadBalancerListenerPolicy : Retrieve a load balancer listener policy
// Retrieve a single policy specified by the identifier in the URL path.
func (vpc *VpcV1) GetLoadBalancerListenerPolicy(getLoadBalancerListenerPolicyOptions *GetLoadBalancerListenerPolicyOptions) (result *LoadBalancerListenerPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerListenerPolicyWithContext(context.Background(), getLoadBalancerListenerPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerListenerPolicyWithContext is an alternate form of the GetLoadBalancerListenerPolicy method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerListenerPolicyWithContext(ctx context.Context, getLoadBalancerListenerPolicyOptions *GetLoadBalancerListenerPolicyOptions) (result *LoadBalancerListenerPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerListenerPolicyOptions, "getLoadBalancerListenerPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerListenerPolicyOptions, "getLoadBalancerListenerPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *getLoadBalancerListenerPolicyOptions.LoadBalancerID,
		"listener_id":      *getLoadBalancerListenerPolicyOptions.ListenerID,
		"id":               *getLoadBalancerListenerPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerListenerPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerListenerPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_listener_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateLoadBalancerListenerPolicy : Update a load balancer listener policy
// This request updates a load balancer listener policy with the information in a provided policy patch. The policy
// patch object is structured in the same way as a retrieved policy and contains only the information to be updated.
func (vpc *VpcV1) UpdateLoadBalancerListenerPolicy(updateLoadBalancerListenerPolicyOptions *UpdateLoadBalancerListenerPolicyOptions) (result *LoadBalancerListenerPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateLoadBalancerListenerPolicyWithContext(context.Background(), updateLoadBalancerListenerPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateLoadBalancerListenerPolicyWithContext is an alternate form of the UpdateLoadBalancerListenerPolicy method which supports a Context parameter
func (vpc *VpcV1) UpdateLoadBalancerListenerPolicyWithContext(ctx context.Context, updateLoadBalancerListenerPolicyOptions *UpdateLoadBalancerListenerPolicyOptions) (result *LoadBalancerListenerPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateLoadBalancerListenerPolicyOptions, "updateLoadBalancerListenerPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateLoadBalancerListenerPolicyOptions, "updateLoadBalancerListenerPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *updateLoadBalancerListenerPolicyOptions.LoadBalancerID,
		"listener_id":      *updateLoadBalancerListenerPolicyOptions.ListenerID,
		"id":               *updateLoadBalancerListenerPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateLoadBalancerListenerPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateLoadBalancerListenerPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateLoadBalancerListenerPolicyOptions.LoadBalancerListenerPolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_load_balancer_listener_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancerListenerPolicyRules : List rules of a load balancer listener policy
// This request lists rules of a load balancer listener policy.
func (vpc *VpcV1) ListLoadBalancerListenerPolicyRules(listLoadBalancerListenerPolicyRulesOptions *ListLoadBalancerListenerPolicyRulesOptions) (result *LoadBalancerListenerPolicyRuleCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancerListenerPolicyRulesWithContext(context.Background(), listLoadBalancerListenerPolicyRulesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancerListenerPolicyRulesWithContext is an alternate form of the ListLoadBalancerListenerPolicyRules method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancerListenerPolicyRulesWithContext(ctx context.Context, listLoadBalancerListenerPolicyRulesOptions *ListLoadBalancerListenerPolicyRulesOptions) (result *LoadBalancerListenerPolicyRuleCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listLoadBalancerListenerPolicyRulesOptions, "listLoadBalancerListenerPolicyRulesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listLoadBalancerListenerPolicyRulesOptions, "listLoadBalancerListenerPolicyRulesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *listLoadBalancerListenerPolicyRulesOptions.LoadBalancerID,
		"listener_id":      *listLoadBalancerListenerPolicyRulesOptions.ListenerID,
		"policy_id":        *listLoadBalancerListenerPolicyRulesOptions.PolicyID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{policy_id}/rules`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancerListenerPolicyRules")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancerListenerPolicyRulesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancer_listener_policy_rules", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicyRuleCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateLoadBalancerListenerPolicyRule : Create a rule for a load balancer listener policy
// Creates a new rule for the load balancer listener policy.
func (vpc *VpcV1) CreateLoadBalancerListenerPolicyRule(createLoadBalancerListenerPolicyRuleOptions *CreateLoadBalancerListenerPolicyRuleOptions) (result *LoadBalancerListenerPolicyRule, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateLoadBalancerListenerPolicyRuleWithContext(context.Background(), createLoadBalancerListenerPolicyRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateLoadBalancerListenerPolicyRuleWithContext is an alternate form of the CreateLoadBalancerListenerPolicyRule method which supports a Context parameter
func (vpc *VpcV1) CreateLoadBalancerListenerPolicyRuleWithContext(ctx context.Context, createLoadBalancerListenerPolicyRuleOptions *CreateLoadBalancerListenerPolicyRuleOptions) (result *LoadBalancerListenerPolicyRule, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createLoadBalancerListenerPolicyRuleOptions, "createLoadBalancerListenerPolicyRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createLoadBalancerListenerPolicyRuleOptions, "createLoadBalancerListenerPolicyRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *createLoadBalancerListenerPolicyRuleOptions.LoadBalancerID,
		"listener_id":      *createLoadBalancerListenerPolicyRuleOptions.ListenerID,
		"policy_id":        *createLoadBalancerListenerPolicyRuleOptions.PolicyID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{policy_id}/rules`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateLoadBalancerListenerPolicyRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createLoadBalancerListenerPolicyRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createLoadBalancerListenerPolicyRuleOptions.Condition != nil {
		body["condition"] = createLoadBalancerListenerPolicyRuleOptions.Condition
	}
	if createLoadBalancerListenerPolicyRuleOptions.Type != nil {
		body["type"] = createLoadBalancerListenerPolicyRuleOptions.Type
	}
	if createLoadBalancerListenerPolicyRuleOptions.Value != nil {
		body["value"] = createLoadBalancerListenerPolicyRuleOptions.Value
	}
	if createLoadBalancerListenerPolicyRuleOptions.Field != nil {
		body["field"] = createLoadBalancerListenerPolicyRuleOptions.Field
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_load_balancer_listener_policy_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicyRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteLoadBalancerListenerPolicyRule : Delete a load balancer listener policy rule
// Deletes a rule from the load balancer listener policy. This operation cannot be reversed.
func (vpc *VpcV1) DeleteLoadBalancerListenerPolicyRule(deleteLoadBalancerListenerPolicyRuleOptions *DeleteLoadBalancerListenerPolicyRuleOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteLoadBalancerListenerPolicyRuleWithContext(context.Background(), deleteLoadBalancerListenerPolicyRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteLoadBalancerListenerPolicyRuleWithContext is an alternate form of the DeleteLoadBalancerListenerPolicyRule method which supports a Context parameter
func (vpc *VpcV1) DeleteLoadBalancerListenerPolicyRuleWithContext(ctx context.Context, deleteLoadBalancerListenerPolicyRuleOptions *DeleteLoadBalancerListenerPolicyRuleOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteLoadBalancerListenerPolicyRuleOptions, "deleteLoadBalancerListenerPolicyRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteLoadBalancerListenerPolicyRuleOptions, "deleteLoadBalancerListenerPolicyRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *deleteLoadBalancerListenerPolicyRuleOptions.LoadBalancerID,
		"listener_id":      *deleteLoadBalancerListenerPolicyRuleOptions.ListenerID,
		"policy_id":        *deleteLoadBalancerListenerPolicyRuleOptions.PolicyID,
		"id":               *deleteLoadBalancerListenerPolicyRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{policy_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteLoadBalancerListenerPolicyRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteLoadBalancerListenerPolicyRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_load_balancer_listener_policy_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetLoadBalancerListenerPolicyRule : Retrieve a load balancer listener policy rule
// Retrieves a single rule specified by the identifier in the URL path.
func (vpc *VpcV1) GetLoadBalancerListenerPolicyRule(getLoadBalancerListenerPolicyRuleOptions *GetLoadBalancerListenerPolicyRuleOptions) (result *LoadBalancerListenerPolicyRule, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerListenerPolicyRuleWithContext(context.Background(), getLoadBalancerListenerPolicyRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerListenerPolicyRuleWithContext is an alternate form of the GetLoadBalancerListenerPolicyRule method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerListenerPolicyRuleWithContext(ctx context.Context, getLoadBalancerListenerPolicyRuleOptions *GetLoadBalancerListenerPolicyRuleOptions) (result *LoadBalancerListenerPolicyRule, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerListenerPolicyRuleOptions, "getLoadBalancerListenerPolicyRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerListenerPolicyRuleOptions, "getLoadBalancerListenerPolicyRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *getLoadBalancerListenerPolicyRuleOptions.LoadBalancerID,
		"listener_id":      *getLoadBalancerListenerPolicyRuleOptions.ListenerID,
		"policy_id":        *getLoadBalancerListenerPolicyRuleOptions.PolicyID,
		"id":               *getLoadBalancerListenerPolicyRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{policy_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerListenerPolicyRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerListenerPolicyRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_listener_policy_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicyRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateLoadBalancerListenerPolicyRule : Update a load balancer listener policy rule
// Updates a rule of the load balancer listener policy.
func (vpc *VpcV1) UpdateLoadBalancerListenerPolicyRule(updateLoadBalancerListenerPolicyRuleOptions *UpdateLoadBalancerListenerPolicyRuleOptions) (result *LoadBalancerListenerPolicyRule, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateLoadBalancerListenerPolicyRuleWithContext(context.Background(), updateLoadBalancerListenerPolicyRuleOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateLoadBalancerListenerPolicyRuleWithContext is an alternate form of the UpdateLoadBalancerListenerPolicyRule method which supports a Context parameter
func (vpc *VpcV1) UpdateLoadBalancerListenerPolicyRuleWithContext(ctx context.Context, updateLoadBalancerListenerPolicyRuleOptions *UpdateLoadBalancerListenerPolicyRuleOptions) (result *LoadBalancerListenerPolicyRule, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateLoadBalancerListenerPolicyRuleOptions, "updateLoadBalancerListenerPolicyRuleOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateLoadBalancerListenerPolicyRuleOptions, "updateLoadBalancerListenerPolicyRuleOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *updateLoadBalancerListenerPolicyRuleOptions.LoadBalancerID,
		"listener_id":      *updateLoadBalancerListenerPolicyRuleOptions.ListenerID,
		"policy_id":        *updateLoadBalancerListenerPolicyRuleOptions.PolicyID,
		"id":               *updateLoadBalancerListenerPolicyRuleOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/listeners/{listener_id}/policies/{policy_id}/rules/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateLoadBalancerListenerPolicyRule")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateLoadBalancerListenerPolicyRuleOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateLoadBalancerListenerPolicyRuleOptions.LoadBalancerListenerPolicyRulePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_load_balancer_listener_policy_rule", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerListenerPolicyRule)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancerPools : List pools of a load balancer
// This request lists pools of a load balancer.
func (vpc *VpcV1) ListLoadBalancerPools(listLoadBalancerPoolsOptions *ListLoadBalancerPoolsOptions) (result *LoadBalancerPoolCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancerPoolsWithContext(context.Background(), listLoadBalancerPoolsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancerPoolsWithContext is an alternate form of the ListLoadBalancerPools method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancerPoolsWithContext(ctx context.Context, listLoadBalancerPoolsOptions *ListLoadBalancerPoolsOptions) (result *LoadBalancerPoolCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listLoadBalancerPoolsOptions, "listLoadBalancerPoolsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listLoadBalancerPoolsOptions, "listLoadBalancerPoolsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *listLoadBalancerPoolsOptions.LoadBalancerID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancerPools")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancerPoolsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancer_pools", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPoolCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateLoadBalancerPool : Create a load balancer pool
// This request creates a new pool from a pool prototype object.
func (vpc *VpcV1) CreateLoadBalancerPool(createLoadBalancerPoolOptions *CreateLoadBalancerPoolOptions) (result *LoadBalancerPool, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateLoadBalancerPoolWithContext(context.Background(), createLoadBalancerPoolOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateLoadBalancerPoolWithContext is an alternate form of the CreateLoadBalancerPool method which supports a Context parameter
func (vpc *VpcV1) CreateLoadBalancerPoolWithContext(ctx context.Context, createLoadBalancerPoolOptions *CreateLoadBalancerPoolOptions) (result *LoadBalancerPool, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createLoadBalancerPoolOptions, "createLoadBalancerPoolOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createLoadBalancerPoolOptions, "createLoadBalancerPoolOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *createLoadBalancerPoolOptions.LoadBalancerID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateLoadBalancerPool")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createLoadBalancerPoolOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createLoadBalancerPoolOptions.Algorithm != nil {
		body["algorithm"] = createLoadBalancerPoolOptions.Algorithm
	}
	if createLoadBalancerPoolOptions.HealthMonitor != nil {
		body["health_monitor"] = createLoadBalancerPoolOptions.HealthMonitor
	}
	if createLoadBalancerPoolOptions.Protocol != nil {
		body["protocol"] = createLoadBalancerPoolOptions.Protocol
	}
	if createLoadBalancerPoolOptions.FailsafePolicy != nil {
		body["failsafe_policy"] = createLoadBalancerPoolOptions.FailsafePolicy
	}
	if createLoadBalancerPoolOptions.Members != nil {
		body["members"] = createLoadBalancerPoolOptions.Members
	}
	if createLoadBalancerPoolOptions.Name != nil {
		body["name"] = createLoadBalancerPoolOptions.Name
	}
	if createLoadBalancerPoolOptions.ProxyProtocol != nil {
		body["proxy_protocol"] = createLoadBalancerPoolOptions.ProxyProtocol
	}
	if createLoadBalancerPoolOptions.SessionPersistence != nil {
		body["session_persistence"] = createLoadBalancerPoolOptions.SessionPersistence
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_load_balancer_pool", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPool)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteLoadBalancerPool : Delete a load balancer pool
// This request deletes a load balancer pool. This operation cannot be reversed. The pool must not currently be the
// default pool for any listener in the load balancer, nor be the target pool in the failsafe policy for any other pool.
func (vpc *VpcV1) DeleteLoadBalancerPool(deleteLoadBalancerPoolOptions *DeleteLoadBalancerPoolOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteLoadBalancerPoolWithContext(context.Background(), deleteLoadBalancerPoolOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteLoadBalancerPoolWithContext is an alternate form of the DeleteLoadBalancerPool method which supports a Context parameter
func (vpc *VpcV1) DeleteLoadBalancerPoolWithContext(ctx context.Context, deleteLoadBalancerPoolOptions *DeleteLoadBalancerPoolOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteLoadBalancerPoolOptions, "deleteLoadBalancerPoolOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteLoadBalancerPoolOptions, "deleteLoadBalancerPoolOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *deleteLoadBalancerPoolOptions.LoadBalancerID,
		"id":               *deleteLoadBalancerPoolOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteLoadBalancerPool")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteLoadBalancerPoolOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_load_balancer_pool", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetLoadBalancerPool : Retrieve a load balancer pool
// This request retrieves a single pool specified by the identifier in the URL path.
func (vpc *VpcV1) GetLoadBalancerPool(getLoadBalancerPoolOptions *GetLoadBalancerPoolOptions) (result *LoadBalancerPool, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerPoolWithContext(context.Background(), getLoadBalancerPoolOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerPoolWithContext is an alternate form of the GetLoadBalancerPool method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerPoolWithContext(ctx context.Context, getLoadBalancerPoolOptions *GetLoadBalancerPoolOptions) (result *LoadBalancerPool, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerPoolOptions, "getLoadBalancerPoolOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerPoolOptions, "getLoadBalancerPoolOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *getLoadBalancerPoolOptions.LoadBalancerID,
		"id":               *getLoadBalancerPoolOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerPool")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerPoolOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_pool", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPool)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateLoadBalancerPool : Update a load balancer pool
// This request updates a load balancer pool from a pool patch.
func (vpc *VpcV1) UpdateLoadBalancerPool(updateLoadBalancerPoolOptions *UpdateLoadBalancerPoolOptions) (result *LoadBalancerPool, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateLoadBalancerPoolWithContext(context.Background(), updateLoadBalancerPoolOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateLoadBalancerPoolWithContext is an alternate form of the UpdateLoadBalancerPool method which supports a Context parameter
func (vpc *VpcV1) UpdateLoadBalancerPoolWithContext(ctx context.Context, updateLoadBalancerPoolOptions *UpdateLoadBalancerPoolOptions) (result *LoadBalancerPool, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateLoadBalancerPoolOptions, "updateLoadBalancerPoolOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateLoadBalancerPoolOptions, "updateLoadBalancerPoolOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *updateLoadBalancerPoolOptions.LoadBalancerID,
		"id":               *updateLoadBalancerPoolOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateLoadBalancerPool")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateLoadBalancerPoolOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateLoadBalancerPoolOptions.LoadBalancerPoolPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_load_balancer_pool", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPool)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListLoadBalancerPoolMembers : List members of a load balancer pool
// This request lists members of a load balancer pool.
func (vpc *VpcV1) ListLoadBalancerPoolMembers(listLoadBalancerPoolMembersOptions *ListLoadBalancerPoolMembersOptions) (result *LoadBalancerPoolMemberCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListLoadBalancerPoolMembersWithContext(context.Background(), listLoadBalancerPoolMembersOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListLoadBalancerPoolMembersWithContext is an alternate form of the ListLoadBalancerPoolMembers method which supports a Context parameter
func (vpc *VpcV1) ListLoadBalancerPoolMembersWithContext(ctx context.Context, listLoadBalancerPoolMembersOptions *ListLoadBalancerPoolMembersOptions) (result *LoadBalancerPoolMemberCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listLoadBalancerPoolMembersOptions, "listLoadBalancerPoolMembersOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listLoadBalancerPoolMembersOptions, "listLoadBalancerPoolMembersOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *listLoadBalancerPoolMembersOptions.LoadBalancerID,
		"pool_id":          *listLoadBalancerPoolMembersOptions.PoolID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{pool_id}/members`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListLoadBalancerPoolMembers")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listLoadBalancerPoolMembersOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_load_balancer_pool_members", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPoolMemberCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateLoadBalancerPoolMember : Create a member in a load balancer pool
// This request creates a new member and adds the member to the pool.
//
// The pool must not already have a member targeting a load balancer.
func (vpc *VpcV1) CreateLoadBalancerPoolMember(createLoadBalancerPoolMemberOptions *CreateLoadBalancerPoolMemberOptions) (result *LoadBalancerPoolMember, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateLoadBalancerPoolMemberWithContext(context.Background(), createLoadBalancerPoolMemberOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateLoadBalancerPoolMemberWithContext is an alternate form of the CreateLoadBalancerPoolMember method which supports a Context parameter
func (vpc *VpcV1) CreateLoadBalancerPoolMemberWithContext(ctx context.Context, createLoadBalancerPoolMemberOptions *CreateLoadBalancerPoolMemberOptions) (result *LoadBalancerPoolMember, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createLoadBalancerPoolMemberOptions, "createLoadBalancerPoolMemberOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createLoadBalancerPoolMemberOptions, "createLoadBalancerPoolMemberOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *createLoadBalancerPoolMemberOptions.LoadBalancerID,
		"pool_id":          *createLoadBalancerPoolMemberOptions.PoolID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{pool_id}/members`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateLoadBalancerPoolMember")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createLoadBalancerPoolMemberOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createLoadBalancerPoolMemberOptions.Port != nil {
		body["port"] = createLoadBalancerPoolMemberOptions.Port
	}
	if createLoadBalancerPoolMemberOptions.Target != nil {
		body["target"] = createLoadBalancerPoolMemberOptions.Target
	}
	if createLoadBalancerPoolMemberOptions.Weight != nil {
		body["weight"] = createLoadBalancerPoolMemberOptions.Weight
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_load_balancer_pool_member", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPoolMember)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ReplaceLoadBalancerPoolMembers : Replace load balancer pool members
// This request replaces the existing members of the load balancer pool with new members created from the collection of
// member prototype objects.
func (vpc *VpcV1) ReplaceLoadBalancerPoolMembers(replaceLoadBalancerPoolMembersOptions *ReplaceLoadBalancerPoolMembersOptions) (result *LoadBalancerPoolMemberCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ReplaceLoadBalancerPoolMembersWithContext(context.Background(), replaceLoadBalancerPoolMembersOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ReplaceLoadBalancerPoolMembersWithContext is an alternate form of the ReplaceLoadBalancerPoolMembers method which supports a Context parameter
func (vpc *VpcV1) ReplaceLoadBalancerPoolMembersWithContext(ctx context.Context, replaceLoadBalancerPoolMembersOptions *ReplaceLoadBalancerPoolMembersOptions) (result *LoadBalancerPoolMemberCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(replaceLoadBalancerPoolMembersOptions, "replaceLoadBalancerPoolMembersOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(replaceLoadBalancerPoolMembersOptions, "replaceLoadBalancerPoolMembersOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *replaceLoadBalancerPoolMembersOptions.LoadBalancerID,
		"pool_id":          *replaceLoadBalancerPoolMembersOptions.PoolID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{pool_id}/members`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ReplaceLoadBalancerPoolMembers")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range replaceLoadBalancerPoolMembersOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if replaceLoadBalancerPoolMembersOptions.Members != nil {
		body["members"] = replaceLoadBalancerPoolMembersOptions.Members
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "replace_load_balancer_pool_members", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPoolMemberCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteLoadBalancerPoolMember : Delete a load balancer pool member
// This request deletes a member from the pool. This operation cannot be reversed.
func (vpc *VpcV1) DeleteLoadBalancerPoolMember(deleteLoadBalancerPoolMemberOptions *DeleteLoadBalancerPoolMemberOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteLoadBalancerPoolMemberWithContext(context.Background(), deleteLoadBalancerPoolMemberOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteLoadBalancerPoolMemberWithContext is an alternate form of the DeleteLoadBalancerPoolMember method which supports a Context parameter
func (vpc *VpcV1) DeleteLoadBalancerPoolMemberWithContext(ctx context.Context, deleteLoadBalancerPoolMemberOptions *DeleteLoadBalancerPoolMemberOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteLoadBalancerPoolMemberOptions, "deleteLoadBalancerPoolMemberOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteLoadBalancerPoolMemberOptions, "deleteLoadBalancerPoolMemberOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *deleteLoadBalancerPoolMemberOptions.LoadBalancerID,
		"pool_id":          *deleteLoadBalancerPoolMemberOptions.PoolID,
		"id":               *deleteLoadBalancerPoolMemberOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{pool_id}/members/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteLoadBalancerPoolMember")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteLoadBalancerPoolMemberOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_load_balancer_pool_member", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetLoadBalancerPoolMember : Retrieve a load balancer pool member
// This request retrieves a single member specified by the identifier in the URL path.
func (vpc *VpcV1) GetLoadBalancerPoolMember(getLoadBalancerPoolMemberOptions *GetLoadBalancerPoolMemberOptions) (result *LoadBalancerPoolMember, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetLoadBalancerPoolMemberWithContext(context.Background(), getLoadBalancerPoolMemberOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetLoadBalancerPoolMemberWithContext is an alternate form of the GetLoadBalancerPoolMember method which supports a Context parameter
func (vpc *VpcV1) GetLoadBalancerPoolMemberWithContext(ctx context.Context, getLoadBalancerPoolMemberOptions *GetLoadBalancerPoolMemberOptions) (result *LoadBalancerPoolMember, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getLoadBalancerPoolMemberOptions, "getLoadBalancerPoolMemberOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getLoadBalancerPoolMemberOptions, "getLoadBalancerPoolMemberOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *getLoadBalancerPoolMemberOptions.LoadBalancerID,
		"pool_id":          *getLoadBalancerPoolMemberOptions.PoolID,
		"id":               *getLoadBalancerPoolMemberOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{pool_id}/members/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetLoadBalancerPoolMember")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getLoadBalancerPoolMemberOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_load_balancer_pool_member", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPoolMember)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateLoadBalancerPoolMember : Update a load balancer pool member
// This request updates an existing member from a member patch.
func (vpc *VpcV1) UpdateLoadBalancerPoolMember(updateLoadBalancerPoolMemberOptions *UpdateLoadBalancerPoolMemberOptions) (result *LoadBalancerPoolMember, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateLoadBalancerPoolMemberWithContext(context.Background(), updateLoadBalancerPoolMemberOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateLoadBalancerPoolMemberWithContext is an alternate form of the UpdateLoadBalancerPoolMember method which supports a Context parameter
func (vpc *VpcV1) UpdateLoadBalancerPoolMemberWithContext(ctx context.Context, updateLoadBalancerPoolMemberOptions *UpdateLoadBalancerPoolMemberOptions) (result *LoadBalancerPoolMember, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateLoadBalancerPoolMemberOptions, "updateLoadBalancerPoolMemberOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateLoadBalancerPoolMemberOptions, "updateLoadBalancerPoolMemberOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"load_balancer_id": *updateLoadBalancerPoolMemberOptions.LoadBalancerID,
		"pool_id":          *updateLoadBalancerPoolMemberOptions.PoolID,
		"id":               *updateLoadBalancerPoolMemberOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/load_balancers/{load_balancer_id}/pools/{pool_id}/members/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateLoadBalancerPoolMember")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateLoadBalancerPoolMemberOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateLoadBalancerPoolMemberOptions.LoadBalancerPoolMemberPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_load_balancer_pool_member", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalLoadBalancerPoolMember)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListEndpointGateways : List endpoint gateways
// This request lists endpoint gateways in the region. An endpoint gateway maps one or more reserved IPs in a VPC to a
// target outside the VPC.
//
// The endpoint gateways will be sorted by their `created_at` property values, with newest endpoint gateway first.
// Endpoint gateways with identical `created_at` property values will in turn be sorted by ascending `name` property
// values.
func (vpc *VpcV1) ListEndpointGateways(listEndpointGatewaysOptions *ListEndpointGatewaysOptions) (result *EndpointGatewayCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListEndpointGatewaysWithContext(context.Background(), listEndpointGatewaysOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListEndpointGatewaysWithContext is an alternate form of the ListEndpointGateways method which supports a Context parameter
func (vpc *VpcV1) ListEndpointGatewaysWithContext(ctx context.Context, listEndpointGatewaysOptions *ListEndpointGatewaysOptions) (result *EndpointGatewayCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listEndpointGatewaysOptions, "listEndpointGatewaysOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListEndpointGateways")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listEndpointGatewaysOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listEndpointGatewaysOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listEndpointGatewaysOptions.Name))
	}
	if listEndpointGatewaysOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listEndpointGatewaysOptions.Start))
	}
	if listEndpointGatewaysOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listEndpointGatewaysOptions.Limit))
	}
	if listEndpointGatewaysOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listEndpointGatewaysOptions.ResourceGroupID))
	}
	if listEndpointGatewaysOptions.LifecycleState != nil {
		builder.AddQuery("lifecycle_state", strings.Join(listEndpointGatewaysOptions.LifecycleState, ","))
	}
	if listEndpointGatewaysOptions.VPCID != nil {
		builder.AddQuery("vpc.id", fmt.Sprint(*listEndpointGatewaysOptions.VPCID))
	}
	if listEndpointGatewaysOptions.VPCCRN != nil {
		builder.AddQuery("vpc.crn", fmt.Sprint(*listEndpointGatewaysOptions.VPCCRN))
	}
	if listEndpointGatewaysOptions.VPCName != nil {
		builder.AddQuery("vpc.name", fmt.Sprint(*listEndpointGatewaysOptions.VPCName))
	}
	if listEndpointGatewaysOptions.AllowDnsResolutionBinding != nil {
		builder.AddQuery("allow_dns_resolution_binding", fmt.Sprint(*listEndpointGatewaysOptions.AllowDnsResolutionBinding))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_endpoint_gateways", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalEndpointGatewayCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateEndpointGateway : Create an endpoint gateway
// This request creates a new endpoint gateway from an endpoint gateway prototype object. The prototype object is
// structured in the same way as a retrieved endpoint gateway, and contains the information necessary to create a new
// endpoint gateway. An endpoint gateway maps one or more reserved IPs in a VPC to a target service outside the VPC.
func (vpc *VpcV1) CreateEndpointGateway(createEndpointGatewayOptions *CreateEndpointGatewayOptions) (result *EndpointGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateEndpointGatewayWithContext(context.Background(), createEndpointGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateEndpointGatewayWithContext is an alternate form of the CreateEndpointGateway method which supports a Context parameter
func (vpc *VpcV1) CreateEndpointGatewayWithContext(ctx context.Context, createEndpointGatewayOptions *CreateEndpointGatewayOptions) (result *EndpointGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createEndpointGatewayOptions, "createEndpointGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createEndpointGatewayOptions, "createEndpointGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateEndpointGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createEndpointGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createEndpointGatewayOptions.Target != nil {
		body["target"] = createEndpointGatewayOptions.Target
	}
	if createEndpointGatewayOptions.VPC != nil {
		body["vpc"] = createEndpointGatewayOptions.VPC
	}
	if createEndpointGatewayOptions.AllowDnsResolutionBinding != nil {
		body["allow_dns_resolution_binding"] = createEndpointGatewayOptions.AllowDnsResolutionBinding
	}
	if createEndpointGatewayOptions.Ips != nil {
		body["ips"] = createEndpointGatewayOptions.Ips
	}
	if createEndpointGatewayOptions.Name != nil {
		body["name"] = createEndpointGatewayOptions.Name
	}
	if createEndpointGatewayOptions.ResourceGroup != nil {
		body["resource_group"] = createEndpointGatewayOptions.ResourceGroup
	}
	if createEndpointGatewayOptions.SecurityGroups != nil {
		body["security_groups"] = createEndpointGatewayOptions.SecurityGroups
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_endpoint_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalEndpointGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListEndpointGatewayIps : List reserved IPs bound to an endpoint gateway
// This request lists reserved IPs bound to an endpoint gateway.
func (vpc *VpcV1) ListEndpointGatewayIps(listEndpointGatewayIpsOptions *ListEndpointGatewayIpsOptions) (result *ReservedIPCollectionEndpointGatewayContext, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListEndpointGatewayIpsWithContext(context.Background(), listEndpointGatewayIpsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListEndpointGatewayIpsWithContext is an alternate form of the ListEndpointGatewayIps method which supports a Context parameter
func (vpc *VpcV1) ListEndpointGatewayIpsWithContext(ctx context.Context, listEndpointGatewayIpsOptions *ListEndpointGatewayIpsOptions) (result *ReservedIPCollectionEndpointGatewayContext, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listEndpointGatewayIpsOptions, "listEndpointGatewayIpsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listEndpointGatewayIpsOptions, "listEndpointGatewayIpsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"endpoint_gateway_id": *listEndpointGatewayIpsOptions.EndpointGatewayID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{endpoint_gateway_id}/ips`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListEndpointGatewayIps")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listEndpointGatewayIpsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listEndpointGatewayIpsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listEndpointGatewayIpsOptions.Start))
	}
	if listEndpointGatewayIpsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listEndpointGatewayIpsOptions.Limit))
	}
	if listEndpointGatewayIpsOptions.Sort != nil {
		builder.AddQuery("sort", fmt.Sprint(*listEndpointGatewayIpsOptions.Sort))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_endpoint_gateway_ips", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIPCollectionEndpointGatewayContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// RemoveEndpointGatewayIP : Unbind a reserved IP from an endpoint gateway
// This request unbinds the specified reserved IP from the specified endpoint gateway. If the reserved IP has
// `auto_delete` set to `true`, the reserved IP will be deleted.
func (vpc *VpcV1) RemoveEndpointGatewayIP(removeEndpointGatewayIPOptions *RemoveEndpointGatewayIPOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RemoveEndpointGatewayIPWithContext(context.Background(), removeEndpointGatewayIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RemoveEndpointGatewayIPWithContext is an alternate form of the RemoveEndpointGatewayIP method which supports a Context parameter
func (vpc *VpcV1) RemoveEndpointGatewayIPWithContext(ctx context.Context, removeEndpointGatewayIPOptions *RemoveEndpointGatewayIPOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(removeEndpointGatewayIPOptions, "removeEndpointGatewayIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(removeEndpointGatewayIPOptions, "removeEndpointGatewayIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"endpoint_gateway_id": *removeEndpointGatewayIPOptions.EndpointGatewayID,
		"id":                  *removeEndpointGatewayIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{endpoint_gateway_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RemoveEndpointGatewayIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range removeEndpointGatewayIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "remove_endpoint_gateway_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetEndpointGatewayIP : Retrieve a reserved IP bound to an endpoint gateway
// This request retrieves the specified reserved IP address if it is bound to the endpoint gateway specified in the URL.
func (vpc *VpcV1) GetEndpointGatewayIP(getEndpointGatewayIPOptions *GetEndpointGatewayIPOptions) (result *ReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetEndpointGatewayIPWithContext(context.Background(), getEndpointGatewayIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetEndpointGatewayIPWithContext is an alternate form of the GetEndpointGatewayIP method which supports a Context parameter
func (vpc *VpcV1) GetEndpointGatewayIPWithContext(ctx context.Context, getEndpointGatewayIPOptions *GetEndpointGatewayIPOptions) (result *ReservedIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getEndpointGatewayIPOptions, "getEndpointGatewayIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getEndpointGatewayIPOptions, "getEndpointGatewayIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"endpoint_gateway_id": *getEndpointGatewayIPOptions.EndpointGatewayID,
		"id":                  *getEndpointGatewayIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{endpoint_gateway_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetEndpointGatewayIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getEndpointGatewayIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_endpoint_gateway_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// AddEndpointGatewayIP : Bind a reserved IP to an endpoint gateway
// This request binds the specified reserved IP to the specified endpoint gateway. The reserved IP:
//
// - must currently be unbound, or not required by its target
// - must not be in the same zone as any other reserved IP bound to the endpoint gateway.
func (vpc *VpcV1) AddEndpointGatewayIP(addEndpointGatewayIPOptions *AddEndpointGatewayIPOptions) (result *ReservedIP, response *core.DetailedResponse, err error) {
	result, response, err = vpc.AddEndpointGatewayIPWithContext(context.Background(), addEndpointGatewayIPOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// AddEndpointGatewayIPWithContext is an alternate form of the AddEndpointGatewayIP method which supports a Context parameter
func (vpc *VpcV1) AddEndpointGatewayIPWithContext(ctx context.Context, addEndpointGatewayIPOptions *AddEndpointGatewayIPOptions) (result *ReservedIP, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(addEndpointGatewayIPOptions, "addEndpointGatewayIPOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(addEndpointGatewayIPOptions, "addEndpointGatewayIPOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"endpoint_gateway_id": *addEndpointGatewayIPOptions.EndpointGatewayID,
		"id":                  *addEndpointGatewayIPOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PUT)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{endpoint_gateway_id}/ips/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "AddEndpointGatewayIP")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range addEndpointGatewayIPOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "add_endpoint_gateway_ip", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalReservedIP)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteEndpointGateway : Delete an endpoint gateway
// This request deletes an endpoint gateway. This operation cannot be reversed.
//
// Reserved IPs that were bound to the endpoint gateway will be released if their
// `auto_delete` property is set to true.
func (vpc *VpcV1) DeleteEndpointGateway(deleteEndpointGatewayOptions *DeleteEndpointGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteEndpointGatewayWithContext(context.Background(), deleteEndpointGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteEndpointGatewayWithContext is an alternate form of the DeleteEndpointGateway method which supports a Context parameter
func (vpc *VpcV1) DeleteEndpointGatewayWithContext(ctx context.Context, deleteEndpointGatewayOptions *DeleteEndpointGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteEndpointGatewayOptions, "deleteEndpointGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteEndpointGatewayOptions, "deleteEndpointGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteEndpointGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteEndpointGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteEndpointGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_endpoint_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetEndpointGateway : Retrieve an endpoint gateway
// This request retrieves a single endpoint gateway specified by the identifier in the URL.
func (vpc *VpcV1) GetEndpointGateway(getEndpointGatewayOptions *GetEndpointGatewayOptions) (result *EndpointGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetEndpointGatewayWithContext(context.Background(), getEndpointGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetEndpointGatewayWithContext is an alternate form of the GetEndpointGateway method which supports a Context parameter
func (vpc *VpcV1) GetEndpointGatewayWithContext(ctx context.Context, getEndpointGatewayOptions *GetEndpointGatewayOptions) (result *EndpointGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getEndpointGatewayOptions, "getEndpointGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getEndpointGatewayOptions, "getEndpointGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getEndpointGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetEndpointGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getEndpointGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_endpoint_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalEndpointGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateEndpointGateway : Update an endpoint gateway
// This request updates an endpoint gateway with the information in a provided endpoint gateway patch. The endpoint
// gateway patch object is structured in the same way as a retrieved endpoint gateway and contains only the information
// to be updated.
func (vpc *VpcV1) UpdateEndpointGateway(updateEndpointGatewayOptions *UpdateEndpointGatewayOptions) (result *EndpointGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateEndpointGatewayWithContext(context.Background(), updateEndpointGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateEndpointGatewayWithContext is an alternate form of the UpdateEndpointGateway method which supports a Context parameter
func (vpc *VpcV1) UpdateEndpointGatewayWithContext(ctx context.Context, updateEndpointGatewayOptions *UpdateEndpointGatewayOptions) (result *EndpointGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateEndpointGatewayOptions, "updateEndpointGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateEndpointGatewayOptions, "updateEndpointGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateEndpointGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/endpoint_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateEndpointGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateEndpointGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateEndpointGatewayOptions.EndpointGatewayPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_endpoint_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalEndpointGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListFlowLogCollectors : List flow log collectors
// This request lists flow log collectors in the region. A [flow log
// collector](https://cloud.ibm.com/docs/vpc?topic=vpc-flow-logs) summarizes TCP and UDP data sent over the instance
// network interfaces and instance network attachments contained within its target. The collected flow logs are written
// to a cloud object storage bucket, where they can be [viewed](https://cloud.ibm.com/docs/vpc?topic=vpc-fl-analyze).
func (vpc *VpcV1) ListFlowLogCollectors(listFlowLogCollectorsOptions *ListFlowLogCollectorsOptions) (result *FlowLogCollectorCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListFlowLogCollectorsWithContext(context.Background(), listFlowLogCollectorsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListFlowLogCollectorsWithContext is an alternate form of the ListFlowLogCollectors method which supports a Context parameter
func (vpc *VpcV1) ListFlowLogCollectorsWithContext(ctx context.Context, listFlowLogCollectorsOptions *ListFlowLogCollectorsOptions) (result *FlowLogCollectorCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listFlowLogCollectorsOptions, "listFlowLogCollectorsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/flow_log_collectors`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListFlowLogCollectors")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listFlowLogCollectorsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listFlowLogCollectorsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listFlowLogCollectorsOptions.Start))
	}
	if listFlowLogCollectorsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listFlowLogCollectorsOptions.Limit))
	}
	if listFlowLogCollectorsOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listFlowLogCollectorsOptions.ResourceGroupID))
	}
	if listFlowLogCollectorsOptions.Name != nil {
		builder.AddQuery("name", fmt.Sprint(*listFlowLogCollectorsOptions.Name))
	}
	if listFlowLogCollectorsOptions.VPCID != nil {
		builder.AddQuery("vpc.id", fmt.Sprint(*listFlowLogCollectorsOptions.VPCID))
	}
	if listFlowLogCollectorsOptions.VPCCRN != nil {
		builder.AddQuery("vpc.crn", fmt.Sprint(*listFlowLogCollectorsOptions.VPCCRN))
	}
	if listFlowLogCollectorsOptions.VPCName != nil {
		builder.AddQuery("vpc.name", fmt.Sprint(*listFlowLogCollectorsOptions.VPCName))
	}
	if listFlowLogCollectorsOptions.TargetID != nil {
		builder.AddQuery("target.id", fmt.Sprint(*listFlowLogCollectorsOptions.TargetID))
	}
	if listFlowLogCollectorsOptions.TargetResourceType != nil {
		builder.AddQuery("target.resource_type", fmt.Sprint(*listFlowLogCollectorsOptions.TargetResourceType))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_flow_log_collectors", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFlowLogCollectorCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreateFlowLogCollector : Create a flow log collector
// This request creates and starts a new flow log collector from a flow log collector prototype object. The prototype
// object is structured in the same way as a retrieved flow log collector, and contains the information necessary to
// create and start the new flow log collector.
func (vpc *VpcV1) CreateFlowLogCollector(createFlowLogCollectorOptions *CreateFlowLogCollectorOptions) (result *FlowLogCollector, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreateFlowLogCollectorWithContext(context.Background(), createFlowLogCollectorOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreateFlowLogCollectorWithContext is an alternate form of the CreateFlowLogCollector method which supports a Context parameter
func (vpc *VpcV1) CreateFlowLogCollectorWithContext(ctx context.Context, createFlowLogCollectorOptions *CreateFlowLogCollectorOptions) (result *FlowLogCollector, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createFlowLogCollectorOptions, "createFlowLogCollectorOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createFlowLogCollectorOptions, "createFlowLogCollectorOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/flow_log_collectors`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreateFlowLogCollector")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createFlowLogCollectorOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createFlowLogCollectorOptions.StorageBucket != nil {
		body["storage_bucket"] = createFlowLogCollectorOptions.StorageBucket
	}
	if createFlowLogCollectorOptions.Target != nil {
		body["target"] = createFlowLogCollectorOptions.Target
	}
	if createFlowLogCollectorOptions.Active != nil {
		body["active"] = createFlowLogCollectorOptions.Active
	}
	if createFlowLogCollectorOptions.Name != nil {
		body["name"] = createFlowLogCollectorOptions.Name
	}
	if createFlowLogCollectorOptions.ResourceGroup != nil {
		body["resource_group"] = createFlowLogCollectorOptions.ResourceGroup
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_flow_log_collector", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFlowLogCollector)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeleteFlowLogCollector : Delete a flow log collector
// This request stops and deletes a flow log collector. This operation cannot be reversed.
//
// Collected flow logs remain available within the flow log collector's Cloud Object Storage bucket.
func (vpc *VpcV1) DeleteFlowLogCollector(deleteFlowLogCollectorOptions *DeleteFlowLogCollectorOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeleteFlowLogCollectorWithContext(context.Background(), deleteFlowLogCollectorOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeleteFlowLogCollectorWithContext is an alternate form of the DeleteFlowLogCollector method which supports a Context parameter
func (vpc *VpcV1) DeleteFlowLogCollectorWithContext(ctx context.Context, deleteFlowLogCollectorOptions *DeleteFlowLogCollectorOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deleteFlowLogCollectorOptions, "deleteFlowLogCollectorOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deleteFlowLogCollectorOptions, "deleteFlowLogCollectorOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deleteFlowLogCollectorOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/flow_log_collectors/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeleteFlowLogCollector")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deleteFlowLogCollectorOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_flow_log_collector", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetFlowLogCollector : Retrieve a flow log collector
// This request retrieves a single flow log collector specified by the identifier in the URL.
func (vpc *VpcV1) GetFlowLogCollector(getFlowLogCollectorOptions *GetFlowLogCollectorOptions) (result *FlowLogCollector, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetFlowLogCollectorWithContext(context.Background(), getFlowLogCollectorOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetFlowLogCollectorWithContext is an alternate form of the GetFlowLogCollector method which supports a Context parameter
func (vpc *VpcV1) GetFlowLogCollectorWithContext(ctx context.Context, getFlowLogCollectorOptions *GetFlowLogCollectorOptions) (result *FlowLogCollector, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getFlowLogCollectorOptions, "getFlowLogCollectorOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getFlowLogCollectorOptions, "getFlowLogCollectorOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getFlowLogCollectorOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/flow_log_collectors/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetFlowLogCollector")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getFlowLogCollectorOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_flow_log_collector", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFlowLogCollector)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdateFlowLogCollector : Update a flow log collector
// This request updates a flow log collector with the information in a provided flow log collector patch. The flow log
// collector patch object is structured in the same way as a retrieved flow log collector and contains only the
// information to be updated.
func (vpc *VpcV1) UpdateFlowLogCollector(updateFlowLogCollectorOptions *UpdateFlowLogCollectorOptions) (result *FlowLogCollector, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdateFlowLogCollectorWithContext(context.Background(), updateFlowLogCollectorOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdateFlowLogCollectorWithContext is an alternate form of the UpdateFlowLogCollector method which supports a Context parameter
func (vpc *VpcV1) UpdateFlowLogCollectorWithContext(ctx context.Context, updateFlowLogCollectorOptions *UpdateFlowLogCollectorOptions) (result *FlowLogCollector, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updateFlowLogCollectorOptions, "updateFlowLogCollectorOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updateFlowLogCollectorOptions, "updateFlowLogCollectorOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updateFlowLogCollectorOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/flow_log_collectors/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdateFlowLogCollector")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updateFlowLogCollectorOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updateFlowLogCollectorOptions.FlowLogCollectorPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_flow_log_collector", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalFlowLogCollector)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListPrivatePathServiceGateways : List private path service gateways
// This request lists private path service gateways in the region. Private path service gateways allow
// [service
// providers](https://cloud.ibm.com/docs/private-path?topic=private-path-private-path-service-architecture#private-path-service-components)
// to make their services available using
// [private path
// connectivity](https://cloud.ibm.com/docs/private-path?topic=private-path-private-path-service-architecture#private-path-service-components).
// Private path service gateways are used to facilitate and manage the private path connectivity between private path
// network load balancers and their associated endpoint gateways.
func (vpc *VpcV1) ListPrivatePathServiceGateways(listPrivatePathServiceGatewaysOptions *ListPrivatePathServiceGatewaysOptions) (result *PrivatePathServiceGatewayCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListPrivatePathServiceGatewaysWithContext(context.Background(), listPrivatePathServiceGatewaysOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListPrivatePathServiceGatewaysWithContext is an alternate form of the ListPrivatePathServiceGateways method which supports a Context parameter
func (vpc *VpcV1) ListPrivatePathServiceGatewaysWithContext(ctx context.Context, listPrivatePathServiceGatewaysOptions *ListPrivatePathServiceGatewaysOptions) (result *PrivatePathServiceGatewayCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateStruct(listPrivatePathServiceGatewaysOptions, "listPrivatePathServiceGatewaysOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListPrivatePathServiceGateways")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listPrivatePathServiceGatewaysOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listPrivatePathServiceGatewaysOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listPrivatePathServiceGatewaysOptions.Start))
	}
	if listPrivatePathServiceGatewaysOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listPrivatePathServiceGatewaysOptions.Limit))
	}
	if listPrivatePathServiceGatewaysOptions.ResourceGroupID != nil {
		builder.AddQuery("resource_group.id", fmt.Sprint(*listPrivatePathServiceGatewaysOptions.ResourceGroupID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_private_path_service_gateways", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreatePrivatePathServiceGateway : Create a private path service gateway
// This request creates a private path service gateway from a private path service gateway prototype object. The
// prototype object is structured in the same way as a retrieved private path service gateway, and contains the
// information necessary to create the new private path service gateway.
func (vpc *VpcV1) CreatePrivatePathServiceGateway(createPrivatePathServiceGatewayOptions *CreatePrivatePathServiceGatewayOptions) (result *PrivatePathServiceGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreatePrivatePathServiceGatewayWithContext(context.Background(), createPrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreatePrivatePathServiceGatewayWithContext is an alternate form of the CreatePrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) CreatePrivatePathServiceGatewayWithContext(ctx context.Context, createPrivatePathServiceGatewayOptions *CreatePrivatePathServiceGatewayOptions) (result *PrivatePathServiceGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createPrivatePathServiceGatewayOptions, "createPrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createPrivatePathServiceGatewayOptions, "createPrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways`, nil)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreatePrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createPrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createPrivatePathServiceGatewayOptions.LoadBalancer != nil {
		body["load_balancer"] = createPrivatePathServiceGatewayOptions.LoadBalancer
	}
	if createPrivatePathServiceGatewayOptions.ServiceEndpoints != nil {
		body["service_endpoints"] = createPrivatePathServiceGatewayOptions.ServiceEndpoints
	}
	if createPrivatePathServiceGatewayOptions.DefaultAccessPolicy != nil {
		body["default_access_policy"] = createPrivatePathServiceGatewayOptions.DefaultAccessPolicy
	}
	if createPrivatePathServiceGatewayOptions.Name != nil {
		body["name"] = createPrivatePathServiceGatewayOptions.Name
	}
	if createPrivatePathServiceGatewayOptions.ResourceGroup != nil {
		body["resource_group"] = createPrivatePathServiceGatewayOptions.ResourceGroup
	}
	if createPrivatePathServiceGatewayOptions.ZonalAffinity != nil {
		body["zonal_affinity"] = createPrivatePathServiceGatewayOptions.ZonalAffinity
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeletePrivatePathServiceGateway : Delete a private path service gateway
// This request deletes a private path service gateway.  For this request to succeed, the value of
// `endpoint_gateway_count` must be `0`. This operation cannot be reversed.
func (vpc *VpcV1) DeletePrivatePathServiceGateway(deletePrivatePathServiceGatewayOptions *DeletePrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeletePrivatePathServiceGatewayWithContext(context.Background(), deletePrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeletePrivatePathServiceGatewayWithContext is an alternate form of the DeletePrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) DeletePrivatePathServiceGatewayWithContext(ctx context.Context, deletePrivatePathServiceGatewayOptions *DeletePrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deletePrivatePathServiceGatewayOptions, "deletePrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deletePrivatePathServiceGatewayOptions, "deletePrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *deletePrivatePathServiceGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeletePrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deletePrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetPrivatePathServiceGateway : Retrieve a private path service gateway
// This request retrieves the private path service gateway specified by the identifier in the URL.
func (vpc *VpcV1) GetPrivatePathServiceGateway(getPrivatePathServiceGatewayOptions *GetPrivatePathServiceGatewayOptions) (result *PrivatePathServiceGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetPrivatePathServiceGatewayWithContext(context.Background(), getPrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetPrivatePathServiceGatewayWithContext is an alternate form of the GetPrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) GetPrivatePathServiceGatewayWithContext(ctx context.Context, getPrivatePathServiceGatewayOptions *GetPrivatePathServiceGatewayOptions) (result *PrivatePathServiceGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getPrivatePathServiceGatewayOptions, "getPrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getPrivatePathServiceGatewayOptions, "getPrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *getPrivatePathServiceGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetPrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getPrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdatePrivatePathServiceGateway : Update a private path service gateway
// This request updates a private path service gateway with the information provided in a private path service gateway
// patch object. The private path service gateway patch object is structured in the same way as a retrieved private path
// service gateway and contains only the information to be updated.
func (vpc *VpcV1) UpdatePrivatePathServiceGateway(updatePrivatePathServiceGatewayOptions *UpdatePrivatePathServiceGatewayOptions) (result *PrivatePathServiceGateway, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdatePrivatePathServiceGatewayWithContext(context.Background(), updatePrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdatePrivatePathServiceGatewayWithContext is an alternate form of the UpdatePrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) UpdatePrivatePathServiceGatewayWithContext(ctx context.Context, updatePrivatePathServiceGatewayOptions *UpdatePrivatePathServiceGatewayOptions) (result *PrivatePathServiceGateway, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updatePrivatePathServiceGatewayOptions, "updatePrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updatePrivatePathServiceGatewayOptions, "updatePrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"id": *updatePrivatePathServiceGatewayOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdatePrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updatePrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updatePrivatePathServiceGatewayOptions.PrivatePathServiceGatewayPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGateway)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListPrivatePathServiceGatewayAccountPolicies : List account policies for a private path service gateway
// This request lists account policies for a private path service gateway. Each policy defines how requests to use the
// private path service gateway from that account will be handled.
//
// The account policies will be sorted by their `created_at` property values, with newest account policies first.
// Account policies with identical `created_at` property values will in turn be sorted by ascending `id` property
// values.
func (vpc *VpcV1) ListPrivatePathServiceGatewayAccountPolicies(listPrivatePathServiceGatewayAccountPoliciesOptions *ListPrivatePathServiceGatewayAccountPoliciesOptions) (result *PrivatePathServiceGatewayAccountPolicyCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListPrivatePathServiceGatewayAccountPoliciesWithContext(context.Background(), listPrivatePathServiceGatewayAccountPoliciesOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListPrivatePathServiceGatewayAccountPoliciesWithContext is an alternate form of the ListPrivatePathServiceGatewayAccountPolicies method which supports a Context parameter
func (vpc *VpcV1) ListPrivatePathServiceGatewayAccountPoliciesWithContext(ctx context.Context, listPrivatePathServiceGatewayAccountPoliciesOptions *ListPrivatePathServiceGatewayAccountPoliciesOptions) (result *PrivatePathServiceGatewayAccountPolicyCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listPrivatePathServiceGatewayAccountPoliciesOptions, "listPrivatePathServiceGatewayAccountPoliciesOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listPrivatePathServiceGatewayAccountPoliciesOptions, "listPrivatePathServiceGatewayAccountPoliciesOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *listPrivatePathServiceGatewayAccountPoliciesOptions.PrivatePathServiceGatewayID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/account_policies`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListPrivatePathServiceGatewayAccountPolicies")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listPrivatePathServiceGatewayAccountPoliciesOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listPrivatePathServiceGatewayAccountPoliciesOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listPrivatePathServiceGatewayAccountPoliciesOptions.Start))
	}
	if listPrivatePathServiceGatewayAccountPoliciesOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listPrivatePathServiceGatewayAccountPoliciesOptions.Limit))
	}
	if listPrivatePathServiceGatewayAccountPoliciesOptions.AccountID != nil {
		builder.AddQuery("account.id", fmt.Sprint(*listPrivatePathServiceGatewayAccountPoliciesOptions.AccountID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_private_path_service_gateway_account_policies", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayAccountPolicyCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// CreatePrivatePathServiceGatewayAccountPolicy : Create an account policy for a private path service gateway
// This request creates an account policy from an account policy prototype object. The prototype object is structured in
// the same way as a retrieved account policy, and contains the information necessary to create the new account policy.
func (vpc *VpcV1) CreatePrivatePathServiceGatewayAccountPolicy(createPrivatePathServiceGatewayAccountPolicyOptions *CreatePrivatePathServiceGatewayAccountPolicyOptions) (result *PrivatePathServiceGatewayAccountPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.CreatePrivatePathServiceGatewayAccountPolicyWithContext(context.Background(), createPrivatePathServiceGatewayAccountPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// CreatePrivatePathServiceGatewayAccountPolicyWithContext is an alternate form of the CreatePrivatePathServiceGatewayAccountPolicy method which supports a Context parameter
func (vpc *VpcV1) CreatePrivatePathServiceGatewayAccountPolicyWithContext(ctx context.Context, createPrivatePathServiceGatewayAccountPolicyOptions *CreatePrivatePathServiceGatewayAccountPolicyOptions) (result *PrivatePathServiceGatewayAccountPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(createPrivatePathServiceGatewayAccountPolicyOptions, "createPrivatePathServiceGatewayAccountPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(createPrivatePathServiceGatewayAccountPolicyOptions, "createPrivatePathServiceGatewayAccountPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *createPrivatePathServiceGatewayAccountPolicyOptions.PrivatePathServiceGatewayID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/account_policies`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "CreatePrivatePathServiceGatewayAccountPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range createPrivatePathServiceGatewayAccountPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if createPrivatePathServiceGatewayAccountPolicyOptions.AccessPolicy != nil {
		body["access_policy"] = createPrivatePathServiceGatewayAccountPolicyOptions.AccessPolicy
	}
	if createPrivatePathServiceGatewayAccountPolicyOptions.Account != nil {
		body["account"] = createPrivatePathServiceGatewayAccountPolicyOptions.Account
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "create_private_path_service_gateway_account_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayAccountPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DeletePrivatePathServiceGatewayAccountPolicy : Delete an account policy for a private path service gateway
// This request deletes an account policy. This operation cannot be reversed and it does not affect the `status` of any
// existing endpoint gateway bindings.
func (vpc *VpcV1) DeletePrivatePathServiceGatewayAccountPolicy(deletePrivatePathServiceGatewayAccountPolicyOptions *DeletePrivatePathServiceGatewayAccountPolicyOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DeletePrivatePathServiceGatewayAccountPolicyWithContext(context.Background(), deletePrivatePathServiceGatewayAccountPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DeletePrivatePathServiceGatewayAccountPolicyWithContext is an alternate form of the DeletePrivatePathServiceGatewayAccountPolicy method which supports a Context parameter
func (vpc *VpcV1) DeletePrivatePathServiceGatewayAccountPolicyWithContext(ctx context.Context, deletePrivatePathServiceGatewayAccountPolicyOptions *DeletePrivatePathServiceGatewayAccountPolicyOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(deletePrivatePathServiceGatewayAccountPolicyOptions, "deletePrivatePathServiceGatewayAccountPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(deletePrivatePathServiceGatewayAccountPolicyOptions, "deletePrivatePathServiceGatewayAccountPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *deletePrivatePathServiceGatewayAccountPolicyOptions.PrivatePathServiceGatewayID,
		"id":                              *deletePrivatePathServiceGatewayAccountPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.DELETE)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/account_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DeletePrivatePathServiceGatewayAccountPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range deletePrivatePathServiceGatewayAccountPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "delete_private_path_service_gateway_account_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// GetPrivatePathServiceGatewayAccountPolicy : Retrieve an account policy for a private path service gateway
// This request retrieves a single account policy specified by the identifier in the URL.
func (vpc *VpcV1) GetPrivatePathServiceGatewayAccountPolicy(getPrivatePathServiceGatewayAccountPolicyOptions *GetPrivatePathServiceGatewayAccountPolicyOptions) (result *PrivatePathServiceGatewayAccountPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetPrivatePathServiceGatewayAccountPolicyWithContext(context.Background(), getPrivatePathServiceGatewayAccountPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetPrivatePathServiceGatewayAccountPolicyWithContext is an alternate form of the GetPrivatePathServiceGatewayAccountPolicy method which supports a Context parameter
func (vpc *VpcV1) GetPrivatePathServiceGatewayAccountPolicyWithContext(ctx context.Context, getPrivatePathServiceGatewayAccountPolicyOptions *GetPrivatePathServiceGatewayAccountPolicyOptions) (result *PrivatePathServiceGatewayAccountPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getPrivatePathServiceGatewayAccountPolicyOptions, "getPrivatePathServiceGatewayAccountPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getPrivatePathServiceGatewayAccountPolicyOptions, "getPrivatePathServiceGatewayAccountPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *getPrivatePathServiceGatewayAccountPolicyOptions.PrivatePathServiceGatewayID,
		"id":                              *getPrivatePathServiceGatewayAccountPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/account_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetPrivatePathServiceGatewayAccountPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getPrivatePathServiceGatewayAccountPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_private_path_service_gateway_account_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayAccountPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// UpdatePrivatePathServiceGatewayAccountPolicy : Update an account policy for a private path service gateway
// This request updates an account policy with the information in a provided account policy patch. The account policy
// patch object is structured in the same way as a retrieved account policy and contains only the information to be
// updated.
func (vpc *VpcV1) UpdatePrivatePathServiceGatewayAccountPolicy(updatePrivatePathServiceGatewayAccountPolicyOptions *UpdatePrivatePathServiceGatewayAccountPolicyOptions) (result *PrivatePathServiceGatewayAccountPolicy, response *core.DetailedResponse, err error) {
	result, response, err = vpc.UpdatePrivatePathServiceGatewayAccountPolicyWithContext(context.Background(), updatePrivatePathServiceGatewayAccountPolicyOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UpdatePrivatePathServiceGatewayAccountPolicyWithContext is an alternate form of the UpdatePrivatePathServiceGatewayAccountPolicy method which supports a Context parameter
func (vpc *VpcV1) UpdatePrivatePathServiceGatewayAccountPolicyWithContext(ctx context.Context, updatePrivatePathServiceGatewayAccountPolicyOptions *UpdatePrivatePathServiceGatewayAccountPolicyOptions) (result *PrivatePathServiceGatewayAccountPolicy, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(updatePrivatePathServiceGatewayAccountPolicyOptions, "updatePrivatePathServiceGatewayAccountPolicyOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(updatePrivatePathServiceGatewayAccountPolicyOptions, "updatePrivatePathServiceGatewayAccountPolicyOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *updatePrivatePathServiceGatewayAccountPolicyOptions.PrivatePathServiceGatewayID,
		"id":                              *updatePrivatePathServiceGatewayAccountPolicyOptions.ID,
	}

	builder := core.NewRequestBuilder(core.PATCH)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/account_policies/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UpdatePrivatePathServiceGatewayAccountPolicy")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range updatePrivatePathServiceGatewayAccountPolicyOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")
	builder.AddHeader("Content-Type", "application/merge-patch+json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	_, err = builder.SetBodyContentJSON(updatePrivatePathServiceGatewayAccountPolicyOptions.PrivatePathServiceGatewayAccountPolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "update_private_path_service_gateway_account_policy", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayAccountPolicy)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// ListPrivatePathServiceGatewayEndpointGatewayBindings : List endpoint gateway bindings for a private path service gateway
// This request lists endpoint gateway bindings for a private path service gateway. Each endpoint gateway binding is
// implicitly created when an endpoint gateway is created targeting the private path service gateway. The associated
// account policy is applied to all new endpoint gateway bindings. If an associated account policy doesn't exist, the
// private path service gateway's `default_access_policy` is used.
//
// The endpoint gateway bindings will be sorted by their `created_at` property values, with newest endpoint gateway
// bindings first. Endpoint gateway bindings with identical
// `created_at` property values will in turn be sorted by ascending `name` property values.
func (vpc *VpcV1) ListPrivatePathServiceGatewayEndpointGatewayBindings(listPrivatePathServiceGatewayEndpointGatewayBindingsOptions *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) (result *PrivatePathServiceGatewayEndpointGatewayBindingCollection, response *core.DetailedResponse, err error) {
	result, response, err = vpc.ListPrivatePathServiceGatewayEndpointGatewayBindingsWithContext(context.Background(), listPrivatePathServiceGatewayEndpointGatewayBindingsOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// ListPrivatePathServiceGatewayEndpointGatewayBindingsWithContext is an alternate form of the ListPrivatePathServiceGatewayEndpointGatewayBindings method which supports a Context parameter
func (vpc *VpcV1) ListPrivatePathServiceGatewayEndpointGatewayBindingsWithContext(ctx context.Context, listPrivatePathServiceGatewayEndpointGatewayBindingsOptions *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) (result *PrivatePathServiceGatewayEndpointGatewayBindingCollection, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(listPrivatePathServiceGatewayEndpointGatewayBindingsOptions, "listPrivatePathServiceGatewayEndpointGatewayBindingsOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(listPrivatePathServiceGatewayEndpointGatewayBindingsOptions, "listPrivatePathServiceGatewayEndpointGatewayBindingsOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.PrivatePathServiceGatewayID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/endpoint_gateway_bindings`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "ListPrivatePathServiceGatewayEndpointGatewayBindings")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))
	if listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Start != nil {
		builder.AddQuery("start", fmt.Sprint(*listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Start))
	}
	if listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Limit != nil {
		builder.AddQuery("limit", fmt.Sprint(*listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Limit))
	}
	if listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Status != nil {
		builder.AddQuery("status", fmt.Sprint(*listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Status))
	}
	if listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.AccountID != nil {
		builder.AddQuery("account.id", fmt.Sprint(*listPrivatePathServiceGatewayEndpointGatewayBindingsOptions.AccountID))
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "list_private_path_service_gateway_endpoint_gateway_bindings", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayEndpointGatewayBindingCollection)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// GetPrivatePathServiceGatewayEndpointGatewayBinding : Retrieve an endpoint gateway binding for a private path service gateway
// This request retrieves a single endpoint gateway binding specified by the identifier in the URL.
func (vpc *VpcV1) GetPrivatePathServiceGatewayEndpointGatewayBinding(getPrivatePathServiceGatewayEndpointGatewayBindingOptions *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions) (result *PrivatePathServiceGatewayEndpointGatewayBinding, response *core.DetailedResponse, err error) {
	result, response, err = vpc.GetPrivatePathServiceGatewayEndpointGatewayBindingWithContext(context.Background(), getPrivatePathServiceGatewayEndpointGatewayBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// GetPrivatePathServiceGatewayEndpointGatewayBindingWithContext is an alternate form of the GetPrivatePathServiceGatewayEndpointGatewayBinding method which supports a Context parameter
func (vpc *VpcV1) GetPrivatePathServiceGatewayEndpointGatewayBindingWithContext(ctx context.Context, getPrivatePathServiceGatewayEndpointGatewayBindingOptions *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions) (result *PrivatePathServiceGatewayEndpointGatewayBinding, response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(getPrivatePathServiceGatewayEndpointGatewayBindingOptions, "getPrivatePathServiceGatewayEndpointGatewayBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(getPrivatePathServiceGatewayEndpointGatewayBindingOptions, "getPrivatePathServiceGatewayEndpointGatewayBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *getPrivatePathServiceGatewayEndpointGatewayBindingOptions.PrivatePathServiceGatewayID,
		"id":                              *getPrivatePathServiceGatewayEndpointGatewayBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.GET)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/endpoint_gateway_bindings/{id}`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "GetPrivatePathServiceGatewayEndpointGatewayBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range getPrivatePathServiceGatewayEndpointGatewayBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Accept", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	var rawResponse map[string]json.RawMessage
	response, err = vpc.Service.Request(request, &rawResponse)
	if err != nil {
		core.EnrichHTTPProblem(err, "get_private_path_service_gateway_endpoint_gateway_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}
	if rawResponse != nil {
		err = core.UnmarshalModel(rawResponse, "", &result, UnmarshalPrivatePathServiceGatewayEndpointGatewayBinding)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-resp-error", common.GetComponentInfo())
			return
		}
		response.Result = result
	}

	return
}

// DenyPrivatePathServiceGatewayEndpointGatewayBinding : Deny an endpoint gateway binding for a private path service gateway
// This request denies a `pending` endpoint gateway request, and optionally sets the policy to deny future requests from
// the same account.
func (vpc *VpcV1) DenyPrivatePathServiceGatewayEndpointGatewayBinding(denyPrivatePathServiceGatewayEndpointGatewayBindingOptions *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.DenyPrivatePathServiceGatewayEndpointGatewayBindingWithContext(context.Background(), denyPrivatePathServiceGatewayEndpointGatewayBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// DenyPrivatePathServiceGatewayEndpointGatewayBindingWithContext is an alternate form of the DenyPrivatePathServiceGatewayEndpointGatewayBinding method which supports a Context parameter
func (vpc *VpcV1) DenyPrivatePathServiceGatewayEndpointGatewayBindingWithContext(ctx context.Context, denyPrivatePathServiceGatewayEndpointGatewayBindingOptions *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(denyPrivatePathServiceGatewayEndpointGatewayBindingOptions, "denyPrivatePathServiceGatewayEndpointGatewayBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(denyPrivatePathServiceGatewayEndpointGatewayBindingOptions, "denyPrivatePathServiceGatewayEndpointGatewayBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *denyPrivatePathServiceGatewayEndpointGatewayBindingOptions.PrivatePathServiceGatewayID,
		"id":                              *denyPrivatePathServiceGatewayEndpointGatewayBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/endpoint_gateway_bindings/{id}/deny`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "DenyPrivatePathServiceGatewayEndpointGatewayBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range denyPrivatePathServiceGatewayEndpointGatewayBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if denyPrivatePathServiceGatewayEndpointGatewayBindingOptions.SetAccountPolicy != nil {
		body["set_account_policy"] = denyPrivatePathServiceGatewayEndpointGatewayBindingOptions.SetAccountPolicy
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "deny_private_path_service_gateway_endpoint_gateway_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// PermitPrivatePathServiceGatewayEndpointGatewayBinding : Permit an endpoint gateway binding for a private path service gateway
// This request permits a `pending` endpoint gateway request, and optionally sets the policy to permit future requests
// from the same account.
func (vpc *VpcV1) PermitPrivatePathServiceGatewayEndpointGatewayBinding(permitPrivatePathServiceGatewayEndpointGatewayBindingOptions *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.PermitPrivatePathServiceGatewayEndpointGatewayBindingWithContext(context.Background(), permitPrivatePathServiceGatewayEndpointGatewayBindingOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// PermitPrivatePathServiceGatewayEndpointGatewayBindingWithContext is an alternate form of the PermitPrivatePathServiceGatewayEndpointGatewayBinding method which supports a Context parameter
func (vpc *VpcV1) PermitPrivatePathServiceGatewayEndpointGatewayBindingWithContext(ctx context.Context, permitPrivatePathServiceGatewayEndpointGatewayBindingOptions *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(permitPrivatePathServiceGatewayEndpointGatewayBindingOptions, "permitPrivatePathServiceGatewayEndpointGatewayBindingOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(permitPrivatePathServiceGatewayEndpointGatewayBindingOptions, "permitPrivatePathServiceGatewayEndpointGatewayBindingOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *permitPrivatePathServiceGatewayEndpointGatewayBindingOptions.PrivatePathServiceGatewayID,
		"id":                              *permitPrivatePathServiceGatewayEndpointGatewayBindingOptions.ID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/endpoint_gateway_bindings/{id}/permit`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "PermitPrivatePathServiceGatewayEndpointGatewayBinding")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range permitPrivatePathServiceGatewayEndpointGatewayBindingOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if permitPrivatePathServiceGatewayEndpointGatewayBindingOptions.SetAccountPolicy != nil {
		body["set_account_policy"] = permitPrivatePathServiceGatewayEndpointGatewayBindingOptions.SetAccountPolicy
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "permit_private_path_service_gateway_endpoint_gateway_binding", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// PublishPrivatePathServiceGateway : Publish a private path service gateway
// This request publishes a private path service gateway, allowing any account to request access to it.
func (vpc *VpcV1) PublishPrivatePathServiceGateway(publishPrivatePathServiceGatewayOptions *PublishPrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.PublishPrivatePathServiceGatewayWithContext(context.Background(), publishPrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// PublishPrivatePathServiceGatewayWithContext is an alternate form of the PublishPrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) PublishPrivatePathServiceGatewayWithContext(ctx context.Context, publishPrivatePathServiceGatewayOptions *PublishPrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(publishPrivatePathServiceGatewayOptions, "publishPrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(publishPrivatePathServiceGatewayOptions, "publishPrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *publishPrivatePathServiceGatewayOptions.PrivatePathServiceGatewayID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/publish`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "PublishPrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range publishPrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "publish_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// RevokeAccountForPrivatePathServiceGateway : Revoke access to a private path service gateway for an account
// This request revokes a consumer account. This operation cannot be reversed. The `status` of all endpoint gateway
// bindings associated with the specified private path service gateway become `denied`. If the specified account has an
// existing access policy, that policy will be updated to `denied`. Otherwise, a new `deny` access policy will be
// created for the account.
func (vpc *VpcV1) RevokeAccountForPrivatePathServiceGateway(revokeAccountForPrivatePathServiceGatewayOptions *RevokeAccountForPrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.RevokeAccountForPrivatePathServiceGatewayWithContext(context.Background(), revokeAccountForPrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// RevokeAccountForPrivatePathServiceGatewayWithContext is an alternate form of the RevokeAccountForPrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) RevokeAccountForPrivatePathServiceGatewayWithContext(ctx context.Context, revokeAccountForPrivatePathServiceGatewayOptions *RevokeAccountForPrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(revokeAccountForPrivatePathServiceGatewayOptions, "revokeAccountForPrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(revokeAccountForPrivatePathServiceGatewayOptions, "revokeAccountForPrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *revokeAccountForPrivatePathServiceGatewayOptions.PrivatePathServiceGatewayID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/revoke_account`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "RevokeAccountForPrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range revokeAccountForPrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}
	builder.AddHeader("Content-Type", "application/json")

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	body := make(map[string]interface{})
	if revokeAccountForPrivatePathServiceGatewayOptions.Account != nil {
		body["account"] = revokeAccountForPrivatePathServiceGatewayOptions.Account
	}
	_, err = builder.SetBodyContentJSON(body)
	if err != nil {
		err = core.SDKErrorf(err, "", "set-json-body-error", common.GetComponentInfo())
		return
	}

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "revoke_account_for_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}

// UnpublishPrivatePathServiceGateway : Unpublish a private path service gateway
// This request unpublishes a private path service gateway. For this request to succeed, any existing access from other
// accounts must first be revoked. Once unpublished, access will again be restricted to the account that created this
// private path service gateway.
func (vpc *VpcV1) UnpublishPrivatePathServiceGateway(unpublishPrivatePathServiceGatewayOptions *UnpublishPrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	response, err = vpc.UnpublishPrivatePathServiceGatewayWithContext(context.Background(), unpublishPrivatePathServiceGatewayOptions)
	err = core.RepurposeSDKProblem(err, "")
	return
}

// UnpublishPrivatePathServiceGatewayWithContext is an alternate form of the UnpublishPrivatePathServiceGateway method which supports a Context parameter
func (vpc *VpcV1) UnpublishPrivatePathServiceGatewayWithContext(ctx context.Context, unpublishPrivatePathServiceGatewayOptions *UnpublishPrivatePathServiceGatewayOptions) (response *core.DetailedResponse, err error) {
	err = core.ValidateNotNil(unpublishPrivatePathServiceGatewayOptions, "unpublishPrivatePathServiceGatewayOptions cannot be nil")
	if err != nil {
		err = core.SDKErrorf(err, "", "unexpected-nil-param", common.GetComponentInfo())
		return
	}
	err = core.ValidateStruct(unpublishPrivatePathServiceGatewayOptions, "unpublishPrivatePathServiceGatewayOptions")
	if err != nil {
		err = core.SDKErrorf(err, "", "struct-validation-error", common.GetComponentInfo())
		return
	}

	pathParamsMap := map[string]string{
		"private_path_service_gateway_id": *unpublishPrivatePathServiceGatewayOptions.PrivatePathServiceGatewayID,
	}

	builder := core.NewRequestBuilder(core.POST)
	builder = builder.WithContext(ctx)
	builder.EnableGzipCompression = vpc.GetEnableGzipCompression()
	_, err = builder.ResolveRequestURL(vpc.Service.Options.URL, `/private_path_service_gateways/{private_path_service_gateway_id}/unpublish`, pathParamsMap)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-resolve-error", common.GetComponentInfo())
		return
	}

	sdkHeaders := common.GetSdkHeaders("vpc", "V1", "UnpublishPrivatePathServiceGateway")
	for headerName, headerValue := range sdkHeaders {
		builder.AddHeader(headerName, headerValue)
	}

	for headerName, headerValue := range unpublishPrivatePathServiceGatewayOptions.Headers {
		builder.AddHeader(headerName, headerValue)
	}

	builder.AddQuery("version", fmt.Sprint(*vpc.Version))
	builder.AddQuery("generation", fmt.Sprint(*vpc.Generation))

	request, err := builder.Build()
	if err != nil {
		err = core.SDKErrorf(err, "", "build-error", common.GetComponentInfo())
		return
	}

	response, err = vpc.Service.Request(request, nil)
	if err != nil {
		core.EnrichHTTPProblem(err, "unpublish_private_path_service_gateway", getServiceComponentInfo())
		err = core.SDKErrorf(err, "", "http-request-err", common.GetComponentInfo())
		return
	}

	return
}
func getServiceComponentInfo() *core.ProblemComponent {
	return core.NewProblemComponent(DefaultServiceName, "2025-07-08")
}

// AccountIdentity : Identifies an account by a unique property.
// Models which "extend" this model:
// - AccountIdentityByID
type AccountIdentity struct {
	// The unique identifier for this account.
	ID *string `json:"id,omitempty"`
}

func (*AccountIdentity) isaAccountIdentity() bool {
	return true
}

type AccountIdentityIntf interface {
	isaAccountIdentity() bool
}

// UnmarshalAccountIdentity unmarshals an instance of AccountIdentity from the specified map of raw messages.
func UnmarshalAccountIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(AccountIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AccountReference : AccountReference struct
type AccountReference struct {
	// The unique identifier for this account.
	ID *string `json:"id" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the AccountReference.ResourceType property.
// The resource type.
const (
	AccountReferenceResourceTypeAccountConst = "account"
)

// UnmarshalAccountReference unmarshals an instance of AccountReference from the specified map of raw messages.
func UnmarshalAccountReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(AccountReference)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ActivateReservationOptions : The ActivateReservation options.
type ActivateReservationOptions struct {
	// The reservation identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewActivateReservationOptions : Instantiate ActivateReservationOptions
func (*VpcV1) NewActivateReservationOptions(id string) *ActivateReservationOptions {
	return &ActivateReservationOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ActivateReservationOptions) SetID(id string) *ActivateReservationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ActivateReservationOptions) SetHeaders(param map[string]string) *ActivateReservationOptions {
	options.Headers = param
	return options
}

// AddBareMetalServerNetworkInterfaceFloatingIPOptions : The AddBareMetalServerNetworkInterfaceFloatingIP options.
type AddBareMetalServerNetworkInterfaceFloatingIPOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddBareMetalServerNetworkInterfaceFloatingIPOptions : Instantiate AddBareMetalServerNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewAddBareMetalServerNetworkInterfaceFloatingIPOptions(bareMetalServerID string, networkInterfaceID string, id string) *AddBareMetalServerNetworkInterfaceFloatingIPOptions {
	return &AddBareMetalServerNetworkInterfaceFloatingIPOptions{
		BareMetalServerID:  core.StringPtr(bareMetalServerID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *AddBareMetalServerNetworkInterfaceFloatingIPOptions) SetBareMetalServerID(bareMetalServerID string) *AddBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *AddBareMetalServerNetworkInterfaceFloatingIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *AddBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddBareMetalServerNetworkInterfaceFloatingIPOptions) SetID(id string) *AddBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddBareMetalServerNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *AddBareMetalServerNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// AddEndpointGatewayIPOptions : The AddEndpointGatewayIP options.
type AddEndpointGatewayIPOptions struct {
	// The endpoint gateway identifier.
	EndpointGatewayID *string `json:"endpoint_gateway_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddEndpointGatewayIPOptions : Instantiate AddEndpointGatewayIPOptions
func (*VpcV1) NewAddEndpointGatewayIPOptions(endpointGatewayID string, id string) *AddEndpointGatewayIPOptions {
	return &AddEndpointGatewayIPOptions{
		EndpointGatewayID: core.StringPtr(endpointGatewayID),
		ID:                core.StringPtr(id),
	}
}

// SetEndpointGatewayID : Allow user to set EndpointGatewayID
func (_options *AddEndpointGatewayIPOptions) SetEndpointGatewayID(endpointGatewayID string) *AddEndpointGatewayIPOptions {
	_options.EndpointGatewayID = core.StringPtr(endpointGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddEndpointGatewayIPOptions) SetID(id string) *AddEndpointGatewayIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddEndpointGatewayIPOptions) SetHeaders(param map[string]string) *AddEndpointGatewayIPOptions {
	options.Headers = param
	return options
}

// AddInstanceNetworkInterfaceFloatingIPOptions : The AddInstanceNetworkInterfaceFloatingIP options.
type AddInstanceNetworkInterfaceFloatingIPOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddInstanceNetworkInterfaceFloatingIPOptions : Instantiate AddInstanceNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewAddInstanceNetworkInterfaceFloatingIPOptions(instanceID string, networkInterfaceID string, id string) *AddInstanceNetworkInterfaceFloatingIPOptions {
	return &AddInstanceNetworkInterfaceFloatingIPOptions{
		InstanceID:         core.StringPtr(instanceID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *AddInstanceNetworkInterfaceFloatingIPOptions) SetInstanceID(instanceID string) *AddInstanceNetworkInterfaceFloatingIPOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *AddInstanceNetworkInterfaceFloatingIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *AddInstanceNetworkInterfaceFloatingIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddInstanceNetworkInterfaceFloatingIPOptions) SetID(id string) *AddInstanceNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddInstanceNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *AddInstanceNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// AddNetworkInterfaceFloatingIPOptions : The AddNetworkInterfaceFloatingIP options.
type AddNetworkInterfaceFloatingIPOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddNetworkInterfaceFloatingIPOptions : Instantiate AddNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewAddNetworkInterfaceFloatingIPOptions(virtualNetworkInterfaceID string, id string) *AddNetworkInterfaceFloatingIPOptions {
	return &AddNetworkInterfaceFloatingIPOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
		ID:                        core.StringPtr(id),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *AddNetworkInterfaceFloatingIPOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *AddNetworkInterfaceFloatingIPOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddNetworkInterfaceFloatingIPOptions) SetID(id string) *AddNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *AddNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// AddVirtualNetworkInterfaceIPOptions : The AddVirtualNetworkInterfaceIP options.
type AddVirtualNetworkInterfaceIPOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddVirtualNetworkInterfaceIPOptions : Instantiate AddVirtualNetworkInterfaceIPOptions
func (*VpcV1) NewAddVirtualNetworkInterfaceIPOptions(virtualNetworkInterfaceID string, id string) *AddVirtualNetworkInterfaceIPOptions {
	return &AddVirtualNetworkInterfaceIPOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
		ID:                        core.StringPtr(id),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *AddVirtualNetworkInterfaceIPOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *AddVirtualNetworkInterfaceIPOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddVirtualNetworkInterfaceIPOptions) SetID(id string) *AddVirtualNetworkInterfaceIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddVirtualNetworkInterfaceIPOptions) SetHeaders(param map[string]string) *AddVirtualNetworkInterfaceIPOptions {
	options.Headers = param
	return options
}

// AddVPNGatewayConnectionsLocalCIDROptions : The AddVPNGatewayConnectionsLocalCIDR options.
type AddVPNGatewayConnectionsLocalCIDROptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IP address range in CIDR block notation.
	CIDR *string `json:"cidr" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddVPNGatewayConnectionsLocalCIDROptions : Instantiate AddVPNGatewayConnectionsLocalCIDROptions
func (*VpcV1) NewAddVPNGatewayConnectionsLocalCIDROptions(vpnGatewayID string, id string, cidr string) *AddVPNGatewayConnectionsLocalCIDROptions {
	return &AddVPNGatewayConnectionsLocalCIDROptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
		CIDR:         core.StringPtr(cidr),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *AddVPNGatewayConnectionsLocalCIDROptions) SetVPNGatewayID(vpnGatewayID string) *AddVPNGatewayConnectionsLocalCIDROptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddVPNGatewayConnectionsLocalCIDROptions) SetID(id string) *AddVPNGatewayConnectionsLocalCIDROptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *AddVPNGatewayConnectionsLocalCIDROptions) SetCIDR(cidr string) *AddVPNGatewayConnectionsLocalCIDROptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddVPNGatewayConnectionsLocalCIDROptions) SetHeaders(param map[string]string) *AddVPNGatewayConnectionsLocalCIDROptions {
	options.Headers = param
	return options
}

// AddVPNGatewayConnectionsPeerCIDROptions : The AddVPNGatewayConnectionsPeerCIDR options.
type AddVPNGatewayConnectionsPeerCIDROptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IP address range in CIDR block notation.
	CIDR *string `json:"cidr" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewAddVPNGatewayConnectionsPeerCIDROptions : Instantiate AddVPNGatewayConnectionsPeerCIDROptions
func (*VpcV1) NewAddVPNGatewayConnectionsPeerCIDROptions(vpnGatewayID string, id string, cidr string) *AddVPNGatewayConnectionsPeerCIDROptions {
	return &AddVPNGatewayConnectionsPeerCIDROptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
		CIDR:         core.StringPtr(cidr),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *AddVPNGatewayConnectionsPeerCIDROptions) SetVPNGatewayID(vpnGatewayID string) *AddVPNGatewayConnectionsPeerCIDROptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *AddVPNGatewayConnectionsPeerCIDROptions) SetID(id string) *AddVPNGatewayConnectionsPeerCIDROptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *AddVPNGatewayConnectionsPeerCIDROptions) SetCIDR(cidr string) *AddVPNGatewayConnectionsPeerCIDROptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *AddVPNGatewayConnectionsPeerCIDROptions) SetHeaders(param map[string]string) *AddVPNGatewayConnectionsPeerCIDROptions {
	options.Headers = param
	return options
}

// AddressPrefix : AddressPrefix struct
type AddressPrefix struct {
	// The CIDR block for this address prefix.
	CIDR *string `json:"cidr" validate:"required"`

	// The date and time that this address prefix was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// Indicates whether subnets exist with addresses from this address prefix.
	HasSubnets *bool `json:"has_subnets" validate:"required"`

	// The URL for this address prefix.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this address prefix.
	ID *string `json:"id" validate:"required"`

	// Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically
	// created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected
	// words, but may be changed.
	IsDefault *bool `json:"is_default" validate:"required"`

	// The name for this address prefix. The name must not be used by another address prefix for the VPC.
	Name *string `json:"name" validate:"required"`

	// The zone this address prefix resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// UnmarshalAddressPrefix unmarshals an instance of AddressPrefix from the specified map of raw messages.
func UnmarshalAddressPrefix(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(AddressPrefix)
	err = core.UnmarshalPrimitive(m, "cidr", &obj.CIDR)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "has_subnets", &obj.HasSubnets)
	if err != nil {
		err = core.SDKErrorf(err, "", "has_subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "is_default", &obj.IsDefault)
	if err != nil {
		err = core.SDKErrorf(err, "", "is_default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AddressPrefixCollection : AddressPrefixCollection struct
type AddressPrefixCollection struct {
	// A page of address prefixes for the VPC.
	AddressPrefixes []AddressPrefix `json:"address_prefixes" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalAddressPrefixCollection unmarshals an instance of AddressPrefixCollection from the specified map of raw messages.
func UnmarshalAddressPrefixCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(AddressPrefixCollection)
	err = core.UnmarshalModel(m, "address_prefixes", &obj.AddressPrefixes, UnmarshalAddressPrefix)
	if err != nil {
		err = core.SDKErrorf(err, "", "address_prefixes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *AddressPrefixCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// AddressPrefixPatch : AddressPrefixPatch struct
type AddressPrefixPatch struct {
	// Indicates whether this is the default prefix for this zone in this VPC. Updating to true makes this prefix the
	// default prefix for this zone in this VPC, provided the VPC currently has no default address prefix for this zone.
	// Updating to false removes the default prefix for this zone in this VPC.
	IsDefault *bool `json:"is_default,omitempty"`

	// The name for this address prefix. The name must not be used by another address prefix for the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalAddressPrefixPatch unmarshals an instance of AddressPrefixPatch from the specified map of raw messages.
func UnmarshalAddressPrefixPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(AddressPrefixPatch)
	err = core.UnmarshalPrimitive(m, "is_default", &obj.IsDefault)
	if err != nil {
		err = core.SDKErrorf(err, "", "is_default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the AddressPrefixPatch
func (addressPrefixPatch *AddressPrefixPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(addressPrefixPatch.IsDefault) {
		_patch["is_default"] = addressPrefixPatch.IsDefault
	}
	if !core.IsNil(addressPrefixPatch.Name) {
		_patch["name"] = addressPrefixPatch.Name
	}

	return
}

// BackupPolicy : BackupPolicy struct
// Models which "extend" this model:
// - BackupPolicyMatchResourceTypeInstance
// - BackupPolicyMatchResourceTypeVolume
// - BackupPolicyMatchResourceTypeShare
type BackupPolicy struct {
	// The date and time that the backup policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this backup policy.
	CRN *string `json:"crn" validate:"required"`

	// The reasons for the current `health_state` (if any).
	HealthReasons []BackupPolicyHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this backup policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this backup policy.
	ID *string `json:"id" validate:"required"`

	// The date and time that the most recent job for this backup policy completed.
	//
	// If absent, no job has yet completed for this backup policy.
	LastJobCompletedAt *strfmt.DateTime `json:"last_job_completed_at,omitempty"`

	// The lifecycle state of the backup policy.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The resource type this backup policy applies to. Resources that have both a matching type and a matching user tag
	// will be subject to the backup policy.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	MatchResourceType *string `json:"match_resource_type" validate:"required"`

	// The user tags this backup policy applies to. Resources that have both a matching user tag and a matching type will
	// be subject to the backup policy.
	MatchUserTags []string `json:"match_user_tags" validate:"required"`

	// The name for this backup policy. The name is unique across all backup policies in the region.
	Name *string `json:"name" validate:"required"`

	// The plans for the backup policy.
	Plans []BackupPolicyPlanReference `json:"plans" validate:"required"`

	// The resource group for this backup policy.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The scope for this backup policy.
	Scope BackupPolicyScopeIntf `json:"scope" validate:"required"`

	// The included content for backups created using this policy:
	// - `boot_volume`: Include the instance's boot volume.
	// - `data_volumes`: Include the instance's data volumes.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	IncludedContent []string `json:"included_content,omitempty"`
}

// Constants associated with the BackupPolicy.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	BackupPolicyHealthStateDegradedConst     = "degraded"
	BackupPolicyHealthStateFaultedConst      = "faulted"
	BackupPolicyHealthStateInapplicableConst = "inapplicable"
	BackupPolicyHealthStateOkConst           = "ok"
)

// Constants associated with the BackupPolicy.LifecycleState property.
// The lifecycle state of the backup policy.
const (
	BackupPolicyLifecycleStateDeletingConst  = "deleting"
	BackupPolicyLifecycleStateFailedConst    = "failed"
	BackupPolicyLifecycleStatePendingConst   = "pending"
	BackupPolicyLifecycleStateStableConst    = "stable"
	BackupPolicyLifecycleStateSuspendedConst = "suspended"
	BackupPolicyLifecycleStateUpdatingConst  = "updating"
	BackupPolicyLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the BackupPolicy.MatchResourceType property.
// The resource type this backup policy applies to. Resources that have both a matching type and a matching user tag
// will be subject to the backup policy.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BackupPolicyMatchResourceTypeInstanceConst = "instance"
	BackupPolicyMatchResourceTypeShareConst    = "share"
	BackupPolicyMatchResourceTypeVolumeConst   = "volume"
)

// Constants associated with the BackupPolicy.ResourceType property.
// The resource type.
const (
	BackupPolicyResourceTypeBackupPolicyConst = "backup_policy"
)

// Constants associated with the BackupPolicy.IncludedContent property.
// An item to include.
const (
	BackupPolicyIncludedContentBootVolumeConst  = "boot_volume"
	BackupPolicyIncludedContentDataVolumesConst = "data_volumes"
)

func (*BackupPolicy) isaBackupPolicy() bool {
	return true
}

type BackupPolicyIntf interface {
	isaBackupPolicy() bool
}

// UnmarshalBackupPolicy unmarshals an instance of BackupPolicy from the specified map of raw messages.
func UnmarshalBackupPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicy)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalBackupPolicyHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "last_job_completed_at", &obj.LastJobCompletedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "last_job_completed_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "match_resource_type", &obj.MatchResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "match_resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "match_user_tags", &obj.MatchUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "match_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "plans", &obj.Plans, UnmarshalBackupPolicyPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "plans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "scope", &obj.Scope, UnmarshalBackupPolicyScope)
	if err != nil {
		err = core.SDKErrorf(err, "", "scope-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "included_content", &obj.IncludedContent)
	if err != nil {
		err = core.SDKErrorf(err, "", "included_content-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyCollection : BackupPolicyCollection struct
type BackupPolicyCollection struct {
	// A page of backup policies.
	BackupPolicies []BackupPolicyIntf `json:"backup_policies" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBackupPolicyCollection unmarshals an instance of BackupPolicyCollection from the specified map of raw messages.
func UnmarshalBackupPolicyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyCollection)
	err = core.UnmarshalModel(m, "backup_policies", &obj.BackupPolicies, UnmarshalBackupPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "backup_policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *BackupPolicyCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// BackupPolicyHealthReason : BackupPolicyHealthReason struct
type BackupPolicyHealthReason struct {
	// A reason code for this health state.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the BackupPolicyHealthReason.Code property.
// A reason code for this health state.
const (
	BackupPolicyHealthReasonCodeMissingServiceAuthorizationPoliciesConst = "missing_service_authorization_policies"
)

// UnmarshalBackupPolicyHealthReason unmarshals an instance of BackupPolicyHealthReason from the specified map of raw messages.
func UnmarshalBackupPolicyHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyJob : BackupPolicyJob struct
type BackupPolicyJob struct {
	// Indicates whether this backup policy job will be automatically deleted after it completes. At present, this is
	// always `true`, but may be modifiable in the future.
	AutoDelete *bool `json:"auto_delete" validate:"required"`

	// If `auto_delete` is `true`, the days after completion that this backup policy job will be deleted. This value may be
	// modifiable in the future.
	AutoDeleteAfter *int64 `json:"auto_delete_after" validate:"required"`

	// The backup policy plan operated this backup policy job (may be
	// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
	BackupPolicyPlan *BackupPolicyPlanReference `json:"backup_policy_plan" validate:"required"`

	// The date and time that the backup policy job was completed.
	//
	// If absent, the backup policy job has not yet completed.
	CompletedAt *strfmt.DateTime `json:"completed_at,omitempty"`

	// The date and time that the backup policy job was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this backup policy job.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this backup policy job.
	ID *string `json:"id" validate:"required"`

	// The type of backup policy job.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	JobType *string `json:"job_type" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The source this backup was created from (may be
	// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
	Source BackupPolicyJobSourceIntf `json:"source" validate:"required"`

	// The status of the backup policy job.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []BackupPolicyJobStatusReason `json:"status_reasons" validate:"required"`

	// The snapshots operated on by this backup policy job (may be
	// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
	TargetSnapshots []BackupPolicyTargetSnapshotIntf `json:"target_snapshots" validate:"required"`
}

// Constants associated with the BackupPolicyJob.JobType property.
// The type of backup policy job.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BackupPolicyJobJobTypeCreationConst = "creation"
	BackupPolicyJobJobTypeDeletionConst = "deletion"
)

// Constants associated with the BackupPolicyJob.ResourceType property.
// The resource type.
const (
	BackupPolicyJobResourceTypeBackupPolicyJobConst = "backup_policy_job"
)

// Constants associated with the BackupPolicyJob.Status property.
// The status of the backup policy job.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BackupPolicyJobStatusFailedConst    = "failed"
	BackupPolicyJobStatusRunningConst   = "running"
	BackupPolicyJobStatusSucceededConst = "succeeded"
)

// UnmarshalBackupPolicyJob unmarshals an instance of BackupPolicyJob from the specified map of raw messages.
func UnmarshalBackupPolicyJob(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyJob)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete_after", &obj.AutoDeleteAfter)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete_after-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "backup_policy_plan", &obj.BackupPolicyPlan, UnmarshalBackupPolicyPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "backup_policy_plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "completed_at", &obj.CompletedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "completed_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "job_type", &obj.JobType)
	if err != nil {
		err = core.SDKErrorf(err, "", "job_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source", &obj.Source, UnmarshalBackupPolicyJobSource)
	if err != nil {
		err = core.SDKErrorf(err, "", "source-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalBackupPolicyJobStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target_snapshots", &obj.TargetSnapshots, UnmarshalBackupPolicyTargetSnapshot)
	if err != nil {
		err = core.SDKErrorf(err, "", "target_snapshots-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyJobCollection : BackupPolicyJobCollection struct
type BackupPolicyJobCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of jobs for the backup policy.
	Jobs []BackupPolicyJob `json:"jobs" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBackupPolicyJobCollection unmarshals an instance of BackupPolicyJobCollection from the specified map of raw messages.
func UnmarshalBackupPolicyJobCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyJobCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "jobs", &obj.Jobs, UnmarshalBackupPolicyJob)
	if err != nil {
		err = core.SDKErrorf(err, "", "jobs-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *BackupPolicyJobCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// BackupPolicyJobSource : The source this backup was created from (may be
// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
// Models which "extend" this model:
// - BackupPolicyJobSourceVolumeReference
// - BackupPolicyJobSourceInstanceReference
// - BackupPolicyJobSourceShareReference
type BackupPolicyJobSource struct {
	// The CRN for this volume.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this volume.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this volume.
	ID *string `json:"id,omitempty"`

	// The name for this volume. The name is unique across all volumes in the region.
	Name *string `json:"name,omitempty"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *VolumeRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the BackupPolicyJobSource.ResourceType property.
// The resource type.
const (
	BackupPolicyJobSourceResourceTypeVolumeConst = "volume"
)

func (*BackupPolicyJobSource) isaBackupPolicyJobSource() bool {
	return true
}

type BackupPolicyJobSourceIntf interface {
	isaBackupPolicyJobSource() bool
}

// UnmarshalBackupPolicyJobSource unmarshals an instance of BackupPolicyJobSource from the specified map of raw messages.
func UnmarshalBackupPolicyJobSource(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyJobSource)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalVolumeRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyJobStatusReason : BackupPolicyJobStatusReason struct
type BackupPolicyJobStatusReason struct {
	// A reason code for the status:
	// - `internal_error`: Internal error (contact IBM support)
	// - `snapshot_encryption_key_invalid`: The provided encryption key is unavailable
	// - `snapshot_pending`: Cannot delete backup (snapshot) in the `pending` lifecycle state
	// - `snapshot_source_unsupported`: The source access control mode does not support
	//   backups
	// - `snapshot_rate_too_high`: The rate of backups for the resource is too high
	// - `snapshot_share_limit`: The maximum limit for snapshots on this resource has been
	//   reached
	// - `snapshot_source_unavailable`: The source data is not available (for example,
	//   because the source is still being created).
	// - `snapshot_volume_limit`: The snapshot limit for the source volume has been reached
	// - `source_volume_busy`: The source volume has `busy` set (after multiple retries)
	// - `source_volume_too_large`: The source volume exceeds the [maximum supported
	//   size](https://cloud.ibm.com/docs/vpc?topic=vpc-snapshots-vpc-about&interface=api#snapshots-vpc-limitations)
	// - `source_volume_unavailable`: The source volume is not attached to a running instance
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the BackupPolicyJobStatusReason.Code property.
// A reason code for the status:
//   - `internal_error`: Internal error (contact IBM support)
//   - `snapshot_encryption_key_invalid`: The provided encryption key is unavailable
//   - `snapshot_pending`: Cannot delete backup (snapshot) in the `pending` lifecycle state
//   - `snapshot_source_unsupported`: The source access control mode does not support
//     backups
//   - `snapshot_rate_too_high`: The rate of backups for the resource is too high
//   - `snapshot_share_limit`: The maximum limit for snapshots on this resource has been
//     reached
//   - `snapshot_source_unavailable`: The source data is not available (for example,
//     because the source is still being created).
//   - `snapshot_volume_limit`: The snapshot limit for the source volume has been reached
//   - `source_volume_busy`: The source volume has `busy` set (after multiple retries)
//   - `source_volume_too_large`: The source volume exceeds the [maximum supported
//     size](https://cloud.ibm.com/docs/vpc?topic=vpc-snapshots-vpc-about&interface=api#snapshots-vpc-limitations)
//   - `source_volume_unavailable`: The source volume is not attached to a running instance
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BackupPolicyJobStatusReasonCodeInternalErrorConst                = "internal_error"
	BackupPolicyJobStatusReasonCodeSnapshotEncryptionKeyInvalidConst = "snapshot_encryption_key_invalid"
	BackupPolicyJobStatusReasonCodeSnapshotPendingConst              = "snapshot_pending"
	BackupPolicyJobStatusReasonCodeSnapshotRateTooHighConst          = "snapshot_rate_too_high"
	BackupPolicyJobStatusReasonCodeSnapshotShareLimitConst           = "snapshot_share_limit"
	BackupPolicyJobStatusReasonCodeSnapshotSourceUnavailableConst    = "snapshot_source_unavailable"
	BackupPolicyJobStatusReasonCodeSnapshotSourceUnsupportedConst    = "snapshot_source_unsupported"
	BackupPolicyJobStatusReasonCodeSnapshotVolumeLimitConst          = "snapshot_volume_limit"
	BackupPolicyJobStatusReasonCodeSourceVolumeBusyConst             = "source_volume_busy"
	BackupPolicyJobStatusReasonCodeSourceVolumeTooLargeConst         = "source_volume_too_large"
	BackupPolicyJobStatusReasonCodeSourceVolumeUnavailableConst      = "source_volume_unavailable"
)

// UnmarshalBackupPolicyJobStatusReason unmarshals an instance of BackupPolicyJobStatusReason from the specified map of raw messages.
func UnmarshalBackupPolicyJobStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyJobStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPatch : BackupPolicyPatch struct
type BackupPolicyPatch struct {
	// The included content for backups created using this policy:
	// - `boot_volume`: Include the instance's boot volume.
	// - `data_volumes`: Include the instance's data volumes.
	IncludedContent []string `json:"included_content,omitempty"`

	// The user tags this backup policy will apply to (replacing any existing tags). Resources that have both a matching
	// user tag and a matching type will be subject to the backup policy.
	MatchUserTags []string `json:"match_user_tags,omitempty"`

	// The name for this backup policy. The name must not be used by another backup policy in the region.
	Name *string `json:"name,omitempty"`
}

// Constants associated with the BackupPolicyPatch.IncludedContent property.
// An item to include.
const (
	BackupPolicyPatchIncludedContentBootVolumeConst  = "boot_volume"
	BackupPolicyPatchIncludedContentDataVolumesConst = "data_volumes"
)

// UnmarshalBackupPolicyPatch unmarshals an instance of BackupPolicyPatch from the specified map of raw messages.
func UnmarshalBackupPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPatch)
	err = core.UnmarshalPrimitive(m, "included_content", &obj.IncludedContent)
	if err != nil {
		err = core.SDKErrorf(err, "", "included_content-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "match_user_tags", &obj.MatchUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "match_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the BackupPolicyPatch
func (backupPolicyPatch *BackupPolicyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(backupPolicyPatch.IncludedContent) {
		_patch["included_content"] = backupPolicyPatch.IncludedContent
	}
	if !core.IsNil(backupPolicyPatch.MatchUserTags) {
		_patch["match_user_tags"] = backupPolicyPatch.MatchUserTags
	}
	if !core.IsNil(backupPolicyPatch.Name) {
		_patch["name"] = backupPolicyPatch.Name
	}

	return
}

// BackupPolicyPlan : BackupPolicyPlan struct
type BackupPolicyPlan struct {
	// Indicates whether the plan is active.
	Active *bool `json:"active" validate:"required"`

	// The user tags to attach to backups (snapshots) created by this plan.
	AttachUserTags []string `json:"attach_user_tags" validate:"required"`

	ClonePolicy *BackupPolicyPlanClonePolicy `json:"clone_policy" validate:"required"`

	// Indicates whether to copy the source's user tags to the created backups (snapshots).
	CopyUserTags *bool `json:"copy_user_tags" validate:"required"`

	// The date and time that the backup policy plan was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The cron specification for the backup schedule. The backup policy jobs
	// (which create and delete backups for this plan) will not start until this time, and may start for up to 90 minutes
	// after this time.
	//
	// All backup schedules for plans in the same policy must be at least an hour apart.
	CronSpec *string `json:"cron_spec" validate:"required"`

	DeletionTrigger *BackupPolicyPlanDeletionTrigger `json:"deletion_trigger" validate:"required"`

	// The URL for this backup policy plan.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this backup policy plan.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of this backup policy plan.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this backup policy plan. The name is unique across all plans in the backup policy.
	Name *string `json:"name" validate:"required"`

	// The policies for additional backups in remote regions.
	RemoteRegionPolicies []BackupPolicyPlanRemoteRegionPolicy `json:"remote_region_policies" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the BackupPolicyPlan.LifecycleState property.
// The lifecycle state of this backup policy plan.
const (
	BackupPolicyPlanLifecycleStateDeletingConst  = "deleting"
	BackupPolicyPlanLifecycleStateFailedConst    = "failed"
	BackupPolicyPlanLifecycleStatePendingConst   = "pending"
	BackupPolicyPlanLifecycleStateStableConst    = "stable"
	BackupPolicyPlanLifecycleStateSuspendedConst = "suspended"
	BackupPolicyPlanLifecycleStateUpdatingConst  = "updating"
	BackupPolicyPlanLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the BackupPolicyPlan.ResourceType property.
// The resource type.
const (
	BackupPolicyPlanResourceTypeBackupPolicyPlanConst = "backup_policy_plan"
)

// UnmarshalBackupPolicyPlan unmarshals an instance of BackupPolicyPlan from the specified map of raw messages.
func UnmarshalBackupPolicyPlan(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlan)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "attach_user_tags", &obj.AttachUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "attach_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "clone_policy", &obj.ClonePolicy, UnmarshalBackupPolicyPlanClonePolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "clone_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "copy_user_tags", &obj.CopyUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "copy_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cron_spec", &obj.CronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deletion_trigger", &obj.DeletionTrigger, UnmarshalBackupPolicyPlanDeletionTrigger)
	if err != nil {
		err = core.SDKErrorf(err, "", "deletion_trigger-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote_region_policies", &obj.RemoteRegionPolicies, UnmarshalBackupPolicyPlanRemoteRegionPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote_region_policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanClonePolicy : BackupPolicyPlanClonePolicy struct
type BackupPolicyPlanClonePolicy struct {
	// The maximum number of recent snapshots (per source) that will keep clones.
	MaxSnapshots *int64 `json:"max_snapshots" validate:"required"`

	// The zone this backup policy plan will create snapshot clones in.
	Zones []ZoneReference `json:"zones" validate:"required"`
}

// UnmarshalBackupPolicyPlanClonePolicy unmarshals an instance of BackupPolicyPlanClonePolicy from the specified map of raw messages.
func UnmarshalBackupPolicyPlanClonePolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanClonePolicy)
	err = core.UnmarshalPrimitive(m, "max_snapshots", &obj.MaxSnapshots)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_snapshots-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zones", &obj.Zones, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zones-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanClonePolicyPatch : BackupPolicyPlanClonePolicyPatch struct
type BackupPolicyPlanClonePolicyPatch struct {
	// The maximum number of recent snapshots (per source) that will keep clones.
	MaxSnapshots *int64 `json:"max_snapshots,omitempty"`

	// The zones this backup policy plan will create snapshot clones in. Updating this value does not change the clones for
	// snapshots that have already been created by this plan.
	Zones []ZoneIdentityIntf `json:"zones,omitempty"`
}

// UnmarshalBackupPolicyPlanClonePolicyPatch unmarshals an instance of BackupPolicyPlanClonePolicyPatch from the specified map of raw messages.
func UnmarshalBackupPolicyPlanClonePolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanClonePolicyPatch)
	err = core.UnmarshalPrimitive(m, "max_snapshots", &obj.MaxSnapshots)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_snapshots-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zones", &obj.Zones, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zones-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the BackupPolicyPlanClonePolicyPatch
func (backupPolicyPlanClonePolicyPatch *BackupPolicyPlanClonePolicyPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(backupPolicyPlanClonePolicyPatch.MaxSnapshots) {
		_patch["max_snapshots"] = backupPolicyPlanClonePolicyPatch.MaxSnapshots
	}
	if !core.IsNil(backupPolicyPlanClonePolicyPatch.Zones) {
		var zonesPatches []map[string]interface{}
		for _, zones := range backupPolicyPlanClonePolicyPatch.Zones {
			zonesPatches = append(zonesPatches, zones.asPatch())
		}
		_patch["zones"] = zonesPatches
	}

	return
}

// BackupPolicyPlanClonePolicyPrototype : BackupPolicyPlanClonePolicyPrototype struct
type BackupPolicyPlanClonePolicyPrototype struct {
	// The maximum number of recent snapshots (per source) that will keep clones.
	MaxSnapshots *int64 `json:"max_snapshots,omitempty"`

	// The zone this backup policy plan will create snapshot clones in.
	Zones []ZoneIdentityIntf `json:"zones" validate:"required"`
}

// NewBackupPolicyPlanClonePolicyPrototype : Instantiate BackupPolicyPlanClonePolicyPrototype (Generic Model Constructor)
func (*VpcV1) NewBackupPolicyPlanClonePolicyPrototype(zones []ZoneIdentityIntf) (_model *BackupPolicyPlanClonePolicyPrototype, err error) {
	_model = &BackupPolicyPlanClonePolicyPrototype{
		Zones: zones,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalBackupPolicyPlanClonePolicyPrototype unmarshals an instance of BackupPolicyPlanClonePolicyPrototype from the specified map of raw messages.
func UnmarshalBackupPolicyPlanClonePolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanClonePolicyPrototype)
	err = core.UnmarshalPrimitive(m, "max_snapshots", &obj.MaxSnapshots)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_snapshots-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zones", &obj.Zones, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zones-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanCollection : BackupPolicyPlanCollection struct
type BackupPolicyPlanCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of plans for the backup policy.
	Plans []BackupPolicyPlan `json:"plans" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBackupPolicyPlanCollection unmarshals an instance of BackupPolicyPlanCollection from the specified map of raw messages.
func UnmarshalBackupPolicyPlanCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "plans", &obj.Plans, UnmarshalBackupPolicyPlan)
	if err != nil {
		err = core.SDKErrorf(err, "", "plans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanDeletionTrigger : BackupPolicyPlanDeletionTrigger struct
type BackupPolicyPlanDeletionTrigger struct {
	// The maximum number of days to keep each backup after creation.
	DeleteAfter *int64 `json:"delete_after" validate:"required"`

	// The maximum number of recent backups to keep. If absent, there is no maximum.
	DeleteOverCount *int64 `json:"delete_over_count,omitempty"`
}

// UnmarshalBackupPolicyPlanDeletionTrigger unmarshals an instance of BackupPolicyPlanDeletionTrigger from the specified map of raw messages.
func UnmarshalBackupPolicyPlanDeletionTrigger(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanDeletionTrigger)
	err = core.UnmarshalPrimitive(m, "delete_after", &obj.DeleteAfter)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_after-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "delete_over_count", &obj.DeleteOverCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_over_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanDeletionTriggerPatch : BackupPolicyPlanDeletionTriggerPatch struct
type BackupPolicyPlanDeletionTriggerPatch struct {
	// The maximum number of days to keep each backup after creation.
	DeleteAfter *int64 `json:"delete_after,omitempty"`

	// The maximum number of recent backups to keep. Specify `null` to remove any existing maximum.
	DeleteOverCount *int64 `json:"delete_over_count,omitempty"`
}

// UnmarshalBackupPolicyPlanDeletionTriggerPatch unmarshals an instance of BackupPolicyPlanDeletionTriggerPatch from the specified map of raw messages.
func UnmarshalBackupPolicyPlanDeletionTriggerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanDeletionTriggerPatch)
	err = core.UnmarshalPrimitive(m, "delete_after", &obj.DeleteAfter)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_after-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "delete_over_count", &obj.DeleteOverCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_over_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the BackupPolicyPlanDeletionTriggerPatch
func (backupPolicyPlanDeletionTriggerPatch *BackupPolicyPlanDeletionTriggerPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(backupPolicyPlanDeletionTriggerPatch.DeleteAfter) {
		_patch["delete_after"] = backupPolicyPlanDeletionTriggerPatch.DeleteAfter
	}
	if !core.IsNil(backupPolicyPlanDeletionTriggerPatch.DeleteOverCount) {
		_patch["delete_over_count"] = backupPolicyPlanDeletionTriggerPatch.DeleteOverCount
	}

	return
}

// BackupPolicyPlanDeletionTriggerPrototype : BackupPolicyPlanDeletionTriggerPrototype struct
type BackupPolicyPlanDeletionTriggerPrototype struct {
	// The maximum number of days to keep each backup after creation.
	DeleteAfter *int64 `json:"delete_after,omitempty"`

	// The maximum number of recent backups to keep. If unspecified, there will be no maximum.
	DeleteOverCount *int64 `json:"delete_over_count,omitempty"`
}

// UnmarshalBackupPolicyPlanDeletionTriggerPrototype unmarshals an instance of BackupPolicyPlanDeletionTriggerPrototype from the specified map of raw messages.
func UnmarshalBackupPolicyPlanDeletionTriggerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanDeletionTriggerPrototype)
	err = core.UnmarshalPrimitive(m, "delete_after", &obj.DeleteAfter)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_after-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "delete_over_count", &obj.DeleteOverCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_over_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanPatch : BackupPolicyPlanPatch struct
type BackupPolicyPlanPatch struct {
	// Indicates whether the plan is active.
	Active *bool `json:"active,omitempty"`

	// The user tags to attach to backups (snapshots) created by this plan. Updating this value does not change the user
	// tags for backups that have already been created by this plan.
	AttachUserTags []string `json:"attach_user_tags,omitempty"`

	ClonePolicy *BackupPolicyPlanClonePolicyPatch `json:"clone_policy,omitempty"`

	// Indicates whether to copy the source's user tags to the created backups (snapshots).
	CopyUserTags *bool `json:"copy_user_tags,omitempty"`

	// The cron specification for the backup schedule. The backup policy jobs
	// (which create and delete backups for this plan) will not start until this time, and may start for up to 90 minutes
	// after this time.
	//
	// All backup schedules for plans in the same policy must be at least an hour apart.
	CronSpec *string `json:"cron_spec,omitempty"`

	DeletionTrigger *BackupPolicyPlanDeletionTriggerPatch `json:"deletion_trigger,omitempty"`

	// The name for this backup policy plan. The name must not be used by another plan for the backup policy.
	Name *string `json:"name,omitempty"`

	// The policies for additional backups in remote regions (replacing any existing policies).
	RemoteRegionPolicies []BackupPolicyPlanRemoteRegionPolicyPrototype `json:"remote_region_policies,omitempty"`
}

// UnmarshalBackupPolicyPlanPatch unmarshals an instance of BackupPolicyPlanPatch from the specified map of raw messages.
func UnmarshalBackupPolicyPlanPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanPatch)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "attach_user_tags", &obj.AttachUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "attach_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "clone_policy", &obj.ClonePolicy, UnmarshalBackupPolicyPlanClonePolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "clone_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "copy_user_tags", &obj.CopyUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "copy_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cron_spec", &obj.CronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deletion_trigger", &obj.DeletionTrigger, UnmarshalBackupPolicyPlanDeletionTriggerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "deletion_trigger-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote_region_policies", &obj.RemoteRegionPolicies, UnmarshalBackupPolicyPlanRemoteRegionPolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote_region_policies-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the BackupPolicyPlanPatch
func (backupPolicyPlanPatch *BackupPolicyPlanPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(backupPolicyPlanPatch.Active) {
		_patch["active"] = backupPolicyPlanPatch.Active
	}
	if !core.IsNil(backupPolicyPlanPatch.AttachUserTags) {
		_patch["attach_user_tags"] = backupPolicyPlanPatch.AttachUserTags
	}
	if !core.IsNil(backupPolicyPlanPatch.ClonePolicy) {
		_patch["clone_policy"] = backupPolicyPlanPatch.ClonePolicy.asPatch()
	}
	if !core.IsNil(backupPolicyPlanPatch.CopyUserTags) {
		_patch["copy_user_tags"] = backupPolicyPlanPatch.CopyUserTags
	}
	if !core.IsNil(backupPolicyPlanPatch.CronSpec) {
		_patch["cron_spec"] = backupPolicyPlanPatch.CronSpec
	}
	if !core.IsNil(backupPolicyPlanPatch.DeletionTrigger) {
		_patch["deletion_trigger"] = backupPolicyPlanPatch.DeletionTrigger.asPatch()
	}
	if !core.IsNil(backupPolicyPlanPatch.Name) {
		_patch["name"] = backupPolicyPlanPatch.Name
	}
	if !core.IsNil(backupPolicyPlanPatch.RemoteRegionPolicies) {
		var remoteRegionPoliciesPatches []map[string]interface{}
		for _, remoteRegionPolicies := range backupPolicyPlanPatch.RemoteRegionPolicies {
			remoteRegionPoliciesPatches = append(remoteRegionPoliciesPatches, remoteRegionPolicies.asPatch())
		}
		_patch["remote_region_policies"] = remoteRegionPoliciesPatches
	}

	return
}

// BackupPolicyPlanPrototype : BackupPolicyPlanPrototype struct
type BackupPolicyPlanPrototype struct {
	// Indicates whether the plan is active.
	Active *bool `json:"active,omitempty"`

	// The user tags to attach to each backup (snapshot) created by this plan.
	AttachUserTags []string `json:"attach_user_tags,omitempty"`

	ClonePolicy *BackupPolicyPlanClonePolicyPrototype `json:"clone_policy,omitempty"`

	// Indicates whether to copy the source's user tags to the created backups (snapshots).
	CopyUserTags *bool `json:"copy_user_tags,omitempty"`

	// The cron specification for the backup schedule. The backup policy jobs
	// (which create and delete backups for this plan) will not start until this time, and may start for up to 90 minutes
	// after this time.
	//
	// All backup schedules for plans in the same policy must be at least an hour apart.
	CronSpec *string `json:"cron_spec" validate:"required"`

	DeletionTrigger *BackupPolicyPlanDeletionTriggerPrototype `json:"deletion_trigger,omitempty"`

	// The name for this backup policy plan. The name must not be used by another plan for the backup policy. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The policies for additional backups in remote regions.
	RemoteRegionPolicies []BackupPolicyPlanRemoteRegionPolicyPrototype `json:"remote_region_policies,omitempty"`
}

// NewBackupPolicyPlanPrototype : Instantiate BackupPolicyPlanPrototype (Generic Model Constructor)
func (*VpcV1) NewBackupPolicyPlanPrototype(cronSpec string) (_model *BackupPolicyPlanPrototype, err error) {
	_model = &BackupPolicyPlanPrototype{
		CronSpec: core.StringPtr(cronSpec),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalBackupPolicyPlanPrototype unmarshals an instance of BackupPolicyPlanPrototype from the specified map of raw messages.
func UnmarshalBackupPolicyPlanPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanPrototype)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "attach_user_tags", &obj.AttachUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "attach_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "clone_policy", &obj.ClonePolicy, UnmarshalBackupPolicyPlanClonePolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "clone_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "copy_user_tags", &obj.CopyUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "copy_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cron_spec", &obj.CronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deletion_trigger", &obj.DeletionTrigger, UnmarshalBackupPolicyPlanDeletionTriggerPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "deletion_trigger-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote_region_policies", &obj.RemoteRegionPolicies, UnmarshalBackupPolicyPlanRemoteRegionPolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote_region_policies-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanReference : BackupPolicyPlanReference struct
type BackupPolicyPlanReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this backup policy plan.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this backup policy plan.
	ID *string `json:"id" validate:"required"`

	// The name for this backup policy plan. The name is unique across all plans in the backup policy.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *BackupPolicyPlanRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the BackupPolicyPlanReference.ResourceType property.
// The resource type.
const (
	BackupPolicyPlanReferenceResourceTypeBackupPolicyPlanConst = "backup_policy_plan"
)

// UnmarshalBackupPolicyPlanReference unmarshals an instance of BackupPolicyPlanReference from the specified map of raw messages.
func UnmarshalBackupPolicyPlanReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalBackupPolicyPlanRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type BackupPolicyPlanRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalBackupPolicyPlanRemote unmarshals an instance of BackupPolicyPlanRemote from the specified map of raw messages.
func UnmarshalBackupPolicyPlanRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanRemote)
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanRemoteRegionPolicy : BackupPolicyPlanRemoteRegionPolicy struct
type BackupPolicyPlanRemoteRegionPolicy struct {
	// The region this backup policy plan will create backups in.
	DeleteOverCount *int64 `json:"delete_over_count" validate:"required"`

	// The root key used to rewrap the data encryption key for the backup (snapshot).
	EncryptionKey *EncryptionKeyReference `json:"encryption_key" validate:"required"`

	// The region this backup policy plan will create backups in.
	Region *RegionReference `json:"region" validate:"required"`
}

// UnmarshalBackupPolicyPlanRemoteRegionPolicy unmarshals an instance of BackupPolicyPlanRemoteRegionPolicy from the specified map of raw messages.
func UnmarshalBackupPolicyPlanRemoteRegionPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanRemoteRegionPolicy)
	err = core.UnmarshalPrimitive(m, "delete_over_count", &obj.DeleteOverCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_over_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyPlanRemoteRegionPolicyPrototype : BackupPolicyPlanRemoteRegionPolicyPrototype struct
type BackupPolicyPlanRemoteRegionPolicyPrototype struct {
	// The region this backup policy plan will create backups in.
	DeleteOverCount *int64 `json:"delete_over_count,omitempty"`

	// The root key to use to rewrap the data encryption key for the backup (snapshot).
	//
	// If unspecified, the source's `encryption_key` will be used.
	// The specified key may be in a different account, subject to IAM policies.
	EncryptionKey EncryptionKeyIdentityIntf `json:"encryption_key,omitempty"`

	// The region this backup policy plan will create backups in.
	Region RegionIdentityIntf `json:"region" validate:"required"`
}

// NewBackupPolicyPlanRemoteRegionPolicyPrototype : Instantiate BackupPolicyPlanRemoteRegionPolicyPrototype (Generic Model Constructor)
func (*VpcV1) NewBackupPolicyPlanRemoteRegionPolicyPrototype(region RegionIdentityIntf) (_model *BackupPolicyPlanRemoteRegionPolicyPrototype, err error) {
	_model = &BackupPolicyPlanRemoteRegionPolicyPrototype{
		Region: region,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalBackupPolicyPlanRemoteRegionPolicyPrototype unmarshals an instance of BackupPolicyPlanRemoteRegionPolicyPrototype from the specified map of raw messages.
func UnmarshalBackupPolicyPlanRemoteRegionPolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPlanRemoteRegionPolicyPrototype)
	err = core.UnmarshalPrimitive(m, "delete_over_count", &obj.DeleteOverCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_over_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the BackupPolicyPlanRemoteRegionPolicyPrototype
func (backupPolicyPlanRemoteRegionPolicyPrototype *BackupPolicyPlanRemoteRegionPolicyPrototype) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(backupPolicyPlanRemoteRegionPolicyPrototype.DeleteOverCount) {
		_patch["delete_over_count"] = backupPolicyPlanRemoteRegionPolicyPrototype.DeleteOverCount
	}
	if !core.IsNil(backupPolicyPlanRemoteRegionPolicyPrototype.EncryptionKey) {
		_patch["encryption_key"] = backupPolicyPlanRemoteRegionPolicyPrototype.EncryptionKey.asPatch()
	}
	if !core.IsNil(backupPolicyPlanRemoteRegionPolicyPrototype.Region) {
		_patch["region"] = backupPolicyPlanRemoteRegionPolicyPrototype.Region.asPatch()
	}

	return
}

// BackupPolicyPrototype : BackupPolicyPrototype struct
// Models which "extend" this model:
// - BackupPolicyPrototypeBackupPolicyMatchResourceTypeVolumePrototype
// - BackupPolicyPrototypeBackupPolicyMatchResourceTypeInstancePrototype
// - BackupPolicyPrototypeBackupPolicyMatchResourceTypeSharePrototype
type BackupPolicyPrototype struct {
	// The resource type this backup policy will apply to. Resources that have both a matching type and a matching user tag
	// will be subject to the backup policy.
	MatchResourceType *string `json:"match_resource_type" validate:"required"`

	// The user tags this backup policy will apply to. Resources that have both a matching user tag and a matching type
	// will be subject to the backup policy.
	MatchUserTags []string `json:"match_user_tags" validate:"required"`

	// The name for this backup policy. The name must not be used by another backup policy in the region. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The prototype objects for backup plans to be created for this backup policy.
	Plans []BackupPolicyPlanPrototype `json:"plans,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The scope to use for this backup policy.
	//
	// If unspecified, the policy will be scoped to the account.
	Scope BackupPolicyScopePrototypeIntf `json:"scope,omitempty"`

	// The included content for backups created using this policy:
	// - `boot_volume`: Include the instance's boot volume.
	// - `data_volumes`: Include the instance's data volumes.
	IncludedContent []string `json:"included_content,omitempty"`
}

// Constants associated with the BackupPolicyPrototype.MatchResourceType property.
// The resource type this backup policy will apply to. Resources that have both a matching type and a matching user tag
// will be subject to the backup policy.
const (
	BackupPolicyPrototypeMatchResourceTypeInstanceConst = "instance"
	BackupPolicyPrototypeMatchResourceTypeShareConst    = "share"
	BackupPolicyPrototypeMatchResourceTypeVolumeConst   = "volume"
)

// Constants associated with the BackupPolicyPrototype.IncludedContent property.
// An item to include.
const (
	BackupPolicyPrototypeIncludedContentBootVolumeConst  = "boot_volume"
	BackupPolicyPrototypeIncludedContentDataVolumesConst = "data_volumes"
)

func (*BackupPolicyPrototype) isaBackupPolicyPrototype() bool {
	return true
}

type BackupPolicyPrototypeIntf interface {
	isaBackupPolicyPrototype() bool
}

// UnmarshalBackupPolicyPrototype unmarshals an instance of BackupPolicyPrototype from the specified map of raw messages.
func UnmarshalBackupPolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyPrototype)
	err = core.UnmarshalPrimitive(m, "match_resource_type", &obj.MatchResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "match_resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "match_user_tags", &obj.MatchUserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "match_user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "plans", &obj.Plans, UnmarshalBackupPolicyPlanPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "plans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "scope", &obj.Scope, UnmarshalBackupPolicyScopePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "scope-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "included_content", &obj.IncludedContent)
	if err != nil {
		err = core.SDKErrorf(err, "", "included_content-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyScope : The scope for this backup policy.
// Models which "extend" this model:
// - BackupPolicyScopeEnterpriseReference
// - BackupPolicyScopeAccountReference
type BackupPolicyScope struct {
	// The CRN for this enterprise.
	CRN *string `json:"crn,omitempty"`

	// The unique identifier for this enterprise.
	ID *string `json:"id,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the BackupPolicyScope.ResourceType property.
// The resource type.
const (
	BackupPolicyScopeResourceTypeEnterpriseConst = "enterprise"
)

func (*BackupPolicyScope) isaBackupPolicyScope() bool {
	return true
}

type BackupPolicyScopeIntf interface {
	isaBackupPolicyScope() bool
}

// UnmarshalBackupPolicyScope unmarshals an instance of BackupPolicyScope from the specified map of raw messages.
func UnmarshalBackupPolicyScope(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyScope)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyScopePrototype : The scope to use for this backup policy.
//
// If unspecified, the policy will be scoped to the account.
// Models which "extend" this model:
// - BackupPolicyScopePrototypeEnterpriseIdentity
type BackupPolicyScopePrototype struct {
	// The CRN for this enterprise.
	CRN *string `json:"crn,omitempty"`
}

func (*BackupPolicyScopePrototype) isaBackupPolicyScopePrototype() bool {
	return true
}

type BackupPolicyScopePrototypeIntf interface {
	isaBackupPolicyScopePrototype() bool
}

// UnmarshalBackupPolicyScopePrototype unmarshals an instance of BackupPolicyScopePrototype from the specified map of raw messages.
func UnmarshalBackupPolicyScopePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyScopePrototype)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BackupPolicyTargetSnapshot : BackupPolicyTargetSnapshot struct
// Models which "extend" this model:
// - BackupPolicyTargetSnapshotSnapshotReference
// - BackupPolicyTargetSnapshotShareSnapshotReference
type BackupPolicyTargetSnapshot struct {
	// The CRN of this snapshot.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this snapshot.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this snapshot.
	ID *string `json:"id,omitempty"`

	// The name for this snapshot. The name is unique across all snapshots in the region.
	Name *string `json:"name,omitempty"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *SnapshotRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the BackupPolicyTargetSnapshot.ResourceType property.
// The resource type.
const (
	BackupPolicyTargetSnapshotResourceTypeSnapshotConst = "snapshot"
)

func (*BackupPolicyTargetSnapshot) isaBackupPolicyTargetSnapshot() bool {
	return true
}

type BackupPolicyTargetSnapshotIntf interface {
	isaBackupPolicyTargetSnapshot() bool
}

// UnmarshalBackupPolicyTargetSnapshot unmarshals an instance of BackupPolicyTargetSnapshot from the specified map of raw messages.
func UnmarshalBackupPolicyTargetSnapshot(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BackupPolicyTargetSnapshot)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalSnapshotRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServer : BareMetalServer struct
type BareMetalServer struct {
	// The total bandwidth (in megabits per second) shared across the bare metal server network attachments or bare metal
	// server network interfaces.
	Bandwidth *int64 `json:"bandwidth" validate:"required"`

	// The resource from which this bare metal server is booted.
	//
	// The resources supported by this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	BootTarget BareMetalServerBootTargetIntf `json:"boot_target" validate:"required"`

	// The bare metal server CPU configuration.
	Cpu *BareMetalServerCpu `json:"cpu" validate:"required"`

	// The date and time that the bare metal server was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this bare metal server.
	CRN *string `json:"crn" validate:"required"`

	// The disks for this bare metal server, including any disks that are associated with the
	// `boot_target`.
	Disks []BareMetalServerDisk `json:"disks" validate:"required"`

	// Indicates whether secure boot is enabled. If enabled, the image must support secure boot or the server will fail to
	// boot.
	EnableSecureBoot *bool `json:"enable_secure_boot" validate:"required"`

	// Firmware information for the bare metal server.
	Firmware *BareMetalServerFirmware `json:"firmware" validate:"required"`

	// The reasons for the current server `health_state` (if any):
	// - `reservation_capacity_unavailable`: The reservation affinity pool has no
	//   available capacity.
	// - `reservation_deleted`: The reservation affinity pool has a deleted reservation.
	// - `reservation_expired`: The reservation affinity pool has an expired reservation.
	// - `reservation_failed`: The reservation affinity pool has a failed reservation.
	//
	// See [health status reasons](https://cloud.ibm.com/docs/vpc?topic=vpc-server-health-status-reasons) for details. The
	// enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	HealthReasons []BareMetalServerHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this bare metal server.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this bare metal server.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []BareMetalServerLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the bare metal server.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The amount of memory, truncated to whole gibibytes.
	Memory *int64 `json:"memory" validate:"required"`

	// The name for this bare metal server. The name is unique across all bare metal servers in the region.
	Name *string `json:"name" validate:"required"`

	// The network attachments for this bare metal server, including the primary network attachment.
	NetworkAttachments []BareMetalServerNetworkAttachmentReference `json:"network_attachments,omitempty"`

	// The network interfaces for this bare metal server, including the primary network interface.
	//
	// If this bare metal server has network attachments, each network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface.
	NetworkInterfaces []NetworkInterfaceBareMetalServerContextReference `json:"network_interfaces" validate:"required"`

	// The primary network attachment for this bare metal server.
	PrimaryNetworkAttachment *BareMetalServerNetworkAttachmentReference `json:"primary_network_attachment,omitempty"`

	// The primary network interface for this bare metal server.
	//
	// If this bare metal server has network attachments, this primary network interface is
	// a [read-only
	// representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients)
	// of the primary network attachment and its attached virtual network interface.
	PrimaryNetworkInterface *NetworkInterfaceBareMetalServerContextReference `json:"primary_network_interface" validate:"required"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile)
	// for this bare metal server.
	Profile *BareMetalServerProfileReference `json:"profile" validate:"required"`

	// The reservation used by this bare metal server.
	// If absent, no reservation is in use.
	Reservation *ReservationReference `json:"reservation,omitempty"`

	ReservationAffinity *BareMetalServerReservationAffinity `json:"reservation_affinity" validate:"required"`

	// The resource group for this bare metal server.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of this bare metal server:
	// - `deleting`: server is undergoing deletion
	// - `failed`: server is failed and not usable (see `status_reasons`)
	// - `maintenance`: server is undergoing maintenance (not usable)
	// - `pending`: server is being provisioned and not yet usable
	// - `reinitializing`: server is reinitializing and not yet usable
	// - `restarting`: server is restarting and not yet usable
	// - `running`: server is powered on
	// - `starting`: server is starting and not yet usable
	// - `stopped`: server is powered off
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []BareMetalServerStatusReason `json:"status_reasons" validate:"required"`

	TrustedPlatformModule *BareMetalServerTrustedPlatformModule `json:"trusted_platform_module" validate:"required"`

	// The VPC this bare metal server resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The zone this bare metal server resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the BareMetalServer.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	BareMetalServerHealthStateDegradedConst     = "degraded"
	BareMetalServerHealthStateFaultedConst      = "faulted"
	BareMetalServerHealthStateInapplicableConst = "inapplicable"
	BareMetalServerHealthStateOkConst           = "ok"
)

// Constants associated with the BareMetalServer.LifecycleState property.
// The lifecycle state of the bare metal server.
const (
	BareMetalServerLifecycleStateDeletingConst  = "deleting"
	BareMetalServerLifecycleStateFailedConst    = "failed"
	BareMetalServerLifecycleStatePendingConst   = "pending"
	BareMetalServerLifecycleStateStableConst    = "stable"
	BareMetalServerLifecycleStateSuspendedConst = "suspended"
	BareMetalServerLifecycleStateUpdatingConst  = "updating"
	BareMetalServerLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the BareMetalServer.ResourceType property.
// The resource type.
const (
	BareMetalServerResourceTypeBareMetalServerConst = "bare_metal_server"
)

// Constants associated with the BareMetalServer.Status property.
// The status of this bare metal server:
// - `deleting`: server is undergoing deletion
// - `failed`: server is failed and not usable (see `status_reasons`)
// - `maintenance`: server is undergoing maintenance (not usable)
// - `pending`: server is being provisioned and not yet usable
// - `reinitializing`: server is reinitializing and not yet usable
// - `restarting`: server is restarting and not yet usable
// - `running`: server is powered on
// - `starting`: server is starting and not yet usable
// - `stopped`: server is powered off
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerStatusDeletingConst       = "deleting"
	BareMetalServerStatusFailedConst         = "failed"
	BareMetalServerStatusMaintenanceConst    = "maintenance"
	BareMetalServerStatusPendingConst        = "pending"
	BareMetalServerStatusReinitializingConst = "reinitializing"
	BareMetalServerStatusRestartingConst     = "restarting"
	BareMetalServerStatusRunningConst        = "running"
	BareMetalServerStatusStartingConst       = "starting"
	BareMetalServerStatusStoppedConst        = "stopped"
)

// UnmarshalBareMetalServer unmarshals an instance of BareMetalServer from the specified map of raw messages.
func UnmarshalBareMetalServer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServer)
	err = core.UnmarshalPrimitive(m, "bandwidth", &obj.Bandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "boot_target", &obj.BootTarget, UnmarshalBareMetalServerBootTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "boot_target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cpu", &obj.Cpu, UnmarshalBareMetalServerCpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "cpu-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalBareMetalServerDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "firmware", &obj.Firmware, UnmarshalBareMetalServerFirmware)
	if err != nil {
		err = core.SDKErrorf(err, "", "firmware-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalBareMetalServerHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalBareMetalServerLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "memory", &obj.Memory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalBareMetalServerNetworkAttachmentReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalNetworkInterfaceBareMetalServerContextReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_attachment", &obj.PrimaryNetworkAttachment, UnmarshalBareMetalServerNetworkAttachmentReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_interface", &obj.PrimaryNetworkInterface, UnmarshalNetworkInterfaceBareMetalServerContextReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalBareMetalServerProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation", &obj.Reservation, UnmarshalReservationReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalBareMetalServerReservationAffinity)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalBareMetalServerStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "trusted_platform_module", &obj.TrustedPlatformModule, UnmarshalBareMetalServerTrustedPlatformModule)
	if err != nil {
		err = core.SDKErrorf(err, "", "trusted_platform_module-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerBootTarget : The resource from which this bare metal server is booted.
//
// The resources supported by this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
// Models which "extend" this model:
// - BareMetalServerBootTargetBareMetalServerDiskReference
type BareMetalServerBootTarget struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this bare metal server disk.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this bare metal server disk.
	ID *string `json:"id,omitempty"`

	// The name for this bare metal server disk. The name is unique across all disks on the bare metal server.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the BareMetalServerBootTarget.ResourceType property.
// The resource type.
const (
	BareMetalServerBootTargetResourceTypeBareMetalServerDiskConst = "bare_metal_server_disk"
)

func (*BareMetalServerBootTarget) isaBareMetalServerBootTarget() bool {
	return true
}

type BareMetalServerBootTargetIntf interface {
	isaBareMetalServerBootTarget() bool
}

// UnmarshalBareMetalServerBootTarget unmarshals an instance of BareMetalServerBootTarget from the specified map of raw messages.
func UnmarshalBareMetalServerBootTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerBootTarget)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerCpu : The bare metal server CPU configuration.
type BareMetalServerCpu struct {
	// The CPU architecture.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Architecture *string `json:"architecture" validate:"required"`

	// The total number of cores.
	CoreCount *int64 `json:"core_count" validate:"required"`

	// The total number of CPU sockets.
	SocketCount *int64 `json:"socket_count" validate:"required"`

	// The total number of hardware threads per core.
	ThreadsPerCore *int64 `json:"threads_per_core" validate:"required"`
}

// Constants associated with the BareMetalServerCpu.Architecture property.
// The CPU architecture.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerCpuArchitectureAmd64Const = "amd64"
	BareMetalServerCpuArchitectureS390xConst = "s390x"
)

// UnmarshalBareMetalServerCpu unmarshals an instance of BareMetalServerCpu from the specified map of raw messages.
func UnmarshalBareMetalServerCpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerCpu)
	err = core.UnmarshalPrimitive(m, "architecture", &obj.Architecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "core_count", &obj.CoreCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "core_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "socket_count", &obj.SocketCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "socket_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "threads_per_core", &obj.ThreadsPerCore)
	if err != nil {
		err = core.SDKErrorf(err, "", "threads_per_core-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerCollection : BareMetalServerCollection struct
type BareMetalServerCollection struct {
	// A page of bare metal servers.
	BareMetalServers []BareMetalServer `json:"bare_metal_servers" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBareMetalServerCollection unmarshals an instance of BareMetalServerCollection from the specified map of raw messages.
func UnmarshalBareMetalServerCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerCollection)
	err = core.UnmarshalModel(m, "bare_metal_servers", &obj.BareMetalServers, UnmarshalBareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_servers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *BareMetalServerCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// BareMetalServerConsoleAccessToken : The bare metal server console access token information.
type BareMetalServerConsoleAccessToken struct {
	// A URL safe single-use token used to access the console WebSocket.
	AccessToken *string `json:"access_token" validate:"required"`

	// The bare metal server console type for which this token may be used.
	ConsoleType *string `json:"console_type" validate:"required"`

	// The date and time that the access token was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The date and time that the access token will expire.
	ExpiresAt *strfmt.DateTime `json:"expires_at" validate:"required"`

	// Indicates whether to disconnect an existing serial console session as the serial console cannot be shared.  This has
	// no effect on VNC consoles.
	Force *bool `json:"force" validate:"required"`

	// The URL to access this bare metal server console.
	Href *string `json:"href" validate:"required"`
}

// Constants associated with the BareMetalServerConsoleAccessToken.ConsoleType property.
// The bare metal server console type for which this token may be used.
const (
	BareMetalServerConsoleAccessTokenConsoleTypeSerialConst = "serial"
	BareMetalServerConsoleAccessTokenConsoleTypeVncConst    = "vnc"
)

// UnmarshalBareMetalServerConsoleAccessToken unmarshals an instance of BareMetalServerConsoleAccessToken from the specified map of raw messages.
func UnmarshalBareMetalServerConsoleAccessToken(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerConsoleAccessToken)
	err = core.UnmarshalPrimitive(m, "access_token", &obj.AccessToken)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_token-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "console_type", &obj.ConsoleType)
	if err != nil {
		err = core.SDKErrorf(err, "", "console_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "expires_at", &obj.ExpiresAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "expires_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "force", &obj.Force)
	if err != nil {
		err = core.SDKErrorf(err, "", "force-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerDisk : BareMetalServerDisk struct
type BareMetalServerDisk struct {
	// The usage constraints to be matched against the requested bare metal server
	// properties to determine compatibility.
	//
	// Only present for disks which are referenced in a bare metal server's `boot_target`
	// property. The value of this property will be inherited from the source image at creation.
	AllowedUse *BareMetalServerDiskAllowedUse `json:"allowed_use,omitempty"`

	// The date and time that the disk was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this bare metal server disk.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this bare metal server disk.
	ID *string `json:"id" validate:"required"`

	// The disk attachment interface used:
	// - `fcp`: Fiber Channel Protocol
	// - `sata`: Serial Advanced Technology Attachment
	// - `nvme`: Non-Volatile Memory Express
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The name for this bare metal server disk. The name is unique across all disks on the bare metal server.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The size of the disk in GB (gigabytes).
	Size *int64 `json:"size" validate:"required"`
}

// Constants associated with the BareMetalServerDisk.InterfaceType property.
// The disk attachment interface used:
// - `fcp`: Fiber Channel Protocol
// - `sata`: Serial Advanced Technology Attachment
// - `nvme`: Non-Volatile Memory Express
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerDiskInterfaceTypeFcpConst  = "fcp"
	BareMetalServerDiskInterfaceTypeNvmeConst = "nvme"
	BareMetalServerDiskInterfaceTypeSataConst = "sata"
)

// Constants associated with the BareMetalServerDisk.ResourceType property.
// The resource type.
const (
	BareMetalServerDiskResourceTypeBareMetalServerDiskConst = "bare_metal_server_disk"
)

// UnmarshalBareMetalServerDisk unmarshals an instance of BareMetalServerDisk from the specified map of raw messages.
func UnmarshalBareMetalServerDisk(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerDisk)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalBareMetalServerDiskAllowedUse)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerDiskAllowedUse : BareMetalServerDiskAllowedUse struct
type BareMetalServerDiskAllowedUse struct {
	// The API version with which to evaluate the expressions.
	//
	// If specified, the value must be between `2019-01-01` and today's date (in UTC). If unspecified, the `version` query
	// parameter value will be used.
	ApiVersion *string `json:"api_version" validate:"required"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using the image data in
	// this disk.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variable is supported, corresponding
	// to the `BareMetalServer` property:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server" validate:"required"`
}

// UnmarshalBareMetalServerDiskAllowedUse unmarshals an instance of BareMetalServerDiskAllowedUse from the specified map of raw messages.
func UnmarshalBareMetalServerDiskAllowedUse(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerDiskAllowedUse)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerDiskCollection : BareMetalServerDiskCollection struct
type BareMetalServerDiskCollection struct {
	// The disks for the bare metal server.
	Disks []BareMetalServerDisk `json:"disks" validate:"required"`
}

// UnmarshalBareMetalServerDiskCollection unmarshals an instance of BareMetalServerDiskCollection from the specified map of raw messages.
func UnmarshalBareMetalServerDiskCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerDiskCollection)
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalBareMetalServerDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerDiskPatch : BareMetalServerDiskPatch struct
type BareMetalServerDiskPatch struct {
	// The name for this bare metal server disk. The name must not be used by another disk on the bare metal server.
	Name *string `json:"name,omitempty"`
}

// UnmarshalBareMetalServerDiskPatch unmarshals an instance of BareMetalServerDiskPatch from the specified map of raw messages.
func UnmarshalBareMetalServerDiskPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerDiskPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the BareMetalServerDiskPatch
func (bareMetalServerDiskPatch *BareMetalServerDiskPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(bareMetalServerDiskPatch.Name) {
		_patch["name"] = bareMetalServerDiskPatch.Name
	}

	return
}

// BareMetalServerFirmware : Firmware information for the bare metal server.
type BareMetalServerFirmware struct {
	// The type of update available.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Update *string `json:"update" validate:"required"`
}

// Constants associated with the BareMetalServerFirmware.Update property.
// The type of update available.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerFirmwareUpdateNoneConst     = "none"
	BareMetalServerFirmwareUpdateOptionalConst = "optional"
	BareMetalServerFirmwareUpdateRequiredConst = "required"
)

// UnmarshalBareMetalServerFirmware unmarshals an instance of BareMetalServerFirmware from the specified map of raw messages.
func UnmarshalBareMetalServerFirmware(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerFirmware)
	err = core.UnmarshalPrimitive(m, "update", &obj.Update)
	if err != nil {
		err = core.SDKErrorf(err, "", "update-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerHealthReason : BareMetalServerHealthReason struct
type BareMetalServerHealthReason struct {
	// A reason code for this health state.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the BareMetalServerHealthReason.Code property.
// A reason code for this health state.
const (
	BareMetalServerHealthReasonCodeReservationCapacityUnavailableConst = "reservation_capacity_unavailable"
	BareMetalServerHealthReasonCodeReservationDeletedConst             = "reservation_deleted"
	BareMetalServerHealthReasonCodeReservationExpiredConst             = "reservation_expired"
	BareMetalServerHealthReasonCodeReservationFailedConst              = "reservation_failed"
)

// UnmarshalBareMetalServerHealthReason unmarshals an instance of BareMetalServerHealthReason from the specified map of raw messages.
func UnmarshalBareMetalServerHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerInitialization : BareMetalServerInitialization struct
type BareMetalServerInitialization struct {
	// The image the bare metal server was provisioned from.
	Image *ImageReference `json:"image" validate:"required"`

	// The public SSH keys used at initialization.
	Keys []KeyReference `json:"keys" validate:"required"`

	// The user accounts that are created at initialization. There can be multiple account types distinguished by the
	// `resource_type` property.
	UserAccounts []BareMetalServerInitializationUserAccountIntf `json:"user_accounts" validate:"required"`
}

// UnmarshalBareMetalServerInitialization unmarshals an instance of BareMetalServerInitialization from the specified map of raw messages.
func UnmarshalBareMetalServerInitialization(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerInitialization)
	err = core.UnmarshalModel(m, "image", &obj.Image, UnmarshalImageReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "image-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "user_accounts", &obj.UserAccounts, UnmarshalBareMetalServerInitializationUserAccount)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_accounts-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerInitializationPrototype : BareMetalServerInitializationPrototype struct
type BareMetalServerInitializationPrototype struct {
	// The image to be used when provisioning the bare metal server.
	Image ImageIdentityIntf `json:"image" validate:"required"`

	// The public SSH keys to install on the bare metal server. Keys will be made available to the bare metal server as
	// cloud-init vendor data. For cloud-init enabled images, these keys will also be added as SSH authorized keys for the
	// [default user](https://cloud.ibm.com/docs/vpc?topic=vpc-vsi_is_connecting_linux#determining-default-user-account).
	//
	// For Windows images, at least one key must be specified, and one will be selected to encrypt the administrator
	// password. Keys are optional for other images, but if no keys are specified, the bare metal server will be
	// inaccessible unless the specified image provides another means of access.
	Keys []KeyIdentityIntf `json:"keys" validate:"required"`

	// The user data to be made available when initializing the bare metal server.
	UserData *string `json:"user_data,omitempty"`
}

// NewBareMetalServerInitializationPrototype : Instantiate BareMetalServerInitializationPrototype (Generic Model Constructor)
func (*VpcV1) NewBareMetalServerInitializationPrototype(image ImageIdentityIntf, keys []KeyIdentityIntf) (_model *BareMetalServerInitializationPrototype, err error) {
	_model = &BareMetalServerInitializationPrototype{
		Image: image,
		Keys:  keys,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalBareMetalServerInitializationPrototype unmarshals an instance of BareMetalServerInitializationPrototype from the specified map of raw messages.
func UnmarshalBareMetalServerInitializationPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerInitializationPrototype)
	err = core.UnmarshalModel(m, "image", &obj.Image, UnmarshalImageIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "image-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_data", &obj.UserData)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_data-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerInitializationUserAccount : BareMetalServerInitializationUserAccount struct
// Models which "extend" this model:
// - BareMetalServerInitializationUserAccountBareMetalServerInitializationHostUserAccount
type BareMetalServerInitializationUserAccount struct {
	// The administrator password at initialization, encrypted using `encryption_key`, and returned base64-encoded.
	EncryptedPassword *[]byte `json:"encrypted_password,omitempty"`

	// The public SSH key used to encrypt the password.
	EncryptionKey *KeyReference `json:"encryption_key,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`

	// The username for the account created at initialization.
	Username *string `json:"username,omitempty"`
}

// Constants associated with the BareMetalServerInitializationUserAccount.ResourceType property.
// The resource type.
const (
	BareMetalServerInitializationUserAccountResourceTypeHostUserAccountConst = "host_user_account"
)

func (*BareMetalServerInitializationUserAccount) isaBareMetalServerInitializationUserAccount() bool {
	return true
}

type BareMetalServerInitializationUserAccountIntf interface {
	isaBareMetalServerInitializationUserAccount() bool
}

// UnmarshalBareMetalServerInitializationUserAccount unmarshals an instance of BareMetalServerInitializationUserAccount from the specified map of raw messages.
func UnmarshalBareMetalServerInitializationUserAccount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerInitializationUserAccount)
	err = core.UnmarshalPrimitive(m, "encrypted_password", &obj.EncryptedPassword)
	if err != nil {
		err = core.SDKErrorf(err, "", "encrypted_password-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "username", &obj.Username)
	if err != nil {
		err = core.SDKErrorf(err, "", "username-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerLifecycleReason : BareMetalServerLifecycleReason struct
type BareMetalServerLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the BareMetalServerLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerLifecycleReasonCodeInternalErrorConst               = "internal_error"
	BareMetalServerLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalBareMetalServerLifecycleReason unmarshals an instance of BareMetalServerLifecycleReason from the specified map of raw messages.
func UnmarshalBareMetalServerLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerNetworkAttachment : BareMetalServerNetworkAttachment struct
// Models which "extend" this model:
// - BareMetalServerNetworkAttachmentByPci
// - BareMetalServerNetworkAttachmentByVlan
type BareMetalServerNetworkAttachment struct {
	// The date and time that the bare metal server network attachment was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this bare metal server network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this bare metal server network attachment.
	ID *string `json:"id" validate:"required"`

	// The network attachment's interface type:
	// - `pci`: a physical PCI device which can only be created or deleted when the bare metal
	//   server is stopped
	//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
	//     to use the PCI attachment
	//   - Cannot directly use an IEEE 802.1Q tag.
	// - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
	//   array of `allowed_vlans`.
	//   - Must use an IEEE 802.1Q tag.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The lifecycle state of the bare metal server network attachment.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this bare metal server network attachment. The name is unique across all network attachments for the
	// bare metal server.
	Name *string `json:"name" validate:"required"`

	// The port speed for this bare metal server network attachment in Mbps.
	PortSpeed *int64 `json:"port_speed" validate:"required"`

	// The primary IP address of the virtual network interface for the bare metal server
	// network attachment.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The subnet of the virtual network interface for the bare metal server network
	// attachment.
	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The bare metal server network attachment type.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`

	// The virtual network interface for this bare metal server network attachment.
	VirtualNetworkInterface *VirtualNetworkInterfaceReferenceAttachmentContext `json:"virtual_network_interface" validate:"required"`

	// The VLAN IDs allowed for `vlan` attachments using this PCI attachment.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// Indicates if the data path for the network attachment can float to another bare metal server. Can only be `true` for
	// network attachments with an `interface_type` of `vlan`.
	//
	// If `true`, and the network detects traffic for this data path on another bare metal server in the resource group,
	// the network attachment will be automatically deleted from this bare metal server and a new network attachment with
	// the same `id`, `name` and `vlan` will be created on the other bare metal server.  The virtual network interface for
	// this network attachment will be automatically be attached to the new network attachment.
	//
	// For the data path to float, the other bare metal server must be in the same
	// `resource_group`, and must have a network attachment with `interface_type` of `pci` with `allowed_vlans` including
	// this network attachment's `vlan`.
	AllowToFloat *bool `json:"allow_to_float,omitempty"`

	// The IEEE 802.1Q VLAN ID that must be used for all traffic on this attachment.
	Vlan *int64 `json:"vlan,omitempty"`
}

// Constants associated with the BareMetalServerNetworkAttachment.InterfaceType property.
// The network attachment's interface type:
//   - `pci`: a physical PCI device which can only be created or deleted when the bare metal
//     server is stopped
//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
//     to use the PCI attachment
//   - Cannot directly use an IEEE 802.1Q tag.
//   - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
//     array of `allowed_vlans`.
//   - Must use an IEEE 802.1Q tag.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerNetworkAttachmentInterfaceTypePciConst  = "pci"
	BareMetalServerNetworkAttachmentInterfaceTypeVlanConst = "vlan"
)

// Constants associated with the BareMetalServerNetworkAttachment.LifecycleState property.
// The lifecycle state of the bare metal server network attachment.
const (
	BareMetalServerNetworkAttachmentLifecycleStateDeletingConst  = "deleting"
	BareMetalServerNetworkAttachmentLifecycleStateFailedConst    = "failed"
	BareMetalServerNetworkAttachmentLifecycleStatePendingConst   = "pending"
	BareMetalServerNetworkAttachmentLifecycleStateStableConst    = "stable"
	BareMetalServerNetworkAttachmentLifecycleStateSuspendedConst = "suspended"
	BareMetalServerNetworkAttachmentLifecycleStateUpdatingConst  = "updating"
	BareMetalServerNetworkAttachmentLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the BareMetalServerNetworkAttachment.ResourceType property.
// The resource type.
const (
	BareMetalServerNetworkAttachmentResourceTypeBareMetalServerNetworkAttachmentConst = "bare_metal_server_network_attachment"
)

// Constants associated with the BareMetalServerNetworkAttachment.Type property.
// The bare metal server network attachment type.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerNetworkAttachmentTypePrimaryConst   = "primary"
	BareMetalServerNetworkAttachmentTypeSecondaryConst = "secondary"
)

func (*BareMetalServerNetworkAttachment) isaBareMetalServerNetworkAttachment() bool {
	return true
}

type BareMetalServerNetworkAttachmentIntf interface {
	isaBareMetalServerNetworkAttachment() bool
}

// UnmarshalBareMetalServerNetworkAttachment unmarshals an instance of BareMetalServerNetworkAttachment from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkAttachment(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkAttachment)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_speed", &obj.PortSpeed)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_speed-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalVirtualNetworkInterfaceReferenceAttachmentContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_vlans", &obj.AllowedVlans)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_vlans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allow_to_float", &obj.AllowToFloat)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_to_float-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "vlan", &obj.Vlan)
	if err != nil {
		err = core.SDKErrorf(err, "", "vlan-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerNetworkAttachmentCollection : BareMetalServerNetworkAttachmentCollection struct
type BareMetalServerNetworkAttachmentCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// The network attachments for the bare metal server.
	NetworkAttachments []BareMetalServerNetworkAttachmentIntf `json:"network_attachments" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBareMetalServerNetworkAttachmentCollection unmarshals an instance of BareMetalServerNetworkAttachmentCollection from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkAttachmentCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkAttachmentCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalBareMetalServerNetworkAttachment)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *BareMetalServerNetworkAttachmentCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// BareMetalServerNetworkAttachmentPatch : BareMetalServerNetworkAttachmentPatch struct
type BareMetalServerNetworkAttachmentPatch struct {
	// The VLAN IDs to allow for `vlan` attachments using this PCI attachment, replacing any existing VLAN IDs. The
	// specified values must include IDs for all `vlan` attachments currently using this PCI attachment.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// The name for this network attachment. The name must not be used by another network attachment for the bare metal
	// server.
	Name *string `json:"name,omitempty"`
}

// UnmarshalBareMetalServerNetworkAttachmentPatch unmarshals an instance of BareMetalServerNetworkAttachmentPatch from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkAttachmentPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkAttachmentPatch)
	err = core.UnmarshalPrimitive(m, "allowed_vlans", &obj.AllowedVlans)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_vlans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the BareMetalServerNetworkAttachmentPatch
func (bareMetalServerNetworkAttachmentPatch *BareMetalServerNetworkAttachmentPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(bareMetalServerNetworkAttachmentPatch.AllowedVlans) {
		_patch["allowed_vlans"] = bareMetalServerNetworkAttachmentPatch.AllowedVlans
	}
	if !core.IsNil(bareMetalServerNetworkAttachmentPatch.Name) {
		_patch["name"] = bareMetalServerNetworkAttachmentPatch.Name
	}

	return
}

// BareMetalServerNetworkAttachmentPrototype : BareMetalServerNetworkAttachmentPrototype struct
// Models which "extend" this model:
// - BareMetalServerNetworkAttachmentPrototypeBareMetalServerNetworkAttachmentByPciPrototype
// - BareMetalServerNetworkAttachmentPrototypeBareMetalServerNetworkAttachmentByVlanPrototype
type BareMetalServerNetworkAttachmentPrototype struct {
	// The network attachment's interface type:
	// - `pci`: a physical PCI device which can only be created or deleted when the bare metal
	//   server is stopped
	//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
	//     to use the PCI attachment
	//   - Cannot directly use an IEEE 802.1Q tag.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`
	// - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
	//   array of `allowed_vlans`.
	//   - Must use an IEEE 802.1Q tag.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The name for this bare metal server network attachment. Names must be unique within the bare metal server the
	// network attachment resides in. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// A virtual network interface for the bare metal server network attachment. This can be
	// specified using an existing virtual network interface, or a prototype object for a new
	// virtual network interface.
	//
	// If an existing virtual network interface is specified, it must not be the target of a flow
	// log collector.
	VirtualNetworkInterface BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf `json:"virtual_network_interface" validate:"required"`

	// The VLAN IDs to allow for `vlan` attachments using this PCI attachment.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// Indicates if the data path for the network attachment can float to another bare metal server. Can only be `true` for
	// network attachments with an `interface_type` of `vlan`.
	//
	// If `true`, and the network detects traffic for this data path on another bare metal server in the resource group,
	// the network attachment will be automatically deleted from this bare metal server and a new network attachment with
	// the same `id`, `name` and `vlan` will be created on the other bare metal server.  The virtual network interface for
	// this network attachment will be automatically be attached to the new network attachment.
	//
	// For the data path to float, the other bare metal server must be in the same
	// `resource_group`, and must have a network attachment with `interface_type` of `pci` with `allowed_vlans` including
	// this network attachment's `vlan`.
	AllowToFloat *bool `json:"allow_to_float,omitempty"`

	// The IEEE 802.1Q VLAN ID that must be used for all traffic on this attachment.
	Vlan *int64 `json:"vlan,omitempty"`
}

// Constants associated with the BareMetalServerNetworkAttachmentPrototype.InterfaceType property.
// The network attachment's interface type:
//   - `pci`: a physical PCI device which can only be created or deleted when the bare metal
//     server is stopped
//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
//     to use the PCI attachment
//   - Cannot directly use an IEEE 802.1Q tag.
//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`
//   - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
//     array of `allowed_vlans`.
//   - Must use an IEEE 802.1Q tag.
//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
const (
	BareMetalServerNetworkAttachmentPrototypeInterfaceTypePciConst  = "pci"
	BareMetalServerNetworkAttachmentPrototypeInterfaceTypeVlanConst = "vlan"
)

func (*BareMetalServerNetworkAttachmentPrototype) isaBareMetalServerNetworkAttachmentPrototype() bool {
	return true
}

type BareMetalServerNetworkAttachmentPrototypeIntf interface {
	isaBareMetalServerNetworkAttachmentPrototype() bool
}

// UnmarshalBareMetalServerNetworkAttachmentPrototype unmarshals an instance of BareMetalServerNetworkAttachmentPrototype from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkAttachmentPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkAttachmentPrototype)
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalBareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_vlans", &obj.AllowedVlans)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_vlans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allow_to_float", &obj.AllowToFloat)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_to_float-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "vlan", &obj.Vlan)
	if err != nil {
		err = core.SDKErrorf(err, "", "vlan-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface : A virtual network interface for the bare metal server network attachment. This can be specified using an existing
// virtual network interface, or a prototype object for a new virtual network interface.
//
// If an existing virtual network interface is specified, it must not be the target of a flow log collector.
// Models which "extend" this model:
// - BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceVirtualNetworkInterfacePrototypeBareMetalServerNetworkAttachmentContext
// - BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceVirtualNetworkInterfaceIdentity
type BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface struct {
	// Indicates whether source IP spoofing is allowed on this interface. If `false`, source IP spoofing is prevented on
	// this interface. If `true`, source IP spoofing is allowed on this interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// Indicates whether this virtual network interface will be automatically deleted when
	// `target` is deleted.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the virtual network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - Can only be attached to a `target` with a `resource_type` of
	//   `bare_metal_server_network_attachment`.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The additional IP addresses to bind to the virtual network interface. Each item may be either a reserved IP
	// identity, or a reserved IP prototype object which will be used to create a new reserved IP. All IP addresses must be
	// in the primary IP's subnet.
	//
	// If reserved IP identities are provided, the specified reserved IPs must be unbound.
	//
	// If reserved IP prototype objects with addresses are provided, the addresses must be available on the virtual network
	// interface's subnet. For any prototype objects that do not specify an address, an available address on the subnet
	// will be automatically selected and reserved.
	Ips []VirtualNetworkInterfaceIPPrototypeIntf `json:"ips,omitempty"`

	// The name for this virtual network interface. The name must not be used by another virtual network interface in the
	// VPC. If unspecified, the name will be a hyphenated list of randomly-selected words. Names beginning with `ibm-` are
	// reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the virtual network interface. May be either a
	// reserved IP identity, or a reserved IP prototype object which will be used to create a
	// new reserved IP.
	//
	// If a reserved IP identity is provided, the specified reserved IP must be unbound.
	//
	// If a reserved IP prototype object with an address is provided, the address must be
	// available on the virtual network interface's subnet. If no address is specified,
	// an available address on the subnet will be automatically selected and reserved.
	PrimaryIP VirtualNetworkInterfacePrimaryIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The protocol state filtering mode to use for this virtual network interface. If
	// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
	// resource type:
	//
	// - `bare_metal_server_network_attachment`: disabled
	// - `instance_network_attachment`: enabled
	// - `share_mount_target`: enabled
	//
	// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
	// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
	// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
	ProtocolStateFilteringMode *string `json:"protocol_state_filtering_mode,omitempty"`

	// The resource group to use for this virtual network interface. If unspecified, the
	// bare metal server's resource group will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The security groups to use for this virtual network interface. If unspecified, the default security group of the VPC
	// for the subnet is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet. Required if `primary_ip` does not specify a reserved IP
	// identity.
	Subnet SubnetIdentityIntf `json:"subnet,omitempty"`

	// The unique identifier for this virtual network interface.
	ID *string `json:"id,omitempty"`

	// The URL for this virtual network interface.
	Href *string `json:"href,omitempty"`

	// The CRN for this virtual network interface.
	CRN *string `json:"crn,omitempty"`
}

// Constants associated with the BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface.ProtocolStateFilteringMode property.
// The protocol state filtering mode to use for this virtual network interface. If
// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
// resource type:
//
// - `bare_metal_server_network_attachment`: disabled
// - `instance_network_attachment`: enabled
// - `share_mount_target`: enabled
//
// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
const (
	BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceProtocolStateFilteringModeAutoConst     = "auto"
	BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceProtocolStateFilteringModeDisabledConst = "disabled"
	BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceProtocolStateFilteringModeEnabledConst  = "enabled"
)

func (*BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface) isaBareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface() bool {
	return true
}

type BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf interface {
	isaBareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface() bool
}

// UnmarshalBareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface unmarshals an instance of BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_infrastructure_nat", &obj.EnableInfrastructureNat)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_infrastructure_nat-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalVirtualNetworkInterfaceIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalVirtualNetworkInterfacePrimaryIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol_state_filtering_mode", &obj.ProtocolStateFilteringMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol_state_filtering_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerNetworkAttachmentReference : BareMetalServerNetworkAttachmentReference struct
type BareMetalServerNetworkAttachmentReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this bare metal server network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this bare metal server network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this bare metal server network attachment. The name is unique across all network attachments for the
	// bare metal server.
	Name *string `json:"name" validate:"required"`

	// The primary IP address of the virtual network interface for the bare metal server
	// network attachment.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The subnet of the virtual network interface for the bare metal server network
	// attachment.
	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The virtual network interface for this bare metal server network attachment.
	VirtualNetworkInterface *VirtualNetworkInterfaceReferenceAttachmentContext `json:"virtual_network_interface" validate:"required"`
}

// Constants associated with the BareMetalServerNetworkAttachmentReference.ResourceType property.
// The resource type.
const (
	BareMetalServerNetworkAttachmentReferenceResourceTypeBareMetalServerNetworkAttachmentConst = "bare_metal_server_network_attachment"
)

// UnmarshalBareMetalServerNetworkAttachmentReference unmarshals an instance of BareMetalServerNetworkAttachmentReference from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkAttachmentReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkAttachmentReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalVirtualNetworkInterfaceReferenceAttachmentContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerNetworkInterface : BareMetalServerNetworkInterface struct
// Models which "extend" this model:
// - BareMetalServerNetworkInterfaceByHiperSocket
// - BareMetalServerNetworkInterfaceByPci
// - BareMetalServerNetworkInterfaceByVlan
type BareMetalServerNetworkInterface struct {
	// Indicates whether source IP spoofing is allowed on this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing" validate:"required"`

	// The date and time that the bare metal server network interface was created.
	//
	// If this bare metal server has network attachments, this network interface was created as a [read-only
	// representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) when its corresponding
	// network attachment was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the bare metal server network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - `interface_type` must not be `hipersocket`.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and infrastructure NAT is managed on
	// the attached virtual network interface.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat" validate:"required"`

	// The floating IPs associated with this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the floating IPs are associated
	// with the attached virtual network interface.
	FloatingIps []FloatingIPReference `json:"floating_ips" validate:"required"`

	// The URL for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id" validate:"required"`

	// The interface type:
	// - `hipersocket`: a virtual device that provides high-speed TCP/IP connectivity
	//   within a `s390x` based system
	// - `pci`: a physical PCI device which can only be created or deleted when the bare metal
	//   server is stopped
	//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
	//     to use the PCI interface
	//   - Cannot directly use an IEEE 802.1Q tag.
	// - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
	//   array of `allowed_vlans`.
	//   - Must use an IEEE 802.1Q tag.
	//   - Has its own security groups and does not inherit those of the PCI device through
	//     which traffic flows.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the interface type is that of the
	// corresponding network attachment.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The MAC address of this bare metal server network interface. If the MAC address has not yet been selected, the value
	// will be empty.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the MAC address is that of the
	// attached virtual network interface.
	MacAddress *string `json:"mac_address" validate:"required"`

	// The name for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the name matches its corresponding
	// network attachment.
	Name *string `json:"name" validate:"required"`

	// The bare metal server network interface port speed in Mbps.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the port speed is that of its
	// corresponding network attachment.
	PortSpeed *int64 `json:"port_speed" validate:"required"`

	// The primary IP address of this bare metal server network interface.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The security groups targeting this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the security groups are associated
	// with the attached virtual network interface.
	SecurityGroups []SecurityGroupReference `json:"security_groups" validate:"required"`

	// The status of the bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a read-only representation of its
	// corresponding network attachment and its attached virtual network interface, and the status is [computed from
	// them](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients).
	Status *string `json:"status" validate:"required"`

	// The associated subnet.
	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The bare metal server network interface type.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the type is that of its
	// corresponding network attachment.
	Type *string `json:"type" validate:"required"`

	// The VLAN IDs allowed for `vlan` interfaces using this PCI interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the VLAN IDs match the
	// `allow_vlans` of the corresponding network attachment.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// Indicates if the data path for the network interface can float to another bare metal server. Can only be `true` for
	// network interfaces with an `interface_type` of `vlan`.
	//
	// If `true`, and the network detects traffic for this data path on another bare metal server in the resource group,
	// the network interface will be automatically deleted from this bare metal server and a new network interface with the
	// same `id`, `name` and `vlan` will be created on the other bare metal server.
	//
	// For the data path to float, the other bare metal server must be in the same
	// `resource_group`, and must have a network interface with `interface_type` of `pci` with `allowed_vlans` including
	// this network interface's `vlan`.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the value of this property matches
	// that of the `allow_to_float` property of the corresponding network attachment.
	AllowInterfaceToFloat *bool `json:"allow_interface_to_float,omitempty"`

	// The VLAN ID used in the IEEE 802.1Q tag present in all traffic on this interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the VLAN ID matches the `vlan` of
	// the corresponding network attachment.
	Vlan *int64 `json:"vlan,omitempty"`
}

// Constants associated with the BareMetalServerNetworkInterface.InterfaceType property.
// The interface type:
//   - `hipersocket`: a virtual device that provides high-speed TCP/IP connectivity
//     within a `s390x` based system
//   - `pci`: a physical PCI device which can only be created or deleted when the bare metal
//     server is stopped
//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
//     to use the PCI interface
//   - Cannot directly use an IEEE 802.1Q tag.
//   - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
//     array of `allowed_vlans`.
//   - Must use an IEEE 802.1Q tag.
//   - Has its own security groups and does not inherit those of the PCI device through
//     which traffic flows.
//
// If this bare metal server has network attachments, this network interface is a
// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
// corresponding network attachment and its attached virtual network interface, and the interface type is that of the
// corresponding network attachment.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerNetworkInterfaceInterfaceTypeHipersocketConst = "hipersocket"
	BareMetalServerNetworkInterfaceInterfaceTypePciConst         = "pci"
	BareMetalServerNetworkInterfaceInterfaceTypeVlanConst        = "vlan"
)

// Constants associated with the BareMetalServerNetworkInterface.ResourceType property.
// The resource type.
const (
	BareMetalServerNetworkInterfaceResourceTypeNetworkInterfaceConst = "network_interface"
)

// Constants associated with the BareMetalServerNetworkInterface.Status property.
// The status of the bare metal server network interface.
//
// If this bare metal server has network attachments, this network interface is a read-only representation of its
// corresponding network attachment and its attached virtual network interface, and the status is [computed from
// them](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients).
const (
	BareMetalServerNetworkInterfaceStatusAvailableConst = "available"
	BareMetalServerNetworkInterfaceStatusDeletingConst  = "deleting"
	BareMetalServerNetworkInterfaceStatusFailedConst    = "failed"
	BareMetalServerNetworkInterfaceStatusPendingConst   = "pending"
)

// Constants associated with the BareMetalServerNetworkInterface.Type property.
// The bare metal server network interface type.
//
// If this bare metal server has network attachments, this network interface is a
// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
// corresponding network attachment and its attached virtual network interface, and the type is that of its
// corresponding network attachment.
const (
	BareMetalServerNetworkInterfaceTypePrimaryConst   = "primary"
	BareMetalServerNetworkInterfaceTypeSecondaryConst = "secondary"
)

func (*BareMetalServerNetworkInterface) isaBareMetalServerNetworkInterface() bool {
	return true
}

type BareMetalServerNetworkInterfaceIntf interface {
	isaBareMetalServerNetworkInterface() bool
}

// UnmarshalBareMetalServerNetworkInterface unmarshals an instance of BareMetalServerNetworkInterface from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	// Retrieve discriminator value to determine correct "subclass".
	var discValue string
	err = core.UnmarshalPrimitive(m, "interface_type", &discValue)
	if err != nil {
		errMsg := fmt.Sprintf("error unmarshalling discriminator property 'interface_type': %s", err.Error())
		err = core.SDKErrorf(err, errMsg, "discriminator-unmarshal-error", common.GetComponentInfo())
		return
	}
	if discValue == "" {
		err = core.SDKErrorf(err, "required discriminator property 'interface_type' not found in JSON object", "missing-discriminator", common.GetComponentInfo())
		return
	}
	if discValue == "hipersocket" {
		err = core.UnmarshalModel(m, "", result, UnmarshalBareMetalServerNetworkInterfaceByHiperSocket)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-BareMetalServerNetworkInterfaceByHiperSocket-error", common.GetComponentInfo())
		}
	} else if discValue == "pci" {
		err = core.UnmarshalModel(m, "", result, UnmarshalBareMetalServerNetworkInterfaceByPci)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-BareMetalServerNetworkInterfaceByPci-error", common.GetComponentInfo())
		}
	} else if discValue == "vlan" {
		err = core.UnmarshalModel(m, "", result, UnmarshalBareMetalServerNetworkInterfaceByVlan)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-BareMetalServerNetworkInterfaceByVlan-error", common.GetComponentInfo())
		}
	} else {
		errMsg := fmt.Sprintf("unrecognized value for discriminator property 'interface_type': %s", discValue)
		err = core.SDKErrorf(err, errMsg, "invalid-discriminator", common.GetComponentInfo())
	}
	return
}

// BareMetalServerNetworkInterfaceCollection : BareMetalServerNetworkInterfaceCollection struct
type BareMetalServerNetworkInterfaceCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// The network interfaces for the bare metal server.
	NetworkInterfaces []BareMetalServerNetworkInterfaceIntf `json:"network_interfaces" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBareMetalServerNetworkInterfaceCollection unmarshals an instance of BareMetalServerNetworkInterfaceCollection from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkInterfaceCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkInterfaceCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalBareMetalServerNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *BareMetalServerNetworkInterfaceCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// BareMetalServerNetworkInterfacePatch : BareMetalServerNetworkInterfacePatch struct
type BareMetalServerNetworkInterfacePatch struct {
	// Indicates whether source IP spoofing is allowed on this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// The VLAN IDs to allow for `vlan` interfaces using this PCI interface, replacing any existing VLAN IDs. The specified
	// values must include IDs for all `vlan` interfaces currently using this PCI interface.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the bare metal server network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - `interface_type` must not be `hipersocket`.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and infrastructure NAT is managed on
	// the attached virtual network interface.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The name for this bare metal server network interface. The name must not be used by another network interface on the
	// bare metal server.
	Name *string `json:"name,omitempty"`
}

// UnmarshalBareMetalServerNetworkInterfacePatch unmarshals an instance of BareMetalServerNetworkInterfacePatch from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkInterfacePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerNetworkInterfacePatch)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_vlans", &obj.AllowedVlans)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_vlans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_infrastructure_nat", &obj.EnableInfrastructureNat)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_infrastructure_nat-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the BareMetalServerNetworkInterfacePatch
func (bareMetalServerNetworkInterfacePatch *BareMetalServerNetworkInterfacePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(bareMetalServerNetworkInterfacePatch.AllowIPSpoofing) {
		_patch["allow_ip_spoofing"] = bareMetalServerNetworkInterfacePatch.AllowIPSpoofing
	}
	if !core.IsNil(bareMetalServerNetworkInterfacePatch.AllowedVlans) {
		_patch["allowed_vlans"] = bareMetalServerNetworkInterfacePatch.AllowedVlans
	}
	if !core.IsNil(bareMetalServerNetworkInterfacePatch.EnableInfrastructureNat) {
		_patch["enable_infrastructure_nat"] = bareMetalServerNetworkInterfacePatch.EnableInfrastructureNat
	}
	if !core.IsNil(bareMetalServerNetworkInterfacePatch.Name) {
		_patch["name"] = bareMetalServerNetworkInterfacePatch.Name
	}

	return
}

// BareMetalServerNetworkInterfacePrototype : BareMetalServerNetworkInterfacePrototype struct
// Models which "extend" this model:
// - BareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByHiperSocketPrototype
// - BareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByPciPrototype
// - BareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByVlanPrototype
type BareMetalServerNetworkInterfacePrototype struct {
	// Indicates whether source IP spoofing is allowed on this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the bare metal server network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - `interface_type` must not be `hipersocket`.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and infrastructure NAT is managed on
	// the attached virtual network interface.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The interface type:
	// - `hipersocket`: a virtual device that provides high-speed TCP/IP connectivity
	//   within a `s390x` based system
	//   - Not supported on bare metal servers with a `cpu.architecture` of `amd64`
	// - `pci`: a physical PCI device which can only be created or deleted when the bare metal
	//   server is stopped
	//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
	//     to use the PCI interface
	//   - Cannot directly use an IEEE 802.1Q tag.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`
	// - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
	//   array of `allowed_vlans`.
	//   - Must use an IEEE 802.1Q tag.
	//   - Has its own security groups and does not inherit those of the PCI device through
	//     which traffic flows.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The name for this bare metal server network interface. The name must not be used by another network interface on the
	// bare metal server. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the bare metal server network interface. This can be
	// specified using an existing reserved IP, or a prototype object for a new reserved IP.
	//
	// If an existing reserved IP or a prototype object with an address is specified, it must
	// be available on the bare metal server network interface's subnet. Otherwise, an
	// available address on the subnet will be automatically selected and reserved.
	PrimaryIP NetworkInterfaceIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The security groups to use for this bare metal server network interface. If unspecified, the VPC's default security
	// group is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet.
	Subnet SubnetIdentityIntf `json:"subnet" validate:"required"`

	// The VLAN IDs to allow for `vlan` interfaces using this PCI interface.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// Indicates if the data path for the network interface can float to another bare metal server. Can only be `true` for
	// network interfaces with an `interface_type` of `vlan`.
	//
	// If `true`, and the network detects traffic for this data path on another bare metal server in the resource group,
	// the network interface will be automatically deleted from this bare metal server and a new network interface with the
	// same `id`, `name` and `vlan` will be created on the other bare metal server.
	//
	// For the data path to float, the other bare metal server must be in the same
	// `resource_group`, and must have a network interface with `interface_type` of `pci` with `allowed_vlans` including
	// this network interface's `vlan`.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the value of this property matches
	// that of the `allow_to_float` property of the corresponding network attachment.
	AllowInterfaceToFloat *bool `json:"allow_interface_to_float,omitempty"`

	// The VLAN ID used in the IEEE 802.1Q tag present in all traffic on this interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the VLAN ID matches the `vlan` of
	// the corresponding network attachment.
	Vlan *int64 `json:"vlan,omitempty"`
}

// Constants associated with the BareMetalServerNetworkInterfacePrototype.InterfaceType property.
// The interface type:
//   - `hipersocket`: a virtual device that provides high-speed TCP/IP connectivity
//     within a `s390x` based system
//   - Not supported on bare metal servers with a `cpu.architecture` of `amd64`
//   - `pci`: a physical PCI device which can only be created or deleted when the bare metal
//     server is stopped
//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
//     to use the PCI interface
//   - Cannot directly use an IEEE 802.1Q tag.
//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`
//   - `vlan`: a virtual device, used through a `pci` device that has the `vlan` in its
//     array of `allowed_vlans`.
//   - Must use an IEEE 802.1Q tag.
//   - Has its own security groups and does not inherit those of the PCI device through
//     which traffic flows.
//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
const (
	BareMetalServerNetworkInterfacePrototypeInterfaceTypeHipersocketConst = "hipersocket"
	BareMetalServerNetworkInterfacePrototypeInterfaceTypePciConst         = "pci"
	BareMetalServerNetworkInterfacePrototypeInterfaceTypeVlanConst        = "vlan"
)

func (*BareMetalServerNetworkInterfacePrototype) isaBareMetalServerNetworkInterfacePrototype() bool {
	return true
}

type BareMetalServerNetworkInterfacePrototypeIntf interface {
	isaBareMetalServerNetworkInterfacePrototype() bool
}

// UnmarshalBareMetalServerNetworkInterfacePrototype unmarshals an instance of BareMetalServerNetworkInterfacePrototype from the specified map of raw messages.
func UnmarshalBareMetalServerNetworkInterfacePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	// Retrieve discriminator value to determine correct "subclass".
	var discValue string
	err = core.UnmarshalPrimitive(m, "interface_type", &discValue)
	if err != nil {
		errMsg := fmt.Sprintf("error unmarshalling discriminator property 'interface_type': %s", err.Error())
		err = core.SDKErrorf(err, errMsg, "discriminator-unmarshal-error", common.GetComponentInfo())
		return
	}
	if discValue == "" {
		err = core.SDKErrorf(err, "required discriminator property 'interface_type' not found in JSON object", "missing-discriminator", common.GetComponentInfo())
		return
	}
	if discValue == "hipersocket" {
		err = core.UnmarshalModel(m, "", result, UnmarshalBareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByHiperSocketPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-BareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByHiperSocketPrototype-error", common.GetComponentInfo())
		}
	} else if discValue == "pci" {
		err = core.UnmarshalModel(m, "", result, UnmarshalBareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByPciPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-BareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByPciPrototype-error", common.GetComponentInfo())
		}
	} else if discValue == "vlan" {
		err = core.UnmarshalModel(m, "", result, UnmarshalBareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByVlanPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-BareMetalServerNetworkInterfacePrototypeBareMetalServerNetworkInterfaceByVlanPrototype-error", common.GetComponentInfo())
		}
	} else {
		errMsg := fmt.Sprintf("unrecognized value for discriminator property 'interface_type': %s", discValue)
		err = core.SDKErrorf(err, errMsg, "invalid-discriminator", common.GetComponentInfo())
	}
	return
}

// BareMetalServerPatch : BareMetalServerPatch struct
type BareMetalServerPatch struct {
	// The total bandwidth (in megabits per second) shared across the bare metal server's network interfaces. The specified
	// value must match one of the bandwidth values in the bare metal server's profile.
	Bandwidth *int64 `json:"bandwidth,omitempty"`

	// Indicates whether secure boot is enabled. If enabled, the image must support secure boot or the bare metal server
	// will fail to boot.
	//
	// For `enable_secure_boot` to be changed, the bare metal server `status` must be
	// `stopped`.
	EnableSecureBoot *bool `json:"enable_secure_boot,omitempty"`

	// The name for this bare metal server. The name must not be used by another bare metal server in the region. Changing
	// the name will not affect the system hostname.
	Name *string `json:"name,omitempty"`

	ReservationAffinity *BareMetalServerReservationAffinityPatch `json:"reservation_affinity,omitempty"`

	TrustedPlatformModule *BareMetalServerTrustedPlatformModulePatch `json:"trusted_platform_module,omitempty"`
}

// UnmarshalBareMetalServerPatch unmarshals an instance of BareMetalServerPatch from the specified map of raw messages.
func UnmarshalBareMetalServerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerPatch)
	err = core.UnmarshalPrimitive(m, "bandwidth", &obj.Bandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalBareMetalServerReservationAffinityPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "trusted_platform_module", &obj.TrustedPlatformModule, UnmarshalBareMetalServerTrustedPlatformModulePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "trusted_platform_module-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the BareMetalServerPatch
func (bareMetalServerPatch *BareMetalServerPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(bareMetalServerPatch.Bandwidth) {
		_patch["bandwidth"] = bareMetalServerPatch.Bandwidth
	}
	if !core.IsNil(bareMetalServerPatch.EnableSecureBoot) {
		_patch["enable_secure_boot"] = bareMetalServerPatch.EnableSecureBoot
	}
	if !core.IsNil(bareMetalServerPatch.Name) {
		_patch["name"] = bareMetalServerPatch.Name
	}
	if !core.IsNil(bareMetalServerPatch.ReservationAffinity) {
		_patch["reservation_affinity"] = bareMetalServerPatch.ReservationAffinity.asPatch()
	}
	if !core.IsNil(bareMetalServerPatch.TrustedPlatformModule) {
		_patch["trusted_platform_module"] = bareMetalServerPatch.TrustedPlatformModule.asPatch()
	}

	return
}

// BareMetalServerPrimaryNetworkAttachmentPrototype : BareMetalServerPrimaryNetworkAttachmentPrototype struct
// Models which "extend" this model:
// - BareMetalServerPrimaryNetworkAttachmentPrototypeBareMetalServerPrimaryNetworkAttachmentByPciPrototype
type BareMetalServerPrimaryNetworkAttachmentPrototype struct {
	// The network attachment's interface type:
	// - `pci`: a physical PCI device which can only be created or deleted when the bare metal
	//   server is stopped
	//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
	//     to use the PCI attachment
	//   - Cannot directly use an IEEE 802.1Q tag.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
	InterfaceType *string `json:"interface_type,omitempty"`

	// The name for this bare metal server network attachment. Names must be unique within the bare metal server the
	// network attachment resides in. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// A virtual network interface for the bare metal server network attachment. This can be
	// specified using an existing virtual network interface, or a prototype object for a new
	// virtual network interface.
	//
	// If an existing virtual network interface is specified, it must not be the target of a flow
	// log collector.
	VirtualNetworkInterface BareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf `json:"virtual_network_interface" validate:"required"`

	// The VLAN IDs to allow for `vlan` attachments using this PCI attachment.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`
}

// Constants associated with the BareMetalServerPrimaryNetworkAttachmentPrototype.InterfaceType property.
// The network attachment's interface type:
//   - `pci`: a physical PCI device which can only be created or deleted when the bare metal
//     server is stopped
//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
//     to use the PCI attachment
//   - Cannot directly use an IEEE 802.1Q tag.
//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
const (
	BareMetalServerPrimaryNetworkAttachmentPrototypeInterfaceTypePciConst = "pci"
)

func (*BareMetalServerPrimaryNetworkAttachmentPrototype) isaBareMetalServerPrimaryNetworkAttachmentPrototype() bool {
	return true
}

type BareMetalServerPrimaryNetworkAttachmentPrototypeIntf interface {
	isaBareMetalServerPrimaryNetworkAttachmentPrototype() bool
}

// UnmarshalBareMetalServerPrimaryNetworkAttachmentPrototype unmarshals an instance of BareMetalServerPrimaryNetworkAttachmentPrototype from the specified map of raw messages.
func UnmarshalBareMetalServerPrimaryNetworkAttachmentPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerPrimaryNetworkAttachmentPrototype)
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalBareMetalServerNetworkAttachmentPrototypeVirtualNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_vlans", &obj.AllowedVlans)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_vlans-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerPrimaryNetworkInterfacePrototype : BareMetalServerPrimaryNetworkInterfacePrototype struct
type BareMetalServerPrimaryNetworkInterfacePrototype struct {
	// Indicates whether source IP spoofing is allowed on this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// The VLAN IDs allowed for `vlan` interfaces using this PCI interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the VLAN IDs match the
	// `allow_vlans` of the corresponding network attachment.
	AllowedVlans []int64 `json:"allowed_vlans,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the bare metal server network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - `interface_type` must not be `hipersocket`.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and infrastructure NAT is managed on
	// the attached virtual network interface.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The interface type:
	// - `hipersocket`: a virtual device that provides high-speed TCP/IP connectivity
	//   within a `s390x` based system.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `amd64`
	// - `pci`: a physical PCI device which can only be created or deleted when the bare metal
	//   server is stopped
	//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
	//     to use the PCI interface
	//   - Cannot directly use an IEEE 802.1Q tag.
	//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
	InterfaceType *string `json:"interface_type,omitempty"`

	// The name for this bare metal server network interface. The name must not be used by another network interface on the
	// bare metal server. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the bare metal server network interface. This can be
	// specified using an existing reserved IP, or a prototype object for a new reserved IP.
	//
	// If an existing reserved IP or a prototype object with an address is specified, it must
	// be available on the bare metal server network interface's subnet. Otherwise, an
	// available address on the subnet will be automatically selected and reserved.
	PrimaryIP NetworkInterfaceIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The security groups to use for this bare metal server network interface. If unspecified, the VPC's default security
	// group is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet.
	Subnet SubnetIdentityIntf `json:"subnet" validate:"required"`
}

// Constants associated with the BareMetalServerPrimaryNetworkInterfacePrototype.InterfaceType property.
// The interface type:
//   - `hipersocket`: a virtual device that provides high-speed TCP/IP connectivity
//     within a `s390x` based system.
//   - Not supported on bare metal servers with a `cpu.architecture` of `amd64`
//   - `pci`: a physical PCI device which can only be created or deleted when the bare metal
//     server is stopped
//   - Has an `allowed_vlans` property which controls the VLANs that will be permitted
//     to use the PCI interface
//   - Cannot directly use an IEEE 802.1Q tag.
//   - Not supported on bare metal servers with a `cpu.architecture` of `s390x`.
const (
	BareMetalServerPrimaryNetworkInterfacePrototypeInterfaceTypeHipersocketConst = "hipersocket"
	BareMetalServerPrimaryNetworkInterfacePrototypeInterfaceTypePciConst         = "pci"
)

// NewBareMetalServerPrimaryNetworkInterfacePrototype : Instantiate BareMetalServerPrimaryNetworkInterfacePrototype (Generic Model Constructor)
func (*VpcV1) NewBareMetalServerPrimaryNetworkInterfacePrototype(subnet SubnetIdentityIntf) (_model *BareMetalServerPrimaryNetworkInterfacePrototype, err error) {
	_model = &BareMetalServerPrimaryNetworkInterfacePrototype{
		Subnet: subnet,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalBareMetalServerPrimaryNetworkInterfacePrototype unmarshals an instance of BareMetalServerPrimaryNetworkInterfacePrototype from the specified map of raw messages.
func UnmarshalBareMetalServerPrimaryNetworkInterfacePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerPrimaryNetworkInterfacePrototype)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_vlans", &obj.AllowedVlans)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_vlans-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_infrastructure_nat", &obj.EnableInfrastructureNat)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_infrastructure_nat-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalNetworkInterfaceIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfile : BareMetalServerProfile struct
type BareMetalServerProfile struct {
	Bandwidth BareMetalServerProfileBandwidthIntf `json:"bandwidth" validate:"required"`

	// The console type configuration for a bare metal server with this profile.
	ConsoleTypes *BareMetalServerProfileConsoleTypes `json:"console_types" validate:"required"`

	CpuArchitecture *BareMetalServerProfileCpuArchitecture `json:"cpu_architecture" validate:"required"`

	CpuCoreCount BareMetalServerProfileCpuCoreCountIntf `json:"cpu_core_count" validate:"required"`

	CpuSocketCount BareMetalServerProfileCpuSocketCountIntf `json:"cpu_socket_count" validate:"required"`

	// The disks for a bare metal server with this profile.
	Disks []BareMetalServerProfileDisk `json:"disks" validate:"required"`

	// The product family this bare metal server profile belongs to.
	Family *string `json:"family" validate:"required"`

	// The URL for this bare metal server profile.
	Href *string `json:"href" validate:"required"`

	Memory BareMetalServerProfileMemoryIntf `json:"memory" validate:"required"`

	// The name for this bare metal server profile.
	Name *string `json:"name" validate:"required"`

	NetworkAttachmentCount BareMetalServerProfileNetworkAttachmentCountIntf `json:"network_attachment_count" validate:"required"`

	NetworkInterfaceCount BareMetalServerProfileNetworkInterfaceCountIntf `json:"network_interface_count" validate:"required"`

	OsArchitecture *BareMetalServerProfileOsArchitecture `json:"os_architecture" validate:"required"`

	ReservationTerms *BareMetalServerProfileReservationTerms `json:"reservation_terms" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The supported trusted platform module modes for this bare metal server profile.
	SupportedTrustedPlatformModuleModes *BareMetalServerProfileSupportedTrustedPlatformModuleModes `json:"supported_trusted_platform_module_modes" validate:"required"`

	// Indicates whether this profile supports virtual network interfaces.
	VirtualNetworkInterfacesSupported *BareMetalServerProfileVirtualNetworkInterfacesSupported `json:"virtual_network_interfaces_supported" validate:"required"`
}

// Constants associated with the BareMetalServerProfile.ResourceType property.
// The resource type.
const (
	BareMetalServerProfileResourceTypeBareMetalServerProfileConst = "bare_metal_server_profile"
)

// UnmarshalBareMetalServerProfile unmarshals an instance of BareMetalServerProfile from the specified map of raw messages.
func UnmarshalBareMetalServerProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfile)
	err = core.UnmarshalModel(m, "bandwidth", &obj.Bandwidth, UnmarshalBareMetalServerProfileBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "console_types", &obj.ConsoleTypes, UnmarshalBareMetalServerProfileConsoleTypes)
	if err != nil {
		err = core.SDKErrorf(err, "", "console_types-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cpu_architecture", &obj.CpuArchitecture, UnmarshalBareMetalServerProfileCpuArchitecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "cpu_architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cpu_core_count", &obj.CpuCoreCount, UnmarshalBareMetalServerProfileCpuCoreCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "cpu_core_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cpu_socket_count", &obj.CpuSocketCount, UnmarshalBareMetalServerProfileCpuSocketCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "cpu_socket_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalBareMetalServerProfileDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "memory", &obj.Memory, UnmarshalBareMetalServerProfileMemory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachment_count", &obj.NetworkAttachmentCount, UnmarshalBareMetalServerProfileNetworkAttachmentCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachment_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interface_count", &obj.NetworkInterfaceCount, UnmarshalBareMetalServerProfileNetworkInterfaceCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interface_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "os_architecture", &obj.OsArchitecture, UnmarshalBareMetalServerProfileOsArchitecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "os_architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_terms", &obj.ReservationTerms, UnmarshalBareMetalServerProfileReservationTerms)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_terms-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_trusted_platform_module_modes", &obj.SupportedTrustedPlatformModuleModes, UnmarshalBareMetalServerProfileSupportedTrustedPlatformModuleModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_trusted_platform_module_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interfaces_supported", &obj.VirtualNetworkInterfacesSupported, UnmarshalBareMetalServerProfileVirtualNetworkInterfacesSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interfaces_supported-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileBandwidth : BareMetalServerProfileBandwidth struct
// Models which "extend" this model:
// - BareMetalServerProfileBandwidthFixed
// - BareMetalServerProfileBandwidthRange
// - BareMetalServerProfileBandwidthEnum
// - BareMetalServerProfileBandwidthDependent
type BareMetalServerProfileBandwidth struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the BareMetalServerProfileBandwidth.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileBandwidthTypeFixedConst = "fixed"
)

func (*BareMetalServerProfileBandwidth) isaBareMetalServerProfileBandwidth() bool {
	return true
}

type BareMetalServerProfileBandwidthIntf interface {
	isaBareMetalServerProfileBandwidth() bool
}

// UnmarshalBareMetalServerProfileBandwidth unmarshals an instance of BareMetalServerProfileBandwidth from the specified map of raw messages.
func UnmarshalBareMetalServerProfileBandwidth(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileBandwidth)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileCpuArchitecture : BareMetalServerProfileCpuArchitecture struct
type BareMetalServerProfileCpuArchitecture struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The CPU architecture for a bare metal server with this profile.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the BareMetalServerProfileCpuArchitecture.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileCpuArchitectureTypeFixedConst = "fixed"
)

// Constants associated with the BareMetalServerProfileCpuArchitecture.Value property.
// The CPU architecture for a bare metal server with this profile.
const (
	BareMetalServerProfileCpuArchitectureValueAmd64Const = "amd64"
	BareMetalServerProfileCpuArchitectureValueS390xConst = "s390x"
)

// UnmarshalBareMetalServerProfileCpuArchitecture unmarshals an instance of BareMetalServerProfileCpuArchitecture from the specified map of raw messages.
func UnmarshalBareMetalServerProfileCpuArchitecture(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileCpuArchitecture)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileCpuCoreCount : BareMetalServerProfileCpuCoreCount struct
// Models which "extend" this model:
// - BareMetalServerProfileCpuCoreCountFixed
// - BareMetalServerProfileCpuCoreCountRange
// - BareMetalServerProfileCpuCoreCountEnum
// - BareMetalServerProfileCpuCoreCountDependent
type BareMetalServerProfileCpuCoreCount struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the BareMetalServerProfileCpuCoreCount.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileCpuCoreCountTypeFixedConst = "fixed"
)

func (*BareMetalServerProfileCpuCoreCount) isaBareMetalServerProfileCpuCoreCount() bool {
	return true
}

type BareMetalServerProfileCpuCoreCountIntf interface {
	isaBareMetalServerProfileCpuCoreCount() bool
}

// UnmarshalBareMetalServerProfileCpuCoreCount unmarshals an instance of BareMetalServerProfileCpuCoreCount from the specified map of raw messages.
func UnmarshalBareMetalServerProfileCpuCoreCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileCpuCoreCount)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileCpuSocketCount : BareMetalServerProfileCpuSocketCount struct
// Models which "extend" this model:
// - BareMetalServerProfileCpuSocketCountFixed
// - BareMetalServerProfileCpuSocketCountRange
// - BareMetalServerProfileCpuSocketCountEnum
// - BareMetalServerProfileCpuSocketCountDependent
type BareMetalServerProfileCpuSocketCount struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the BareMetalServerProfileCpuSocketCount.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileCpuSocketCountTypeFixedConst = "fixed"
)

func (*BareMetalServerProfileCpuSocketCount) isaBareMetalServerProfileCpuSocketCount() bool {
	return true
}

type BareMetalServerProfileCpuSocketCountIntf interface {
	isaBareMetalServerProfileCpuSocketCount() bool
}

// UnmarshalBareMetalServerProfileCpuSocketCount unmarshals an instance of BareMetalServerProfileCpuSocketCount from the specified map of raw messages.
func UnmarshalBareMetalServerProfileCpuSocketCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileCpuSocketCount)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileCollection : BareMetalServerProfileCollection struct
type BareMetalServerProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of bare metal server profiles.
	Profiles []BareMetalServerProfile `json:"profiles" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalBareMetalServerProfileCollection unmarshals an instance of BareMetalServerProfileCollection from the specified map of raw messages.
func UnmarshalBareMetalServerProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profiles", &obj.Profiles, UnmarshalBareMetalServerProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *BareMetalServerProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// BareMetalServerProfileConsoleTypes : The console type configuration for a bare metal server with this profile.
type BareMetalServerProfileConsoleTypes struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The console types for a bare metal server with this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the BareMetalServerProfileConsoleTypes.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileConsoleTypesTypeEnumConst = "enum"
)

// Constants associated with the BareMetalServerProfileConsoleTypes.Values property.
// A console type.
const (
	BareMetalServerProfileConsoleTypesValuesSerialConst = "serial"
	BareMetalServerProfileConsoleTypesValuesVncConst    = "vnc"
)

// UnmarshalBareMetalServerProfileConsoleTypes unmarshals an instance of BareMetalServerProfileConsoleTypes from the specified map of raw messages.
func UnmarshalBareMetalServerProfileConsoleTypes(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileConsoleTypes)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileDisk : Disks provided by this profile.
type BareMetalServerProfileDisk struct {
	Quantity BareMetalServerProfileDiskQuantityIntf `json:"quantity" validate:"required"`

	Size BareMetalServerProfileDiskSizeIntf `json:"size" validate:"required"`

	SupportedInterfaceTypes *BareMetalServerProfileDiskSupportedInterfaces `json:"supported_interface_types" validate:"required"`
}

// UnmarshalBareMetalServerProfileDisk unmarshals an instance of BareMetalServerProfileDisk from the specified map of raw messages.
func UnmarshalBareMetalServerProfileDisk(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileDisk)
	err = core.UnmarshalModel(m, "quantity", &obj.Quantity, UnmarshalBareMetalServerProfileDiskQuantity)
	if err != nil {
		err = core.SDKErrorf(err, "", "quantity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "size", &obj.Size, UnmarshalBareMetalServerProfileDiskSize)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_interface_types", &obj.SupportedInterfaceTypes, UnmarshalBareMetalServerProfileDiskSupportedInterfaces)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_interface_types-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileDiskQuantity : BareMetalServerProfileDiskQuantity struct
// Models which "extend" this model:
// - BareMetalServerProfileDiskQuantityFixed
// - BareMetalServerProfileDiskQuantityRange
// - BareMetalServerProfileDiskQuantityEnum
// - BareMetalServerProfileDiskQuantityDependent
type BareMetalServerProfileDiskQuantity struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the BareMetalServerProfileDiskQuantity.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileDiskQuantityTypeFixedConst = "fixed"
)

func (*BareMetalServerProfileDiskQuantity) isaBareMetalServerProfileDiskQuantity() bool {
	return true
}

type BareMetalServerProfileDiskQuantityIntf interface {
	isaBareMetalServerProfileDiskQuantity() bool
}

// UnmarshalBareMetalServerProfileDiskQuantity unmarshals an instance of BareMetalServerProfileDiskQuantity from the specified map of raw messages.
func UnmarshalBareMetalServerProfileDiskQuantity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileDiskQuantity)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileDiskSize : BareMetalServerProfileDiskSize struct
// Models which "extend" this model:
// - BareMetalServerProfileDiskSizeFixed
// - BareMetalServerProfileDiskSizeRange
// - BareMetalServerProfileDiskSizeEnum
// - BareMetalServerProfileDiskSizeDependent
type BareMetalServerProfileDiskSize struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the BareMetalServerProfileDiskSize.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileDiskSizeTypeFixedConst = "fixed"
)

func (*BareMetalServerProfileDiskSize) isaBareMetalServerProfileDiskSize() bool {
	return true
}

type BareMetalServerProfileDiskSizeIntf interface {
	isaBareMetalServerProfileDiskSize() bool
}

// UnmarshalBareMetalServerProfileDiskSize unmarshals an instance of BareMetalServerProfileDiskSize from the specified map of raw messages.
func UnmarshalBareMetalServerProfileDiskSize(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileDiskSize)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileDiskSupportedInterfaces : BareMetalServerProfileDiskSupportedInterfaces struct
type BareMetalServerProfileDiskSupportedInterfaces struct {
	// The default value for this profile field.
	Default *string `json:"default" validate:"required"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported disk interfaces used for attaching the disk.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the BareMetalServerProfileDiskSupportedInterfaces.Default property.
// The default value for this profile field.
const (
	BareMetalServerProfileDiskSupportedInterfacesDefaultFcpConst  = "fcp"
	BareMetalServerProfileDiskSupportedInterfacesDefaultNvmeConst = "nvme"
	BareMetalServerProfileDiskSupportedInterfacesDefaultSataConst = "sata"
)

// Constants associated with the BareMetalServerProfileDiskSupportedInterfaces.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileDiskSupportedInterfacesTypeEnumConst = "enum"
)

// Constants associated with the BareMetalServerProfileDiskSupportedInterfaces.Values property.
// The disk attachment interface used:
// - `fcp`: Fiber Channel Protocol
// - `sata`: Serial Advanced Technology Attachment
// - `nvme`: Non-Volatile Memory Express
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerProfileDiskSupportedInterfacesValuesFcpConst  = "fcp"
	BareMetalServerProfileDiskSupportedInterfacesValuesNvmeConst = "nvme"
	BareMetalServerProfileDiskSupportedInterfacesValuesSataConst = "sata"
)

// UnmarshalBareMetalServerProfileDiskSupportedInterfaces unmarshals an instance of BareMetalServerProfileDiskSupportedInterfaces from the specified map of raw messages.
func UnmarshalBareMetalServerProfileDiskSupportedInterfaces(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileDiskSupportedInterfaces)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileIdentity : Identifies a bare metal server profile by a unique property.
// Models which "extend" this model:
// - BareMetalServerProfileIdentityByName
// - BareMetalServerProfileIdentityByHref
type BareMetalServerProfileIdentity struct {
	// The name for this bare metal server profile.
	Name *string `json:"name,omitempty"`

	// The URL for this bare metal server profile.
	Href *string `json:"href,omitempty"`
}

func (*BareMetalServerProfileIdentity) isaBareMetalServerProfileIdentity() bool {
	return true
}

type BareMetalServerProfileIdentityIntf interface {
	isaBareMetalServerProfileIdentity() bool
}

// UnmarshalBareMetalServerProfileIdentity unmarshals an instance of BareMetalServerProfileIdentity from the specified map of raw messages.
func UnmarshalBareMetalServerProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileMemory : BareMetalServerProfileMemory struct
// Models which "extend" this model:
// - BareMetalServerProfileMemoryFixed
// - BareMetalServerProfileMemoryRange
// - BareMetalServerProfileMemoryEnum
// - BareMetalServerProfileMemoryDependent
type BareMetalServerProfileMemory struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the BareMetalServerProfileMemory.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileMemoryTypeFixedConst = "fixed"
)

func (*BareMetalServerProfileMemory) isaBareMetalServerProfileMemory() bool {
	return true
}

type BareMetalServerProfileMemoryIntf interface {
	isaBareMetalServerProfileMemory() bool
}

// UnmarshalBareMetalServerProfileMemory unmarshals an instance of BareMetalServerProfileMemory from the specified map of raw messages.
func UnmarshalBareMetalServerProfileMemory(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileMemory)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileNetworkAttachmentCount : BareMetalServerProfileNetworkAttachmentCount struct
// Models which "extend" this model:
// - BareMetalServerProfileNetworkAttachmentCountRange
// - BareMetalServerProfileNetworkAttachmentCountDependent
type BareMetalServerProfileNetworkAttachmentCount struct {
	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The type for this profile field.
	Type *string `json:"type,omitempty"`
}

// Constants associated with the BareMetalServerProfileNetworkAttachmentCount.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileNetworkAttachmentCountTypeRangeConst = "range"
)

func (*BareMetalServerProfileNetworkAttachmentCount) isaBareMetalServerProfileNetworkAttachmentCount() bool {
	return true
}

type BareMetalServerProfileNetworkAttachmentCountIntf interface {
	isaBareMetalServerProfileNetworkAttachmentCount() bool
}

// UnmarshalBareMetalServerProfileNetworkAttachmentCount unmarshals an instance of BareMetalServerProfileNetworkAttachmentCount from the specified map of raw messages.
func UnmarshalBareMetalServerProfileNetworkAttachmentCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileNetworkAttachmentCount)
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileNetworkInterfaceCount : BareMetalServerProfileNetworkInterfaceCount struct
// Models which "extend" this model:
// - BareMetalServerProfileNetworkInterfaceCountRange
// - BareMetalServerProfileNetworkInterfaceCountDependent
type BareMetalServerProfileNetworkInterfaceCount struct {
	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The type for this profile field.
	Type *string `json:"type,omitempty"`
}

// Constants associated with the BareMetalServerProfileNetworkInterfaceCount.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileNetworkInterfaceCountTypeRangeConst = "range"
)

func (*BareMetalServerProfileNetworkInterfaceCount) isaBareMetalServerProfileNetworkInterfaceCount() bool {
	return true
}

type BareMetalServerProfileNetworkInterfaceCountIntf interface {
	isaBareMetalServerProfileNetworkInterfaceCount() bool
}

// UnmarshalBareMetalServerProfileNetworkInterfaceCount unmarshals an instance of BareMetalServerProfileNetworkInterfaceCount from the specified map of raw messages.
func UnmarshalBareMetalServerProfileNetworkInterfaceCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileNetworkInterfaceCount)
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileOsArchitecture : BareMetalServerProfileOsArchitecture struct
type BareMetalServerProfileOsArchitecture struct {
	// The default OS architecture for a bare metal server with this profile.
	Default *string `json:"default" validate:"required"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported OS architecture(s) for a bare metal server with this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the BareMetalServerProfileOsArchitecture.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileOsArchitectureTypeEnumConst = "enum"
)

// UnmarshalBareMetalServerProfileOsArchitecture unmarshals an instance of BareMetalServerProfileOsArchitecture from the specified map of raw messages.
func UnmarshalBareMetalServerProfileOsArchitecture(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileOsArchitecture)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileReference : BareMetalServerProfileReference struct
type BareMetalServerProfileReference struct {
	// The URL for this bare metal server profile.
	Href *string `json:"href" validate:"required"`

	// The name for this bare metal server profile.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the BareMetalServerProfileReference.ResourceType property.
// The resource type.
const (
	BareMetalServerProfileReferenceResourceTypeBareMetalServerProfileConst = "bare_metal_server_profile"
)

// UnmarshalBareMetalServerProfileReference unmarshals an instance of BareMetalServerProfileReference from the specified map of raw messages.
func UnmarshalBareMetalServerProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileReservationTerms : BareMetalServerProfileReservationTerms struct
type BareMetalServerProfileReservationTerms struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported committed use terms for a reservation using this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the BareMetalServerProfileReservationTerms.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileReservationTermsTypeEnumConst = "enum"
)

// Constants associated with the BareMetalServerProfileReservationTerms.Values property.
const (
	BareMetalServerProfileReservationTermsValuesOneYearConst   = "one_year"
	BareMetalServerProfileReservationTermsValuesThreeYearConst = "three_year"
)

// UnmarshalBareMetalServerProfileReservationTerms unmarshals an instance of BareMetalServerProfileReservationTerms from the specified map of raw messages.
func UnmarshalBareMetalServerProfileReservationTerms(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileReservationTerms)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileSupportedTrustedPlatformModuleModes : The supported trusted platform module modes for this bare metal server profile.
type BareMetalServerProfileSupportedTrustedPlatformModuleModes struct {
	// The default trusted platform module for a bare metal server with this profile.
	Default *string `json:"default,omitempty"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported trusted platform module modes.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the BareMetalServerProfileSupportedTrustedPlatformModuleModes.Default property.
// The default trusted platform module for a bare metal server with this profile.
const (
	BareMetalServerProfileSupportedTrustedPlatformModuleModesDefaultDisabledConst = "disabled"
	BareMetalServerProfileSupportedTrustedPlatformModuleModesDefaultTpm2Const     = "tpm_2"
)

// Constants associated with the BareMetalServerProfileSupportedTrustedPlatformModuleModes.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileSupportedTrustedPlatformModuleModesTypeEnumConst = "enum"
)

// Constants associated with the BareMetalServerProfileSupportedTrustedPlatformModuleModes.Values property.
// The trusted platform module (TPM) mode:
// - `disabled`: No TPM functionality
// - `tpm_2`: TPM 2.0
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerProfileSupportedTrustedPlatformModuleModesValuesDisabledConst = "disabled"
	BareMetalServerProfileSupportedTrustedPlatformModuleModesValuesTpm2Const     = "tpm_2"
)

// UnmarshalBareMetalServerProfileSupportedTrustedPlatformModuleModes unmarshals an instance of BareMetalServerProfileSupportedTrustedPlatformModuleModes from the specified map of raw messages.
func UnmarshalBareMetalServerProfileSupportedTrustedPlatformModuleModes(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileSupportedTrustedPlatformModuleModes)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerProfileVirtualNetworkInterfacesSupported : Indicates whether this profile supports virtual network interfaces.
type BareMetalServerProfileVirtualNetworkInterfacesSupported struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The value for this profile field.
	Value *bool `json:"value" validate:"required"`
}

// Constants associated with the BareMetalServerProfileVirtualNetworkInterfacesSupported.Type property.
// The type for this profile field.
const (
	BareMetalServerProfileVirtualNetworkInterfacesSupportedTypeFixedConst = "fixed"
)

// UnmarshalBareMetalServerProfileVirtualNetworkInterfacesSupported unmarshals an instance of BareMetalServerProfileVirtualNetworkInterfacesSupported from the specified map of raw messages.
func UnmarshalBareMetalServerProfileVirtualNetworkInterfacesSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerProfileVirtualNetworkInterfacesSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerPrototype : BareMetalServerPrototype struct
// Models which "extend" this model:
// - BareMetalServerPrototypeBareMetalServerByNetworkAttachment
// - BareMetalServerPrototypeBareMetalServerByNetworkInterface
type BareMetalServerPrototype struct {
	// The total bandwidth (in megabits per second) shared across the bare metal server's network interfaces. The specified
	// value must match one of the bandwidth values in the bare metal server's profile. If unspecified, the default value
	// from the profile will be used.
	Bandwidth *int64 `json:"bandwidth,omitempty"`

	// Indicates whether secure boot is enabled. If enabled, the image must support secure boot or the server will fail to
	// boot.
	EnableSecureBoot *bool `json:"enable_secure_boot,omitempty"`

	Initialization *BareMetalServerInitializationPrototype `json:"initialization" validate:"required"`

	// The name for this bare metal server. The name must not be used by another bare metal server in the region. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	//
	// The system hostname will be based on this name.
	Name *string `json:"name,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile)
	// to use for this bare metal server.
	Profile BareMetalServerProfileIdentityIntf `json:"profile" validate:"required"`

	ReservationAffinity *BareMetalServerReservationAffinityPrototype `json:"reservation_affinity,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	TrustedPlatformModule *BareMetalServerTrustedPlatformModulePrototype `json:"trusted_platform_module,omitempty"`

	// The VPC this bare metal server will reside in.
	//
	// If specified, it must match the VPC for the subnets that the network attachments or
	// network interfaces of the bare metal server are attached to.
	VPC VPCIdentityIntf `json:"vpc,omitempty"`

	// The zone this bare metal server will reside in.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// The additional network attachments to create for the bare metal server.
	NetworkAttachments []BareMetalServerNetworkAttachmentPrototypeIntf `json:"network_attachments,omitempty"`

	// The primary network attachment to create for the bare metal server.
	PrimaryNetworkAttachment BareMetalServerPrimaryNetworkAttachmentPrototypeIntf `json:"primary_network_attachment,omitempty"`

	// The additional bare metal server network interfaces to create.
	NetworkInterfaces []BareMetalServerNetworkInterfacePrototypeIntf `json:"network_interfaces,omitempty"`

	// The primary bare metal server network interface to create.
	PrimaryNetworkInterface *BareMetalServerPrimaryNetworkInterfacePrototype `json:"primary_network_interface,omitempty"`
}

func (*BareMetalServerPrototype) isaBareMetalServerPrototype() bool {
	return true
}

type BareMetalServerPrototypeIntf interface {
	isaBareMetalServerPrototype() bool
}

// UnmarshalBareMetalServerPrototype unmarshals an instance of BareMetalServerPrototype from the specified map of raw messages.
func UnmarshalBareMetalServerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerPrototype)
	err = core.UnmarshalPrimitive(m, "bandwidth", &obj.Bandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "initialization", &obj.Initialization, UnmarshalBareMetalServerInitializationPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "initialization-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalBareMetalServerProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalBareMetalServerReservationAffinityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "trusted_platform_module", &obj.TrustedPlatformModule, UnmarshalBareMetalServerTrustedPlatformModulePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "trusted_platform_module-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalBareMetalServerNetworkAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_attachment", &obj.PrimaryNetworkAttachment, UnmarshalBareMetalServerPrimaryNetworkAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalBareMetalServerNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_interface", &obj.PrimaryNetworkInterface, UnmarshalBareMetalServerPrimaryNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_interface-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerReservationAffinity : BareMetalServerReservationAffinity struct
type BareMetalServerReservationAffinity struct {
	// The reservation affinity policy to use for this bare metal server:
	// - `disabled`: Reservations will not be used
	// - `manual`: Reservations in `pool` are available for use
	// - `automatic`: Any reservations with an `affinity_policy` of `automatic`
	//   that have the same `profile` and `zone` as this bare metal server
	//   are available for use.
	Policy *string `json:"policy" validate:"required"`

	// The pool of reservations available for use by this bare metal server when the `policy` is `manual`. This must be
	// empty if the `policy` is `automatic` or
	// `disabled`.
	Pool []ReservationReference `json:"pool" validate:"required"`
}

// Constants associated with the BareMetalServerReservationAffinity.Policy property.
// The reservation affinity policy to use for this bare metal server:
//   - `disabled`: Reservations will not be used
//   - `manual`: Reservations in `pool` are available for use
//   - `automatic`: Any reservations with an `affinity_policy` of `automatic`
//     that have the same `profile` and `zone` as this bare metal server
//     are available for use.
const (
	BareMetalServerReservationAffinityPolicyAutomaticConst = "automatic"
	BareMetalServerReservationAffinityPolicyDisabledConst  = "disabled"
	BareMetalServerReservationAffinityPolicyManualConst    = "manual"
)

// UnmarshalBareMetalServerReservationAffinity unmarshals an instance of BareMetalServerReservationAffinity from the specified map of raw messages.
func UnmarshalBareMetalServerReservationAffinity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerReservationAffinity)
	err = core.UnmarshalPrimitive(m, "policy", &obj.Policy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool", &obj.Pool, UnmarshalReservationReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerReservationAffinityPatch : BareMetalServerReservationAffinityPatch struct
type BareMetalServerReservationAffinityPatch struct {
	// The reservation affinity policy to use for this bare metal server:
	// - `disabled`: Reservations will not be used
	// - `manual`: Reservations in `pool` will be available for use
	// - `automatic`: Any reservations with an `affinity_policy` of `automatic` that have the
	//   same `profile` and `zone` as this bare metal server are available for use.
	Policy *string `json:"policy,omitempty"`

	// The pool of reservations available for use by this bare metal server, replacing the existing pool of reservations.
	//
	// Specified reservations must have a `status` of `active`, and have the same
	// `profile` and `zone` as this bare metal server.
	//
	// If `policy` is `manual`, `pool` must have one reservation. If `policy` is `disabled` or `automatic`, `pool` must be
	// empty. If `policy` is `manual`, the `pool` must contain a reservation with available capacity.
	Pool []ReservationIdentityIntf `json:"pool,omitempty"`
}

// Constants associated with the BareMetalServerReservationAffinityPatch.Policy property.
// The reservation affinity policy to use for this bare metal server:
//   - `disabled`: Reservations will not be used
//   - `manual`: Reservations in `pool` will be available for use
//   - `automatic`: Any reservations with an `affinity_policy` of `automatic` that have the
//     same `profile` and `zone` as this bare metal server are available for use.
const (
	BareMetalServerReservationAffinityPatchPolicyAutomaticConst = "automatic"
	BareMetalServerReservationAffinityPatchPolicyDisabledConst  = "disabled"
	BareMetalServerReservationAffinityPatchPolicyManualConst    = "manual"
)

// UnmarshalBareMetalServerReservationAffinityPatch unmarshals an instance of BareMetalServerReservationAffinityPatch from the specified map of raw messages.
func UnmarshalBareMetalServerReservationAffinityPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerReservationAffinityPatch)
	err = core.UnmarshalPrimitive(m, "policy", &obj.Policy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool", &obj.Pool, UnmarshalReservationIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the BareMetalServerReservationAffinityPatch
func (bareMetalServerReservationAffinityPatch *BareMetalServerReservationAffinityPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(bareMetalServerReservationAffinityPatch.Policy) {
		_patch["policy"] = bareMetalServerReservationAffinityPatch.Policy
	}
	if !core.IsNil(bareMetalServerReservationAffinityPatch.Pool) {
		var poolPatches []map[string]interface{}
		for _, pool := range bareMetalServerReservationAffinityPatch.Pool {
			poolPatches = append(poolPatches, pool.asPatch())
		}
		_patch["pool"] = poolPatches
	}

	return
}

// BareMetalServerReservationAffinityPrototype : BareMetalServerReservationAffinityPrototype struct
type BareMetalServerReservationAffinityPrototype struct {
	// The reservation affinity policy to use for this bare metal server:
	// - `disabled`: Reservations will not be used
	// - `manual`: Reservations in `pool` will be available for use
	// - `automatic`: Any reservations with an `affinity_policy` of `automatic` that have the
	//   same `profile` and `zone` as this bare metal server are available for use.
	//
	// The policy will default to `manual` if `pool` is not empty. Otherwise the policy will default to `automatic`.
	Policy *string `json:"policy,omitempty"`

	// The pool of reservations available for use by this bare metal server.
	//
	// Specified reservations must have a `status` of `active`, and have the same `profile` and `zone` as this bare metal
	// server.
	//
	// If `policy` is `manual`, `pool` must have one reservation. If `policy` is `disabled` or `automatic`, `pool` must be
	// empty. If `policy` is `manual`, the `pool` must contain a reservation with available capacity.
	Pool []ReservationIdentityIntf `json:"pool,omitempty"`
}

// Constants associated with the BareMetalServerReservationAffinityPrototype.Policy property.
// The reservation affinity policy to use for this bare metal server:
//   - `disabled`: Reservations will not be used
//   - `manual`: Reservations in `pool` will be available for use
//   - `automatic`: Any reservations with an `affinity_policy` of `automatic` that have the
//     same `profile` and `zone` as this bare metal server are available for use.
//
// The policy will default to `manual` if `pool` is not empty. Otherwise the policy will default to `automatic`.
const (
	BareMetalServerReservationAffinityPrototypePolicyAutomaticConst = "automatic"
	BareMetalServerReservationAffinityPrototypePolicyDisabledConst  = "disabled"
	BareMetalServerReservationAffinityPrototypePolicyManualConst    = "manual"
)

// UnmarshalBareMetalServerReservationAffinityPrototype unmarshals an instance of BareMetalServerReservationAffinityPrototype from the specified map of raw messages.
func UnmarshalBareMetalServerReservationAffinityPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerReservationAffinityPrototype)
	err = core.UnmarshalPrimitive(m, "policy", &obj.Policy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool", &obj.Pool, UnmarshalReservationIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerStatusReason : BareMetalServerStatusReason struct
type BareMetalServerStatusReason struct {
	// The status reason code:
	// - `cannot_reinitialize`: An error occurred while reinitializing bare metal server
	// - `cannot_start`: Failed to start due to an internal error
	// - `cannot_start_capacity`: Insufficient capacity within the selected zone
	// - `cannot_start_compute`: An error occurred while allocating compute resources
	// - `cannot_start_ip_address`: An error occurred while allocating an IP address
	// - `cannot_start_network`: An error occurred while allocating network resources
	// - `cannot_update_firmware`: An error occurred while updating bare metal server firmware
	// - `cannot_start_reservation_capacity`: Failed to start because the reservation has
	//   insufficient capacity
	// - `cannot_start_reservation_expired`: Failed to start because the reservation has
	//   expired
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the BareMetalServerStatusReason.Code property.
// The status reason code:
//   - `cannot_reinitialize`: An error occurred while reinitializing bare metal server
//   - `cannot_start`: Failed to start due to an internal error
//   - `cannot_start_capacity`: Insufficient capacity within the selected zone
//   - `cannot_start_compute`: An error occurred while allocating compute resources
//   - `cannot_start_ip_address`: An error occurred while allocating an IP address
//   - `cannot_start_network`: An error occurred while allocating network resources
//   - `cannot_update_firmware`: An error occurred while updating bare metal server firmware
//   - `cannot_start_reservation_capacity`: Failed to start because the reservation has
//     insufficient capacity
//   - `cannot_start_reservation_expired`: Failed to start because the reservation has
//     expired
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerStatusReasonCodeCannotReinitializeConst             = "cannot_reinitialize"
	BareMetalServerStatusReasonCodeCannotStartConst                    = "cannot_start"
	BareMetalServerStatusReasonCodeCannotStartCapacityConst            = "cannot_start_capacity"
	BareMetalServerStatusReasonCodeCannotStartComputeConst             = "cannot_start_compute"
	BareMetalServerStatusReasonCodeCannotStartIPAddressConst           = "cannot_start_ip_address"
	BareMetalServerStatusReasonCodeCannotStartNetworkConst             = "cannot_start_network"
	BareMetalServerStatusReasonCodeCannotStartReservationCapacityConst = "cannot_start_reservation_capacity"
	BareMetalServerStatusReasonCodeCannotStartReservationExpiredConst  = "cannot_start_reservation_expired"
	BareMetalServerStatusReasonCodeCannotUpdateFirmwareConst           = "cannot_update_firmware"
)

// UnmarshalBareMetalServerStatusReason unmarshals an instance of BareMetalServerStatusReason from the specified map of raw messages.
func UnmarshalBareMetalServerStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerTrustedPlatformModule : BareMetalServerTrustedPlatformModule struct
type BareMetalServerTrustedPlatformModule struct {
	// Indicates whether the trusted platform module is enabled.
	Enabled *bool `json:"enabled" validate:"required"`

	// The trusted platform module (TPM) mode:
	// - `disabled`: No TPM functionality
	// - `tpm_2`: TPM 2.0
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Mode *string `json:"mode" validate:"required"`

	// The supported trusted platform module modes.
	SupportedModes []string `json:"supported_modes" validate:"required"`
}

// Constants associated with the BareMetalServerTrustedPlatformModule.Mode property.
// The trusted platform module (TPM) mode:
// - `disabled`: No TPM functionality
// - `tpm_2`: TPM 2.0
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerTrustedPlatformModuleModeDisabledConst = "disabled"
	BareMetalServerTrustedPlatformModuleModeTpm2Const     = "tpm_2"
)

// Constants associated with the BareMetalServerTrustedPlatformModule.SupportedModes property.
// The trusted platform module (TPM) mode:
// - `disabled`: No TPM functionality
// - `tpm_2`: TPM 2.0
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	BareMetalServerTrustedPlatformModuleSupportedModesDisabledConst = "disabled"
	BareMetalServerTrustedPlatformModuleSupportedModesTpm2Const     = "tpm_2"
)

// UnmarshalBareMetalServerTrustedPlatformModule unmarshals an instance of BareMetalServerTrustedPlatformModule from the specified map of raw messages.
func UnmarshalBareMetalServerTrustedPlatformModule(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerTrustedPlatformModule)
	err = core.UnmarshalPrimitive(m, "enabled", &obj.Enabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "mode", &obj.Mode)
	if err != nil {
		err = core.SDKErrorf(err, "", "mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "supported_modes", &obj.SupportedModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_modes-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// BareMetalServerTrustedPlatformModulePatch : BareMetalServerTrustedPlatformModulePatch struct
type BareMetalServerTrustedPlatformModulePatch struct {
	// The trusted platform module mode to use. The specified value must be listed in the bare metal server's
	// `supported_modes`.
	//
	// For the trusted platform module mode to be changed, the bare metal server `status` must be `stopped`.
	Mode *string `json:"mode,omitempty"`
}

// Constants associated with the BareMetalServerTrustedPlatformModulePatch.Mode property.
// The trusted platform module mode to use. The specified value must be listed in the bare metal server's
// `supported_modes`.
//
// For the trusted platform module mode to be changed, the bare metal server `status` must be `stopped`.
const (
	BareMetalServerTrustedPlatformModulePatchModeDisabledConst = "disabled"
	BareMetalServerTrustedPlatformModulePatchModeTpm2Const     = "tpm_2"
)

// UnmarshalBareMetalServerTrustedPlatformModulePatch unmarshals an instance of BareMetalServerTrustedPlatformModulePatch from the specified map of raw messages.
func UnmarshalBareMetalServerTrustedPlatformModulePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerTrustedPlatformModulePatch)
	err = core.UnmarshalPrimitive(m, "mode", &obj.Mode)
	if err != nil {
		err = core.SDKErrorf(err, "", "mode-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the BareMetalServerTrustedPlatformModulePatch
func (bareMetalServerTrustedPlatformModulePatch *BareMetalServerTrustedPlatformModulePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(bareMetalServerTrustedPlatformModulePatch.Mode) {
		_patch["mode"] = bareMetalServerTrustedPlatformModulePatch.Mode
	}

	return
}

// BareMetalServerTrustedPlatformModulePrototype : BareMetalServerTrustedPlatformModulePrototype struct
type BareMetalServerTrustedPlatformModulePrototype struct {
	// The trusted platform module mode to use. The specified value must be listed in the bare metal server profile's
	// `supported_trusted_platform_module_modes`.
	//
	// If unspecified, the default trusted platform module mode from the profile will be used.
	Mode *string `json:"mode,omitempty"`
}

// Constants associated with the BareMetalServerTrustedPlatformModulePrototype.Mode property.
// The trusted platform module mode to use. The specified value must be listed in the bare metal server profile's
// `supported_trusted_platform_module_modes`.
//
// If unspecified, the default trusted platform module mode from the profile will be used.
const (
	BareMetalServerTrustedPlatformModulePrototypeModeDisabledConst = "disabled"
	BareMetalServerTrustedPlatformModulePrototypeModeTpm2Const     = "tpm_2"
)

// UnmarshalBareMetalServerTrustedPlatformModulePrototype unmarshals an instance of BareMetalServerTrustedPlatformModulePrototype from the specified map of raw messages.
func UnmarshalBareMetalServerTrustedPlatformModulePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(BareMetalServerTrustedPlatformModulePrototype)
	err = core.UnmarshalPrimitive(m, "mode", &obj.Mode)
	if err != nil {
		err = core.SDKErrorf(err, "", "mode-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CatalogOfferingIdentity : Identifies a [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering by a unique
// property.
// Models which "extend" this model:
// - CatalogOfferingIdentityCatalogOfferingByCRN
type CatalogOfferingIdentity struct {
	// The CRN for this
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering.
	CRN *string `json:"crn,omitempty"`
}

func (*CatalogOfferingIdentity) isaCatalogOfferingIdentity() bool {
	return true
}

type CatalogOfferingIdentityIntf interface {
	isaCatalogOfferingIdentity() bool
}

// UnmarshalCatalogOfferingIdentity unmarshals an instance of CatalogOfferingIdentity from the specified map of raw messages.
func UnmarshalCatalogOfferingIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CatalogOfferingIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CatalogOfferingVersionIdentity : Identifies a version of a
// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering by a unique property.
// Models which "extend" this model:
// - CatalogOfferingVersionIdentityCatalogOfferingVersionByCRN
type CatalogOfferingVersionIdentity struct {
	// The CRN for this version of a
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering.
	CRN *string `json:"crn,omitempty"`
}

func (*CatalogOfferingVersionIdentity) isaCatalogOfferingVersionIdentity() bool {
	return true
}

type CatalogOfferingVersionIdentityIntf interface {
	isaCatalogOfferingVersionIdentity() bool
}

// UnmarshalCatalogOfferingVersionIdentity unmarshals an instance of CatalogOfferingVersionIdentity from the specified map of raw messages.
func UnmarshalCatalogOfferingVersionIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CatalogOfferingVersionIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CatalogOfferingVersionPlanIdentity : Identifies a catalog offering version's billing plan by a unique property.
// Models which "extend" this model:
// - CatalogOfferingVersionPlanIdentityCatalogOfferingVersionPlanByCRN
type CatalogOfferingVersionPlanIdentity struct {
	// The CRN for this
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering version's billing plan.
	CRN *string `json:"crn,omitempty"`
}

func (*CatalogOfferingVersionPlanIdentity) isaCatalogOfferingVersionPlanIdentity() bool {
	return true
}

type CatalogOfferingVersionPlanIdentityIntf interface {
	isaCatalogOfferingVersionPlanIdentity() bool
}

// UnmarshalCatalogOfferingVersionPlanIdentity unmarshals an instance of CatalogOfferingVersionPlanIdentity from the specified map of raw messages.
func UnmarshalCatalogOfferingVersionPlanIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CatalogOfferingVersionPlanIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CatalogOfferingVersionPlanReference : CatalogOfferingVersionPlanReference struct
type CatalogOfferingVersionPlanReference struct {
	// The CRN for this
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering version's billing plan.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`
}

// UnmarshalCatalogOfferingVersionPlanReference unmarshals an instance of CatalogOfferingVersionPlanReference from the specified map of raw messages.
func UnmarshalCatalogOfferingVersionPlanReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CatalogOfferingVersionPlanReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CatalogOfferingVersionReference : CatalogOfferingVersionReference struct
type CatalogOfferingVersionReference struct {
	// The CRN for this version of a
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering.
	CRN *string `json:"crn" validate:"required"`
}

// UnmarshalCatalogOfferingVersionReference unmarshals an instance of CatalogOfferingVersionReference from the specified map of raw messages.
func UnmarshalCatalogOfferingVersionReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CatalogOfferingVersionReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CertificateInstanceIdentity : Identifies a certificate instance by a unique property.
// Models which "extend" this model:
// - CertificateInstanceIdentityByCRN
type CertificateInstanceIdentity struct {
	// The CRN for this certificate instance.
	CRN *string `json:"crn,omitempty"`
}

func (*CertificateInstanceIdentity) isaCertificateInstanceIdentity() bool {
	return true
}

type CertificateInstanceIdentityIntf interface {
	isaCertificateInstanceIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalCertificateInstanceIdentity unmarshals an instance of CertificateInstanceIdentity from the specified map of raw messages.
func UnmarshalCertificateInstanceIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CertificateInstanceIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the CertificateInstanceIdentity
func (certificateInstanceIdentity *CertificateInstanceIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(certificateInstanceIdentity.CRN) {
		_patch["crn"] = certificateInstanceIdentity.CRN
	}

	return
}

// CertificateInstanceReference : CertificateInstanceReference struct
type CertificateInstanceReference struct {
	// The CRN for this certificate instance.
	CRN *string `json:"crn" validate:"required"`
}

// UnmarshalCertificateInstanceReference unmarshals an instance of CertificateInstanceReference from the specified map of raw messages.
func UnmarshalCertificateInstanceReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CertificateInstanceReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CheckVPNGatewayConnectionsLocalCIDROptions : The CheckVPNGatewayConnectionsLocalCIDR options.
type CheckVPNGatewayConnectionsLocalCIDROptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IP address range in CIDR block notation.
	CIDR *string `json:"cidr" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCheckVPNGatewayConnectionsLocalCIDROptions : Instantiate CheckVPNGatewayConnectionsLocalCIDROptions
func (*VpcV1) NewCheckVPNGatewayConnectionsLocalCIDROptions(vpnGatewayID string, id string, cidr string) *CheckVPNGatewayConnectionsLocalCIDROptions {
	return &CheckVPNGatewayConnectionsLocalCIDROptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
		CIDR:         core.StringPtr(cidr),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *CheckVPNGatewayConnectionsLocalCIDROptions) SetVPNGatewayID(vpnGatewayID string) *CheckVPNGatewayConnectionsLocalCIDROptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *CheckVPNGatewayConnectionsLocalCIDROptions) SetID(id string) *CheckVPNGatewayConnectionsLocalCIDROptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *CheckVPNGatewayConnectionsLocalCIDROptions) SetCIDR(cidr string) *CheckVPNGatewayConnectionsLocalCIDROptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CheckVPNGatewayConnectionsLocalCIDROptions) SetHeaders(param map[string]string) *CheckVPNGatewayConnectionsLocalCIDROptions {
	options.Headers = param
	return options
}

// CheckVPNGatewayConnectionsPeerCIDROptions : The CheckVPNGatewayConnectionsPeerCIDR options.
type CheckVPNGatewayConnectionsPeerCIDROptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IP address range in CIDR block notation.
	CIDR *string `json:"cidr" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCheckVPNGatewayConnectionsPeerCIDROptions : Instantiate CheckVPNGatewayConnectionsPeerCIDROptions
func (*VpcV1) NewCheckVPNGatewayConnectionsPeerCIDROptions(vpnGatewayID string, id string, cidr string) *CheckVPNGatewayConnectionsPeerCIDROptions {
	return &CheckVPNGatewayConnectionsPeerCIDROptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
		CIDR:         core.StringPtr(cidr),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *CheckVPNGatewayConnectionsPeerCIDROptions) SetVPNGatewayID(vpnGatewayID string) *CheckVPNGatewayConnectionsPeerCIDROptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *CheckVPNGatewayConnectionsPeerCIDROptions) SetID(id string) *CheckVPNGatewayConnectionsPeerCIDROptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *CheckVPNGatewayConnectionsPeerCIDROptions) SetCIDR(cidr string) *CheckVPNGatewayConnectionsPeerCIDROptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CheckVPNGatewayConnectionsPeerCIDROptions) SetHeaders(param map[string]string) *CheckVPNGatewayConnectionsPeerCIDROptions {
	options.Headers = param
	return options
}

// CloudObjectStorageBucketIdentity : Identifies a Cloud Object Storage bucket by a unique property.
// Models which "extend" this model:
// - CloudObjectStorageBucketIdentityCloudObjectStorageBucketIdentityByName
// - CloudObjectStorageBucketIdentityByCRN
type CloudObjectStorageBucketIdentity struct {
	// The globally unique name of this Cloud Object Storage bucket.
	Name *string `json:"name,omitempty"`

	// The CRN of this Cloud Object Storage bucket.
	CRN *string `json:"crn,omitempty"`
}

func (*CloudObjectStorageBucketIdentity) isaCloudObjectStorageBucketIdentity() bool {
	return true
}

type CloudObjectStorageBucketIdentityIntf interface {
	isaCloudObjectStorageBucketIdentity() bool
}

// UnmarshalCloudObjectStorageBucketIdentity unmarshals an instance of CloudObjectStorageBucketIdentity from the specified map of raw messages.
func UnmarshalCloudObjectStorageBucketIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CloudObjectStorageBucketIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CloudObjectStorageBucketReference : CloudObjectStorageBucketReference struct
type CloudObjectStorageBucketReference struct {
	// The CRN of this Cloud Object Storage bucket.
	CRN *string `json:"crn" validate:"required"`

	// The globally unique name of this Cloud Object Storage bucket.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalCloudObjectStorageBucketReference unmarshals an instance of CloudObjectStorageBucketReference from the specified map of raw messages.
func UnmarshalCloudObjectStorageBucketReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CloudObjectStorageBucketReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CloudObjectStorageObjectReference : CloudObjectStorageObjectReference struct
type CloudObjectStorageObjectReference struct {
	// The name of this Cloud Object Storage object. Names are unique within a Cloud Object Storage bucket.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalCloudObjectStorageObjectReference unmarshals an instance of CloudObjectStorageObjectReference from the specified map of raw messages.
func UnmarshalCloudObjectStorageObjectReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(CloudObjectStorageObjectReference)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetwork : ClusterNetwork struct
type ClusterNetwork struct {
	// The date and time that the cluster network was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this cluster network.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this cluster network.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []ClusterNetworkLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the cluster network.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this cluster network. The name must not be used by another cluster network in the region.
	Name *string `json:"name" validate:"required"`

	// The profile for this cluster network.
	Profile *ClusterNetworkProfileReference `json:"profile" validate:"required"`

	// The resource group for this cluster network.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The IP address ranges available for subnets for this cluster network.
	SubnetPrefixes []ClusterNetworkSubnetPrefix `json:"subnet_prefixes" validate:"required"`

	// The VPC this cluster network resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The zone this cluster network resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the ClusterNetwork.LifecycleState property.
// The lifecycle state of the cluster network.
const (
	ClusterNetworkLifecycleStateDeletingConst  = "deleting"
	ClusterNetworkLifecycleStateFailedConst    = "failed"
	ClusterNetworkLifecycleStatePendingConst   = "pending"
	ClusterNetworkLifecycleStateStableConst    = "stable"
	ClusterNetworkLifecycleStateSuspendedConst = "suspended"
	ClusterNetworkLifecycleStateUpdatingConst  = "updating"
	ClusterNetworkLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ClusterNetwork.ResourceType property.
// The resource type.
const (
	ClusterNetworkResourceTypeClusterNetworkConst = "cluster_network"
)

// UnmarshalClusterNetwork unmarshals an instance of ClusterNetwork from the specified map of raw messages.
func UnmarshalClusterNetwork(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetwork)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalClusterNetworkLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalClusterNetworkProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet_prefixes", &obj.SubnetPrefixes, UnmarshalClusterNetworkSubnetPrefix)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet_prefixes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkCollection : ClusterNetworkCollection struct
type ClusterNetworkCollection struct {
	// A page of cluster networks.
	ClusterNetworks []ClusterNetwork `json:"cluster_networks" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalClusterNetworkCollection unmarshals an instance of ClusterNetworkCollection from the specified map of raw messages.
func UnmarshalClusterNetworkCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkCollection)
	err = core.UnmarshalModel(m, "cluster_networks", &obj.ClusterNetworks, UnmarshalClusterNetwork)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_networks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ClusterNetworkCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ClusterNetworkInterface : The associated cluster network subnet.
type ClusterNetworkInterface struct {
	// Indicates whether source IP spoofing is allowed on this cluster network interface. If `false`, source IP spoofing is
	// prevented on this cluster network interface. If `true`, source IP spoofing is allowed on this cluster network
	// interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing" validate:"required"`

	// Indicates whether this cluster network interface will be automatically deleted when `target` is deleted.
	AutoDelete *bool `json:"auto_delete" validate:"required"`

	// The date and time that the cluster network interface was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the virtual network interface,
	//   allowing the workload to perform any needed NAT operations.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat" validate:"required"`

	// The URL for this cluster network interface.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network interface.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []ClusterNetworkInterfaceLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the cluster network interface.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The MAC address of the cluster network interface. May be absent if
	// `lifecycle_state` is `pending`.
	MacAddress *string `json:"mac_address,omitempty"`

	// The name for this cluster network interface. The name is unique across all interfaces in the cluster network.
	Name *string `json:"name" validate:"required"`

	// The cluster network subnet reserved IP for this cluster network interface.
	PrimaryIP *ClusterNetworkSubnetReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	Subnet *ClusterNetworkSubnetReference `json:"subnet,omitempty"`

	// The target of this cluster network interface.
	//
	// If absent, this cluster network interface is not attached to a target.
	//
	// The resources supported by this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Target ClusterNetworkInterfaceTargetIntf `json:"target,omitempty"`

	// The VPC this cluster network interface resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The zone this cluster network interface resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the ClusterNetworkInterface.LifecycleState property.
// The lifecycle state of the cluster network interface.
const (
	ClusterNetworkInterfaceLifecycleStateDeletingConst  = "deleting"
	ClusterNetworkInterfaceLifecycleStateFailedConst    = "failed"
	ClusterNetworkInterfaceLifecycleStatePendingConst   = "pending"
	ClusterNetworkInterfaceLifecycleStateStableConst    = "stable"
	ClusterNetworkInterfaceLifecycleStateSuspendedConst = "suspended"
	ClusterNetworkInterfaceLifecycleStateUpdatingConst  = "updating"
	ClusterNetworkInterfaceLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ClusterNetworkInterface.ResourceType property.
// The resource type.
const (
	ClusterNetworkInterfaceResourceTypeClusterNetworkInterfaceConst = "cluster_network_interface"
)

// UnmarshalClusterNetworkInterface unmarshals an instance of ClusterNetworkInterface from the specified map of raw messages.
func UnmarshalClusterNetworkInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterface)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_infrastructure_nat", &obj.EnableInfrastructureNat)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_infrastructure_nat-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalClusterNetworkInterfaceLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "mac_address", &obj.MacAddress)
	if err != nil {
		err = core.SDKErrorf(err, "", "mac_address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalClusterNetworkSubnetReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalClusterNetworkSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalClusterNetworkInterfaceTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkInterfaceCollection : ClusterNetworkInterfaceCollection struct
type ClusterNetworkInterfaceCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of cluster network interfaces.
	Interfaces []ClusterNetworkInterface `json:"interfaces" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalClusterNetworkInterfaceCollection unmarshals an instance of ClusterNetworkInterfaceCollection from the specified map of raw messages.
func UnmarshalClusterNetworkInterfaceCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterfaceCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "interfaces", &obj.Interfaces, UnmarshalClusterNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ClusterNetworkInterfaceCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ClusterNetworkInterfaceLifecycleReason : ClusterNetworkInterfaceLifecycleReason struct
type ClusterNetworkInterfaceLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ClusterNetworkInterfaceLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkInterfaceLifecycleReasonCodeInternalErrorConst               = "internal_error"
	ClusterNetworkInterfaceLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalClusterNetworkInterfaceLifecycleReason unmarshals an instance of ClusterNetworkInterfaceLifecycleReason from the specified map of raw messages.
func UnmarshalClusterNetworkInterfaceLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterfaceLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkInterfacePatch : ClusterNetworkInterfacePatch struct
type ClusterNetworkInterfacePatch struct {
	// Indicates whether this cluster network interface will be automatically deleted when `target` is deleted. Must be
	// `false` if the cluster network interface is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this cluster network interface. The name must not be used by another interface in the cluster network.
	// Names beginning with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// UnmarshalClusterNetworkInterfacePatch unmarshals an instance of ClusterNetworkInterfacePatch from the specified map of raw messages.
func UnmarshalClusterNetworkInterfacePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterfacePatch)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ClusterNetworkInterfacePatch
func (clusterNetworkInterfacePatch *ClusterNetworkInterfacePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(clusterNetworkInterfacePatch.AutoDelete) {
		_patch["auto_delete"] = clusterNetworkInterfacePatch.AutoDelete
	}
	if !core.IsNil(clusterNetworkInterfacePatch.Name) {
		_patch["name"] = clusterNetworkInterfacePatch.Name
	}

	return
}

// ClusterNetworkInterfacePrimaryIPPrototype : ClusterNetworkInterfacePrimaryIPPrototype struct
// Models which "extend" this model:
// - ClusterNetworkInterfacePrimaryIPPrototypeClusterNetworkSubnetReservedIPIdentityClusterNetworkInterfacePrimaryIPContext
// - ClusterNetworkInterfacePrimaryIPPrototypeClusterNetworkSubnetReservedIPPrototypeClusterNetworkInterfacePrimaryIPContext
type ClusterNetworkInterfacePrimaryIPPrototype struct {
	// The unique identifier for this cluster network subnet reserved IP.
	ID *string `json:"id,omitempty"`

	// The URL for this cluster network subnet reserved IP.
	Href *string `json:"href,omitempty"`

	// The IP address to reserve, which must not already be reserved on the subnet.
	//
	// If unspecified, an available address on the subnet will automatically be selected.
	Address *string `json:"address,omitempty"`

	// Indicates whether this cluster network subnet reserved IP member will be automatically deleted when either `target`
	// is deleted, or the cluster network subnet reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this cluster network subnet reserved IP. The name must not be used by another reserved IP in the
	// cluster network subnet. Names starting with `ibm-` are reserved for provider-owned resources, and are not allowed.
	// If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`
}

func (*ClusterNetworkInterfacePrimaryIPPrototype) isaClusterNetworkInterfacePrimaryIPPrototype() bool {
	return true
}

type ClusterNetworkInterfacePrimaryIPPrototypeIntf interface {
	isaClusterNetworkInterfacePrimaryIPPrototype() bool
}

// UnmarshalClusterNetworkInterfacePrimaryIPPrototype unmarshals an instance of ClusterNetworkInterfacePrimaryIPPrototype from the specified map of raw messages.
func UnmarshalClusterNetworkInterfacePrimaryIPPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterfacePrimaryIPPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkInterfaceReference : The associated cluster network subnet.
type ClusterNetworkInterfaceReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this cluster network interface.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network interface.
	ID *string `json:"id" validate:"required"`

	// The name for this cluster network interface. The name is unique across all interfaces in the cluster network.
	Name *string `json:"name" validate:"required"`

	// The primary IP for this cluster network interface.
	PrimaryIP *ClusterNetworkSubnetReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	Subnet *ClusterNetworkSubnetReference `json:"subnet" validate:"required"`
}

// Constants associated with the ClusterNetworkInterfaceReference.ResourceType property.
// The resource type.
const (
	ClusterNetworkInterfaceReferenceResourceTypeClusterNetworkInterfaceConst = "cluster_network_interface"
)

// UnmarshalClusterNetworkInterfaceReference unmarshals an instance of ClusterNetworkInterfaceReference from the specified map of raw messages.
func UnmarshalClusterNetworkInterfaceReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterfaceReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalClusterNetworkSubnetReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalClusterNetworkSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkInterfaceTarget : The target of this cluster network interface.
//
// If absent, this cluster network interface is not attached to a target.
//
// The resources supported by this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
// Models which "extend" this model:
// - ClusterNetworkInterfaceTargetInstanceClusterNetworkAttachmentReferenceClusterNetworkInterfaceContext
type ClusterNetworkInterfaceTarget struct {
	// The URL for this instance cluster network attachment.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this instance cluster network attachment.
	ID *string `json:"id,omitempty"`

	// The name for this instance cluster network attachment. The name is unique across all network attachments for the
	// instance.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ClusterNetworkInterfaceTarget.ResourceType property.
// The resource type.
const (
	ClusterNetworkInterfaceTargetResourceTypeInstanceClusterNetworkAttachmentConst = "instance_cluster_network_attachment"
)

func (*ClusterNetworkInterfaceTarget) isaClusterNetworkInterfaceTarget() bool {
	return true
}

type ClusterNetworkInterfaceTargetIntf interface {
	isaClusterNetworkInterfaceTarget() bool
}

// UnmarshalClusterNetworkInterfaceTarget unmarshals an instance of ClusterNetworkInterfaceTarget from the specified map of raw messages.
func UnmarshalClusterNetworkInterfaceTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkInterfaceTarget)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkLifecycleReason : ClusterNetworkLifecycleReason struct
type ClusterNetworkLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ClusterNetworkLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkLifecycleReasonCodeInternalErrorConst               = "internal_error"
	ClusterNetworkLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalClusterNetworkLifecycleReason unmarshals an instance of ClusterNetworkLifecycleReason from the specified map of raw messages.
func UnmarshalClusterNetworkLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkPatch : ClusterNetworkPatch struct
type ClusterNetworkPatch struct {
	// The name for this cluster network. The name must not be used by another cluster network in the region. Names
	// starting with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// UnmarshalClusterNetworkPatch unmarshals an instance of ClusterNetworkPatch from the specified map of raw messages.
func UnmarshalClusterNetworkPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ClusterNetworkPatch
func (clusterNetworkPatch *ClusterNetworkPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(clusterNetworkPatch.Name) {
		_patch["name"] = clusterNetworkPatch.Name
	}

	return
}

// ClusterNetworkProfile : ClusterNetworkProfile struct
type ClusterNetworkProfile struct {
	// The product family this cluster network profile belongs to.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Family *string `json:"family" validate:"required"`

	// The URL for this cluster network profile.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this cluster network profile.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The instance profiles that support this cluster network profile.
	SupportedInstanceProfiles []InstanceProfileReference `json:"supported_instance_profiles" validate:"required"`

	// Zones in this region that support this cluster network profile.
	Zones []ZoneReference `json:"zones" validate:"required"`
}

// Constants associated with the ClusterNetworkProfile.Family property.
// The product family this cluster network profile belongs to.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkProfileFamilyVelaConst = "vela"
)

// Constants associated with the ClusterNetworkProfile.ResourceType property.
// The resource type.
const (
	ClusterNetworkProfileResourceTypeClusterNetworkProfileConst = "cluster_network_profile"
)

// UnmarshalClusterNetworkProfile unmarshals an instance of ClusterNetworkProfile from the specified map of raw messages.
func UnmarshalClusterNetworkProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkProfile)
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_instance_profiles", &obj.SupportedInstanceProfiles, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_instance_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zones", &obj.Zones, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zones-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkProfileCollection : ClusterNetworkProfileCollection struct
type ClusterNetworkProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of cluster network profiles.
	Profiles []ClusterNetworkProfile `json:"profiles" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalClusterNetworkProfileCollection unmarshals an instance of ClusterNetworkProfileCollection from the specified map of raw messages.
func UnmarshalClusterNetworkProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profiles", &obj.Profiles, UnmarshalClusterNetworkProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ClusterNetworkProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ClusterNetworkProfileIdentity : Identifies an cluster network profile by a unique property.
// Models which "extend" this model:
// - ClusterNetworkProfileIdentityByName
// - ClusterNetworkProfileIdentityByHref
type ClusterNetworkProfileIdentity struct {
	// The globally unique name for this cluster network profile.
	Name *string `json:"name,omitempty"`

	// The URL for this cluster network profile.
	Href *string `json:"href,omitempty"`
}

func (*ClusterNetworkProfileIdentity) isaClusterNetworkProfileIdentity() bool {
	return true
}

type ClusterNetworkProfileIdentityIntf interface {
	isaClusterNetworkProfileIdentity() bool
}

// UnmarshalClusterNetworkProfileIdentity unmarshals an instance of ClusterNetworkProfileIdentity from the specified map of raw messages.
func UnmarshalClusterNetworkProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkProfileIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkProfileReference : ClusterNetworkProfileReference struct
type ClusterNetworkProfileReference struct {
	// The URL for this cluster network profile.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this cluster network profile.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ClusterNetworkProfileReference.ResourceType property.
// The resource type.
const (
	ClusterNetworkProfileReferenceResourceTypeClusterNetworkProfileConst = "cluster_network_profile"
)

// UnmarshalClusterNetworkProfileReference unmarshals an instance of ClusterNetworkProfileReference from the specified map of raw messages.
func UnmarshalClusterNetworkProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkProfileReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkReference : ClusterNetworkReference struct
type ClusterNetworkReference struct {
	// The CRN for this cluster network.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this cluster network.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network.
	ID *string `json:"id" validate:"required"`

	// The name for this cluster network. The name must not be used by another cluster network in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ClusterNetworkReference.ResourceType property.
// The resource type.
const (
	ClusterNetworkReferenceResourceTypeClusterNetworkConst = "cluster_network"
)

// UnmarshalClusterNetworkReference unmarshals an instance of ClusterNetworkReference from the specified map of raw messages.
func UnmarshalClusterNetworkReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnet : ClusterNetworkSubnet struct
type ClusterNetworkSubnet struct {
	// The number of IPv4 addresses in this cluster network subnet that are not in use, and have not been reserved by the
	// user or the provider.
	AvailableIpv4AddressCount *int64 `json:"available_ipv4_address_count" validate:"required"`

	// The date and time that the cluster network subnet was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this cluster network subnet.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network subnet.
	ID *string `json:"id" validate:"required"`

	// The IP version for this cluster network subnet.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	IPVersion *string `json:"ip_version" validate:"required"`

	// The IPv4 range of this cluster network subnet, expressed in CIDR format.
	Ipv4CIDRBlock *string `json:"ipv4_cidr_block" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []ClusterNetworkSubnetLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the cluster network subnet.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this cluster network subnet. The name is unique across all cluster network subnets in the cluster
	// network.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The total number of IPv4 addresses in this cluster network subnet.
	//
	// Note: This is calculated as 2<sup>(32 - prefix length)</sup>. For example, the prefix length `/24` gives:<br>
	// 2<sup>(32 - 24)</sup> = 2<sup>8</sup> = 256 addresses.
	TotalIpv4AddressCount *int64 `json:"total_ipv4_address_count" validate:"required"`
}

// Constants associated with the ClusterNetworkSubnet.IPVersion property.
// The IP version for this cluster network subnet.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkSubnetIPVersionIpv4Const = "ipv4"
)

// Constants associated with the ClusterNetworkSubnet.LifecycleState property.
// The lifecycle state of the cluster network subnet.
const (
	ClusterNetworkSubnetLifecycleStateDeletingConst  = "deleting"
	ClusterNetworkSubnetLifecycleStateFailedConst    = "failed"
	ClusterNetworkSubnetLifecycleStatePendingConst   = "pending"
	ClusterNetworkSubnetLifecycleStateStableConst    = "stable"
	ClusterNetworkSubnetLifecycleStateSuspendedConst = "suspended"
	ClusterNetworkSubnetLifecycleStateUpdatingConst  = "updating"
	ClusterNetworkSubnetLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ClusterNetworkSubnet.ResourceType property.
// The resource type.
const (
	ClusterNetworkSubnetResourceTypeClusterNetworkSubnetConst = "cluster_network_subnet"
)

// UnmarshalClusterNetworkSubnet unmarshals an instance of ClusterNetworkSubnet from the specified map of raw messages.
func UnmarshalClusterNetworkSubnet(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnet)
	err = core.UnmarshalPrimitive(m, "available_ipv4_address_count", &obj.AvailableIpv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "available_ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ipv4_cidr_block", &obj.Ipv4CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipv4_cidr_block-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalClusterNetworkSubnetLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_ipv4_address_count", &obj.TotalIpv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetCollection : ClusterNetworkSubnetCollection struct
type ClusterNetworkSubnetCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of subnets for the cluster network.
	Subnets []ClusterNetworkSubnet `json:"subnets" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalClusterNetworkSubnetCollection unmarshals an instance of ClusterNetworkSubnetCollection from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalClusterNetworkSubnet)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ClusterNetworkSubnetCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ClusterNetworkSubnetIdentity : Identifies a cluster network subnet by a unique property.
// Models which "extend" this model:
// - ClusterNetworkSubnetIdentityByID
// - ClusterNetworkSubnetIdentityByHref
type ClusterNetworkSubnetIdentity struct {
	// The unique identifier for this cluster network subnet.
	ID *string `json:"id,omitempty"`

	// The URL for this cluster network subnet.
	Href *string `json:"href,omitempty"`
}

func (*ClusterNetworkSubnetIdentity) isaClusterNetworkSubnetIdentity() bool {
	return true
}

type ClusterNetworkSubnetIdentityIntf interface {
	isaClusterNetworkSubnetIdentity() bool
}

// UnmarshalClusterNetworkSubnetIdentity unmarshals an instance of ClusterNetworkSubnetIdentity from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetLifecycleReason : ClusterNetworkSubnetLifecycleReason struct
type ClusterNetworkSubnetLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ClusterNetworkSubnetLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkSubnetLifecycleReasonCodeInternalErrorConst               = "internal_error"
	ClusterNetworkSubnetLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalClusterNetworkSubnetLifecycleReason unmarshals an instance of ClusterNetworkSubnetLifecycleReason from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetPatch : ClusterNetworkSubnetPatch struct
type ClusterNetworkSubnetPatch struct {
	// The name for this cluster network subnet. The name must not be used by another cluster network subnet in the cluster
	// network. Names starting with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// UnmarshalClusterNetworkSubnetPatch unmarshals an instance of ClusterNetworkSubnetPatch from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ClusterNetworkSubnetPatch
func (clusterNetworkSubnetPatch *ClusterNetworkSubnetPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(clusterNetworkSubnetPatch.Name) {
		_patch["name"] = clusterNetworkSubnetPatch.Name
	}

	return
}

// ClusterNetworkSubnetPrefix : A range of addresses available for subnets for this cluster network.
type ClusterNetworkSubnetPrefix struct {
	// The allocation policy for this subnet prefix:
	// - `auto`: Subnets created by total count in this cluster network can use this prefix.
	AllocationPolicy *string `json:"allocation_policy" validate:"required"`

	// The CIDR block for this prefix.
	CIDR *string `json:"cidr" validate:"required"`
}

// Constants associated with the ClusterNetworkSubnetPrefix.AllocationPolicy property.
// The allocation policy for this subnet prefix:
// - `auto`: Subnets created by total count in this cluster network can use this prefix.
const (
	ClusterNetworkSubnetPrefixAllocationPolicyAutoConst = "auto"
)

// UnmarshalClusterNetworkSubnetPrefix unmarshals an instance of ClusterNetworkSubnetPrefix from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetPrefix(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetPrefix)
	err = core.UnmarshalPrimitive(m, "allocation_policy", &obj.AllocationPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "allocation_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr", &obj.CIDR)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetPrefixPrototype : ClusterNetworkSubnetPrefixPrototype struct
type ClusterNetworkSubnetPrefixPrototype struct {
	// The IPv4 range of the cluster network's subnet prefix, expressed in CIDR format.
	//
	// The CIDR prefix length must be less than `/29` (at least 8 addresses).
	//
	// If a range is specified that overlaps with address prefixes in the cluster network's VPC, the operating systems of
	// any virtual server instances attaching to this cluster network must be [configured to avoid
	// conflicts](https://cloud.ibm.com/docs/vpc?topic=vpc-planning-cluster-network#advanced-consideration).
	CIDR *string `json:"cidr,omitempty"`
}

// UnmarshalClusterNetworkSubnetPrefixPrototype unmarshals an instance of ClusterNetworkSubnetPrefixPrototype from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetPrefixPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetPrefixPrototype)
	err = core.UnmarshalPrimitive(m, "cidr", &obj.CIDR)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetPrototype : ClusterNetworkSubnetPrototype struct
// Models which "extend" this model:
// - ClusterNetworkSubnetPrototypeClusterNetworkSubnetByTotalCountPrototype
// - ClusterNetworkSubnetPrototypeClusterNetworkSubnetByIPv4CIDRBlockPrototype
type ClusterNetworkSubnetPrototype struct {
	// The IP version(s) to support for this cluster network subnet.
	IPVersion *string `json:"ip_version,omitempty"`

	// The name for this cluster network subnet. The name must not be used by another cluster network subnet in the cluster
	// network. Names starting with `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The total number of IPv4 addresses required. Must be a power of 2.
	//
	// A CIDR will be allocated from a subnet prefix in the cluster network that has an
	// `allocation_policy` of `auto`. There must be a subnet prefix that has a free CIDR range with at least this number of
	// addresses.
	TotalIpv4AddressCount *int64 `json:"total_ipv4_address_count,omitempty"`

	// The IPv4 range of the cluster network subnet, expressed in CIDR format. The prefix length of the cluster network
	// subnet's CIDR must be between `/8` (16,777,216 addresses) and `/29`
	// (8 addresses). The IPv4 range of the cluster network subnet's CIDR must be within the cluster network's
	// `subnet_prefixes`.
	//
	// The range must not overlap with any of the following reserved address ranges:
	//
	//   - `127.0.0.0/8` (IPv4 loopback addresses)
	//   - `169.254.0.0/16` (IPv4 link-local addresses)
	//   - `224.0.0.0/4` (IPv4 multicast addresses).
	Ipv4CIDRBlock *string `json:"ipv4_cidr_block,omitempty"`
}

// Constants associated with the ClusterNetworkSubnetPrototype.IPVersion property.
// The IP version(s) to support for this cluster network subnet.
const (
	ClusterNetworkSubnetPrototypeIPVersionIpv4Const = "ipv4"
)

func (*ClusterNetworkSubnetPrototype) isaClusterNetworkSubnetPrototype() bool {
	return true
}

type ClusterNetworkSubnetPrototypeIntf interface {
	isaClusterNetworkSubnetPrototype() bool
}

// UnmarshalClusterNetworkSubnetPrototype unmarshals an instance of ClusterNetworkSubnetPrototype from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetPrototype)
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_ipv4_address_count", &obj.TotalIpv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ipv4_cidr_block", &obj.Ipv4CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipv4_cidr_block-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetReference : ClusterNetworkSubnetReference struct
type ClusterNetworkSubnetReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this cluster network subnet.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network subnet.
	ID *string `json:"id" validate:"required"`

	// The name for this cluster network subnet. The name is unique across all cluster network subnets in the cluster
	// network.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ClusterNetworkSubnetReference.ResourceType property.
// The resource type.
const (
	ClusterNetworkSubnetReferenceResourceTypeClusterNetworkSubnetConst = "cluster_network_subnet"
)

// UnmarshalClusterNetworkSubnetReference unmarshals an instance of ClusterNetworkSubnetReference from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetReservedIP : ClusterNetworkSubnetReservedIP struct
type ClusterNetworkSubnetReservedIP struct {
	// The IP address.
	//
	// If the address is pending allocation, the value will be `0.0.0.0`.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address" validate:"required"`

	// Indicates whether this cluster network subnet reserved IP member will be automatically deleted when either `target`
	// is deleted, or the cluster network subnet reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete" validate:"required"`

	// The date and time that the cluster network subnet reserved IP was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this cluster network subnet reserved IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network subnet reserved IP.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []ClusterNetworkSubnetReservedIPLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the cluster network subnet reserved IP.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this cluster network subnet reserved IP. The name is unique across all reserved IPs in a cluster
	// network subnet.
	Name *string `json:"name" validate:"required"`

	// The owner of the cluster network subnet reserved IP
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Owner *string `json:"owner" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The target this cluster network subnet reserved IP is bound to.
	//
	// If absent, this cluster network subnet reserved IP is provider-owned or unbound.
	Target ClusterNetworkSubnetReservedIPTargetIntf `json:"target,omitempty"`
}

// Constants associated with the ClusterNetworkSubnetReservedIP.LifecycleState property.
// The lifecycle state of the cluster network subnet reserved IP.
const (
	ClusterNetworkSubnetReservedIPLifecycleStateDeletingConst  = "deleting"
	ClusterNetworkSubnetReservedIPLifecycleStateFailedConst    = "failed"
	ClusterNetworkSubnetReservedIPLifecycleStatePendingConst   = "pending"
	ClusterNetworkSubnetReservedIPLifecycleStateStableConst    = "stable"
	ClusterNetworkSubnetReservedIPLifecycleStateSuspendedConst = "suspended"
	ClusterNetworkSubnetReservedIPLifecycleStateUpdatingConst  = "updating"
	ClusterNetworkSubnetReservedIPLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ClusterNetworkSubnetReservedIP.Owner property.
// The owner of the cluster network subnet reserved IP
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkSubnetReservedIPOwnerProviderConst = "provider"
	ClusterNetworkSubnetReservedIPOwnerUserConst     = "user"
)

// Constants associated with the ClusterNetworkSubnetReservedIP.ResourceType property.
// The resource type.
const (
	ClusterNetworkSubnetReservedIPResourceTypeClusterNetworkSubnetReservedIPConst = "cluster_network_subnet_reserved_ip"
)

// UnmarshalClusterNetworkSubnetReservedIP unmarshals an instance of ClusterNetworkSubnetReservedIP from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReservedIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReservedIP)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalClusterNetworkSubnetReservedIPLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "owner", &obj.Owner)
	if err != nil {
		err = core.SDKErrorf(err, "", "owner-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalClusterNetworkSubnetReservedIPTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetReservedIPCollection : ClusterNetworkSubnetReservedIPCollection struct
type ClusterNetworkSubnetReservedIPCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of reserved IPs for the cluster network subnet.
	ReservedIps []ClusterNetworkSubnetReservedIP `json:"reserved_ips" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalClusterNetworkSubnetReservedIPCollection unmarshals an instance of ClusterNetworkSubnetReservedIPCollection from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReservedIPCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReservedIPCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reserved_ips", &obj.ReservedIps, UnmarshalClusterNetworkSubnetReservedIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "reserved_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ClusterNetworkSubnetReservedIPCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ClusterNetworkSubnetReservedIPLifecycleReason : ClusterNetworkSubnetReservedIPLifecycleReason struct
type ClusterNetworkSubnetReservedIPLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ClusterNetworkSubnetReservedIPLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ClusterNetworkSubnetReservedIPLifecycleReasonCodeInternalErrorConst               = "internal_error"
	ClusterNetworkSubnetReservedIPLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalClusterNetworkSubnetReservedIPLifecycleReason unmarshals an instance of ClusterNetworkSubnetReservedIPLifecycleReason from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReservedIPLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReservedIPLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetReservedIPPatch : ClusterNetworkSubnetReservedIPPatch struct
type ClusterNetworkSubnetReservedIPPatch struct {
	// Indicates whether this cluster network subnet reserved IP member will be automatically deleted when either `target`
	// is deleted, or the cluster network subnet reserved IP is unbound. Must be `false` if the cluster network subnet
	// reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this cluster network subnet reserved IP. The name must not be used by another reserved IP in the
	// cluster network subnet. Names starting with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// UnmarshalClusterNetworkSubnetReservedIPPatch unmarshals an instance of ClusterNetworkSubnetReservedIPPatch from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReservedIPPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReservedIPPatch)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ClusterNetworkSubnetReservedIPPatch
func (clusterNetworkSubnetReservedIPPatch *ClusterNetworkSubnetReservedIPPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(clusterNetworkSubnetReservedIPPatch.AutoDelete) {
		_patch["auto_delete"] = clusterNetworkSubnetReservedIPPatch.AutoDelete
	}
	if !core.IsNil(clusterNetworkSubnetReservedIPPatch.Name) {
		_patch["name"] = clusterNetworkSubnetReservedIPPatch.Name
	}

	return
}

// ClusterNetworkSubnetReservedIPReference : ClusterNetworkSubnetReservedIPReference struct
type ClusterNetworkSubnetReservedIPReference struct {
	// The IP address.
	//
	// If the address is pending allocation, the value will be `0.0.0.0`.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this cluster network subnet reserved IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this cluster network subnet reserved IP.
	ID *string `json:"id" validate:"required"`

	// The name for this cluster network subnet reserved IP. The name is unique across all reserved IPs in a cluster
	// network subnet.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ClusterNetworkSubnetReservedIPReference.ResourceType property.
// The resource type.
const (
	ClusterNetworkSubnetReservedIPReferenceResourceTypeClusterNetworkSubnetReservedIPConst = "cluster_network_subnet_reserved_ip"
)

// UnmarshalClusterNetworkSubnetReservedIPReference unmarshals an instance of ClusterNetworkSubnetReservedIPReference from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReservedIPReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReservedIPReference)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ClusterNetworkSubnetReservedIPTarget : The target this cluster network subnet reserved IP is bound to.
//
// If absent, this cluster network subnet reserved IP is provider-owned or unbound.
// Models which "extend" this model:
// - ClusterNetworkSubnetReservedIPTargetClusterNetworkInterfaceReferenceClusterNetworkSubnetReservedIPTargetContext
type ClusterNetworkSubnetReservedIPTarget struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this cluster network interface.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this cluster network interface.
	ID *string `json:"id,omitempty"`

	// The name for this cluster network interface. The name is unique across all interfaces in the cluster network.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ClusterNetworkSubnetReservedIPTarget.ResourceType property.
// The resource type.
const (
	ClusterNetworkSubnetReservedIPTargetResourceTypeClusterNetworkInterfaceConst = "cluster_network_interface"
)

func (*ClusterNetworkSubnetReservedIPTarget) isaClusterNetworkSubnetReservedIPTarget() bool {
	return true
}

type ClusterNetworkSubnetReservedIPTargetIntf interface {
	isaClusterNetworkSubnetReservedIPTarget() bool
}

// UnmarshalClusterNetworkSubnetReservedIPTarget unmarshals an instance of ClusterNetworkSubnetReservedIPTarget from the specified map of raw messages.
func UnmarshalClusterNetworkSubnetReservedIPTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ClusterNetworkSubnetReservedIPTarget)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// CreateBackupPolicyOptions : The CreateBackupPolicy options.
type CreateBackupPolicyOptions struct {
	// The backup policy prototype object.
	BackupPolicyPrototype BackupPolicyPrototypeIntf `json:"BackupPolicyPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateBackupPolicyOptions : Instantiate CreateBackupPolicyOptions
func (*VpcV1) NewCreateBackupPolicyOptions(backupPolicyPrototype BackupPolicyPrototypeIntf) *CreateBackupPolicyOptions {
	return &CreateBackupPolicyOptions{
		BackupPolicyPrototype: backupPolicyPrototype,
	}
}

// SetBackupPolicyPrototype : Allow user to set BackupPolicyPrototype
func (_options *CreateBackupPolicyOptions) SetBackupPolicyPrototype(backupPolicyPrototype BackupPolicyPrototypeIntf) *CreateBackupPolicyOptions {
	_options.BackupPolicyPrototype = backupPolicyPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateBackupPolicyOptions) SetHeaders(param map[string]string) *CreateBackupPolicyOptions {
	options.Headers = param
	return options
}

// CreateBackupPolicyPlanOptions : The CreateBackupPolicyPlan options.
type CreateBackupPolicyPlanOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// The cron specification for the backup schedule. The backup policy jobs
	// (which create and delete backups for this plan) will not start until this time, and may start for up to 90 minutes
	// after this time.
	//
	// All backup schedules for plans in the same policy must be at least an hour apart.
	CronSpec *string `json:"cron_spec" validate:"required"`

	// Indicates whether the plan is active.
	Active *bool `json:"active,omitempty"`

	// The user tags to attach to each backup (snapshot) created by this plan.
	AttachUserTags []string `json:"attach_user_tags,omitempty"`

	ClonePolicy *BackupPolicyPlanClonePolicyPrototype `json:"clone_policy,omitempty"`

	// Indicates whether to copy the source's user tags to the created backups (snapshots).
	CopyUserTags *bool `json:"copy_user_tags,omitempty"`

	DeletionTrigger *BackupPolicyPlanDeletionTriggerPrototype `json:"deletion_trigger,omitempty"`

	// The name for this backup policy plan. The name must not be used by another plan for the backup policy. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The policies for additional backups in remote regions.
	RemoteRegionPolicies []BackupPolicyPlanRemoteRegionPolicyPrototype `json:"remote_region_policies,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateBackupPolicyPlanOptions : Instantiate CreateBackupPolicyPlanOptions
func (*VpcV1) NewCreateBackupPolicyPlanOptions(backupPolicyID string, cronSpec string) *CreateBackupPolicyPlanOptions {
	return &CreateBackupPolicyPlanOptions{
		BackupPolicyID: core.StringPtr(backupPolicyID),
		CronSpec:       core.StringPtr(cronSpec),
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *CreateBackupPolicyPlanOptions) SetBackupPolicyID(backupPolicyID string) *CreateBackupPolicyPlanOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetCronSpec : Allow user to set CronSpec
func (_options *CreateBackupPolicyPlanOptions) SetCronSpec(cronSpec string) *CreateBackupPolicyPlanOptions {
	_options.CronSpec = core.StringPtr(cronSpec)
	return _options
}

// SetActive : Allow user to set Active
func (_options *CreateBackupPolicyPlanOptions) SetActive(active bool) *CreateBackupPolicyPlanOptions {
	_options.Active = core.BoolPtr(active)
	return _options
}

// SetAttachUserTags : Allow user to set AttachUserTags
func (_options *CreateBackupPolicyPlanOptions) SetAttachUserTags(attachUserTags []string) *CreateBackupPolicyPlanOptions {
	_options.AttachUserTags = attachUserTags
	return _options
}

// SetClonePolicy : Allow user to set ClonePolicy
func (_options *CreateBackupPolicyPlanOptions) SetClonePolicy(clonePolicy *BackupPolicyPlanClonePolicyPrototype) *CreateBackupPolicyPlanOptions {
	_options.ClonePolicy = clonePolicy
	return _options
}

// SetCopyUserTags : Allow user to set CopyUserTags
func (_options *CreateBackupPolicyPlanOptions) SetCopyUserTags(copyUserTags bool) *CreateBackupPolicyPlanOptions {
	_options.CopyUserTags = core.BoolPtr(copyUserTags)
	return _options
}

// SetDeletionTrigger : Allow user to set DeletionTrigger
func (_options *CreateBackupPolicyPlanOptions) SetDeletionTrigger(deletionTrigger *BackupPolicyPlanDeletionTriggerPrototype) *CreateBackupPolicyPlanOptions {
	_options.DeletionTrigger = deletionTrigger
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateBackupPolicyPlanOptions) SetName(name string) *CreateBackupPolicyPlanOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetRemoteRegionPolicies : Allow user to set RemoteRegionPolicies
func (_options *CreateBackupPolicyPlanOptions) SetRemoteRegionPolicies(remoteRegionPolicies []BackupPolicyPlanRemoteRegionPolicyPrototype) *CreateBackupPolicyPlanOptions {
	_options.RemoteRegionPolicies = remoteRegionPolicies
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateBackupPolicyPlanOptions) SetHeaders(param map[string]string) *CreateBackupPolicyPlanOptions {
	options.Headers = param
	return options
}

// CreateBareMetalServerConsoleAccessTokenOptions : The CreateBareMetalServerConsoleAccessToken options.
type CreateBareMetalServerConsoleAccessTokenOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server console type for which this token may be used
	//
	// Must be `serial` for bare metal servers with a `cpu.architecture` of `s390x`.
	ConsoleType *string `json:"console_type" validate:"required"`

	// Indicates whether to disconnect an existing serial console session as the serial console cannot be shared.  This has
	// no effect on VNC consoles.
	Force *bool `json:"force,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateBareMetalServerConsoleAccessTokenOptions.ConsoleType property.
// The bare metal server console type for which this token may be used
//
// Must be `serial` for bare metal servers with a `cpu.architecture` of `s390x`.
const (
	CreateBareMetalServerConsoleAccessTokenOptionsConsoleTypeSerialConst = "serial"
	CreateBareMetalServerConsoleAccessTokenOptionsConsoleTypeVncConst    = "vnc"
)

// NewCreateBareMetalServerConsoleAccessTokenOptions : Instantiate CreateBareMetalServerConsoleAccessTokenOptions
func (*VpcV1) NewCreateBareMetalServerConsoleAccessTokenOptions(bareMetalServerID string, consoleType string) *CreateBareMetalServerConsoleAccessTokenOptions {
	return &CreateBareMetalServerConsoleAccessTokenOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
		ConsoleType:       core.StringPtr(consoleType),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *CreateBareMetalServerConsoleAccessTokenOptions) SetBareMetalServerID(bareMetalServerID string) *CreateBareMetalServerConsoleAccessTokenOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetConsoleType : Allow user to set ConsoleType
func (_options *CreateBareMetalServerConsoleAccessTokenOptions) SetConsoleType(consoleType string) *CreateBareMetalServerConsoleAccessTokenOptions {
	_options.ConsoleType = core.StringPtr(consoleType)
	return _options
}

// SetForce : Allow user to set Force
func (_options *CreateBareMetalServerConsoleAccessTokenOptions) SetForce(force bool) *CreateBareMetalServerConsoleAccessTokenOptions {
	_options.Force = core.BoolPtr(force)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateBareMetalServerConsoleAccessTokenOptions) SetHeaders(param map[string]string) *CreateBareMetalServerConsoleAccessTokenOptions {
	options.Headers = param
	return options
}

// CreateBareMetalServerNetworkAttachmentOptions : The CreateBareMetalServerNetworkAttachment options.
type CreateBareMetalServerNetworkAttachmentOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network attachment prototype object.
	BareMetalServerNetworkAttachmentPrototype BareMetalServerNetworkAttachmentPrototypeIntf `json:"BareMetalServerNetworkAttachmentPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateBareMetalServerNetworkAttachmentOptions : Instantiate CreateBareMetalServerNetworkAttachmentOptions
func (*VpcV1) NewCreateBareMetalServerNetworkAttachmentOptions(bareMetalServerID string, bareMetalServerNetworkAttachmentPrototype BareMetalServerNetworkAttachmentPrototypeIntf) *CreateBareMetalServerNetworkAttachmentOptions {
	return &CreateBareMetalServerNetworkAttachmentOptions{
		BareMetalServerID:                         core.StringPtr(bareMetalServerID),
		BareMetalServerNetworkAttachmentPrototype: bareMetalServerNetworkAttachmentPrototype,
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *CreateBareMetalServerNetworkAttachmentOptions) SetBareMetalServerID(bareMetalServerID string) *CreateBareMetalServerNetworkAttachmentOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetBareMetalServerNetworkAttachmentPrototype : Allow user to set BareMetalServerNetworkAttachmentPrototype
func (_options *CreateBareMetalServerNetworkAttachmentOptions) SetBareMetalServerNetworkAttachmentPrototype(bareMetalServerNetworkAttachmentPrototype BareMetalServerNetworkAttachmentPrototypeIntf) *CreateBareMetalServerNetworkAttachmentOptions {
	_options.BareMetalServerNetworkAttachmentPrototype = bareMetalServerNetworkAttachmentPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateBareMetalServerNetworkAttachmentOptions) SetHeaders(param map[string]string) *CreateBareMetalServerNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// CreateBareMetalServerNetworkInterfaceOptions : The CreateBareMetalServerNetworkInterface options.
type CreateBareMetalServerNetworkInterfaceOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface prototype object.
	BareMetalServerNetworkInterfacePrototype BareMetalServerNetworkInterfacePrototypeIntf `json:"BareMetalServerNetworkInterfacePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateBareMetalServerNetworkInterfaceOptions : Instantiate CreateBareMetalServerNetworkInterfaceOptions
func (*VpcV1) NewCreateBareMetalServerNetworkInterfaceOptions(bareMetalServerID string, bareMetalServerNetworkInterfacePrototype BareMetalServerNetworkInterfacePrototypeIntf) *CreateBareMetalServerNetworkInterfaceOptions {
	return &CreateBareMetalServerNetworkInterfaceOptions{
		BareMetalServerID:                        core.StringPtr(bareMetalServerID),
		BareMetalServerNetworkInterfacePrototype: bareMetalServerNetworkInterfacePrototype,
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *CreateBareMetalServerNetworkInterfaceOptions) SetBareMetalServerID(bareMetalServerID string) *CreateBareMetalServerNetworkInterfaceOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetBareMetalServerNetworkInterfacePrototype : Allow user to set BareMetalServerNetworkInterfacePrototype
func (_options *CreateBareMetalServerNetworkInterfaceOptions) SetBareMetalServerNetworkInterfacePrototype(bareMetalServerNetworkInterfacePrototype BareMetalServerNetworkInterfacePrototypeIntf) *CreateBareMetalServerNetworkInterfaceOptions {
	_options.BareMetalServerNetworkInterfacePrototype = bareMetalServerNetworkInterfacePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateBareMetalServerNetworkInterfaceOptions) SetHeaders(param map[string]string) *CreateBareMetalServerNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// CreateBareMetalServerOptions : The CreateBareMetalServer options.
type CreateBareMetalServerOptions struct {
	// The bare metal server prototype object.
	BareMetalServerPrototype BareMetalServerPrototypeIntf `json:"BareMetalServerPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateBareMetalServerOptions : Instantiate CreateBareMetalServerOptions
func (*VpcV1) NewCreateBareMetalServerOptions(bareMetalServerPrototype BareMetalServerPrototypeIntf) *CreateBareMetalServerOptions {
	return &CreateBareMetalServerOptions{
		BareMetalServerPrototype: bareMetalServerPrototype,
	}
}

// SetBareMetalServerPrototype : Allow user to set BareMetalServerPrototype
func (_options *CreateBareMetalServerOptions) SetBareMetalServerPrototype(bareMetalServerPrototype BareMetalServerPrototypeIntf) *CreateBareMetalServerOptions {
	_options.BareMetalServerPrototype = bareMetalServerPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateBareMetalServerOptions) SetHeaders(param map[string]string) *CreateBareMetalServerOptions {
	options.Headers = param
	return options
}

// CreateClusterNetworkAttachmentOptions : The CreateClusterNetworkAttachment options.
type CreateClusterNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// A cluster network interface for the instance cluster network attachment. This can be
	// specified using an existing cluster network interface that does not already have a
	// `target`, or a prototype object for a new cluster network interface.
	//
	// This instance must reside in the same VPC as the specified cluster network interface. The
	// cluster network interface must reside in the same cluster network as the
	// `cluster_network_interface` of any other `cluster_network_attachments` for this instance.
	ClusterNetworkInterface InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceIntf `json:"cluster_network_interface" validate:"required"`

	// The instance cluster network attachment to insert this instance cluster network attachment
	// immediately before.
	//
	// If unspecified, this instance cluster network attachment will be inserted after all
	// existing instance cluster network attachments.
	Before InstanceClusterNetworkAttachmentBeforePrototypeIntf `json:"before,omitempty"`

	// The name for this cluster network attachment. Names must be unique within the instance the cluster network
	// attachment resides in. If unspecified, the name will be a hyphenated list of randomly-selected words. Names starting
	// with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateClusterNetworkAttachmentOptions : Instantiate CreateClusterNetworkAttachmentOptions
func (*VpcV1) NewCreateClusterNetworkAttachmentOptions(instanceID string, clusterNetworkInterface InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceIntf) *CreateClusterNetworkAttachmentOptions {
	return &CreateClusterNetworkAttachmentOptions{
		InstanceID:              core.StringPtr(instanceID),
		ClusterNetworkInterface: clusterNetworkInterface,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *CreateClusterNetworkAttachmentOptions) SetInstanceID(instanceID string) *CreateClusterNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetClusterNetworkInterface : Allow user to set ClusterNetworkInterface
func (_options *CreateClusterNetworkAttachmentOptions) SetClusterNetworkInterface(clusterNetworkInterface InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceIntf) *CreateClusterNetworkAttachmentOptions {
	_options.ClusterNetworkInterface = clusterNetworkInterface
	return _options
}

// SetBefore : Allow user to set Before
func (_options *CreateClusterNetworkAttachmentOptions) SetBefore(before InstanceClusterNetworkAttachmentBeforePrototypeIntf) *CreateClusterNetworkAttachmentOptions {
	_options.Before = before
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateClusterNetworkAttachmentOptions) SetName(name string) *CreateClusterNetworkAttachmentOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateClusterNetworkAttachmentOptions) SetHeaders(param map[string]string) *CreateClusterNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// CreateClusterNetworkInterfaceOptions : The CreateClusterNetworkInterface options.
type CreateClusterNetworkInterfaceOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The name for this cluster network interface. The name must not be used by another interface in the cluster network.
	// Names beginning with `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified, the name
	// will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the cluster network interface. May be either
	// a cluster network subnet reserved IP identity, or a cluster network subnet reserved IP
	// prototype object which will be used to create a new cluster network subnet reserved IP.
	//
	// If a cluster network subnet reserved IP identity is provided, the specified cluster
	// network subnet reserved IP must be unbound.
	//
	// If a cluster network subnet reserved IP prototype object with an address is provided,
	// the address must be available on the cluster network interface's cluster network
	// subnet. If no address is specified, an available address on the cluster network subnet
	// will be automatically selected and reserved.
	PrimaryIP ClusterNetworkInterfacePrimaryIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The associated cluster network subnet. Required if `primary_ip` does not specify a cluster
	// network subnet reserved IP identity.
	Subnet ClusterNetworkSubnetIdentityIntf `json:"subnet,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateClusterNetworkInterfaceOptions : Instantiate CreateClusterNetworkInterfaceOptions
func (*VpcV1) NewCreateClusterNetworkInterfaceOptions(clusterNetworkID string) *CreateClusterNetworkInterfaceOptions {
	return &CreateClusterNetworkInterfaceOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *CreateClusterNetworkInterfaceOptions) SetClusterNetworkID(clusterNetworkID string) *CreateClusterNetworkInterfaceOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateClusterNetworkInterfaceOptions) SetName(name string) *CreateClusterNetworkInterfaceOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetPrimaryIP : Allow user to set PrimaryIP
func (_options *CreateClusterNetworkInterfaceOptions) SetPrimaryIP(primaryIP ClusterNetworkInterfacePrimaryIPPrototypeIntf) *CreateClusterNetworkInterfaceOptions {
	_options.PrimaryIP = primaryIP
	return _options
}

// SetSubnet : Allow user to set Subnet
func (_options *CreateClusterNetworkInterfaceOptions) SetSubnet(subnet ClusterNetworkSubnetIdentityIntf) *CreateClusterNetworkInterfaceOptions {
	_options.Subnet = subnet
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateClusterNetworkInterfaceOptions) SetHeaders(param map[string]string) *CreateClusterNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// CreateClusterNetworkOptions : The CreateClusterNetwork options.
type CreateClusterNetworkOptions struct {
	// The profile to use for this cluster network.
	Profile ClusterNetworkProfileIdentityIntf `json:"profile" validate:"required"`

	// The VPC this cluster network will reside in.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The zone this cluster network will reside in. The zone must be listed
	// as supported on the specified cluster network profile.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// The name for this cluster network. The name must not be used by another cluster network in the region. Names
	// starting with `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified, the name will
	// be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	SubnetPrefixes []ClusterNetworkSubnetPrefixPrototype `json:"subnet_prefixes,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateClusterNetworkOptions : Instantiate CreateClusterNetworkOptions
func (*VpcV1) NewCreateClusterNetworkOptions(profile ClusterNetworkProfileIdentityIntf, vpc VPCIdentityIntf, zone ZoneIdentityIntf) *CreateClusterNetworkOptions {
	return &CreateClusterNetworkOptions{
		Profile: profile,
		VPC:     vpc,
		Zone:    zone,
	}
}

// SetProfile : Allow user to set Profile
func (_options *CreateClusterNetworkOptions) SetProfile(profile ClusterNetworkProfileIdentityIntf) *CreateClusterNetworkOptions {
	_options.Profile = profile
	return _options
}

// SetVPC : Allow user to set VPC
func (_options *CreateClusterNetworkOptions) SetVPC(vpc VPCIdentityIntf) *CreateClusterNetworkOptions {
	_options.VPC = vpc
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreateClusterNetworkOptions) SetZone(zone ZoneIdentityIntf) *CreateClusterNetworkOptions {
	_options.Zone = zone
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateClusterNetworkOptions) SetName(name string) *CreateClusterNetworkOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateClusterNetworkOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateClusterNetworkOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetSubnetPrefixes : Allow user to set SubnetPrefixes
func (_options *CreateClusterNetworkOptions) SetSubnetPrefixes(subnetPrefixes []ClusterNetworkSubnetPrefixPrototype) *CreateClusterNetworkOptions {
	_options.SubnetPrefixes = subnetPrefixes
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateClusterNetworkOptions) SetHeaders(param map[string]string) *CreateClusterNetworkOptions {
	options.Headers = param
	return options
}

// CreateClusterNetworkSubnetOptions : The CreateClusterNetworkSubnet options.
type CreateClusterNetworkSubnetOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet prototype object.
	ClusterNetworkSubnetPrototype ClusterNetworkSubnetPrototypeIntf `json:"ClusterNetworkSubnetPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateClusterNetworkSubnetOptions : Instantiate CreateClusterNetworkSubnetOptions
func (*VpcV1) NewCreateClusterNetworkSubnetOptions(clusterNetworkID string, clusterNetworkSubnetPrototype ClusterNetworkSubnetPrototypeIntf) *CreateClusterNetworkSubnetOptions {
	return &CreateClusterNetworkSubnetOptions{
		ClusterNetworkID:              core.StringPtr(clusterNetworkID),
		ClusterNetworkSubnetPrototype: clusterNetworkSubnetPrototype,
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *CreateClusterNetworkSubnetOptions) SetClusterNetworkID(clusterNetworkID string) *CreateClusterNetworkSubnetOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkSubnetPrototype : Allow user to set ClusterNetworkSubnetPrototype
func (_options *CreateClusterNetworkSubnetOptions) SetClusterNetworkSubnetPrototype(clusterNetworkSubnetPrototype ClusterNetworkSubnetPrototypeIntf) *CreateClusterNetworkSubnetOptions {
	_options.ClusterNetworkSubnetPrototype = clusterNetworkSubnetPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateClusterNetworkSubnetOptions) SetHeaders(param map[string]string) *CreateClusterNetworkSubnetOptions {
	options.Headers = param
	return options
}

// CreateClusterNetworkSubnetReservedIPOptions : The CreateClusterNetworkSubnetReservedIP options.
type CreateClusterNetworkSubnetReservedIPOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ClusterNetworkSubnetID *string `json:"cluster_network_subnet_id" validate:"required,ne="`

	// The IP address to reserve, which must not already be reserved on the subnet.
	//
	// If unspecified, an available address on the subnet will automatically be selected.
	Address *string `json:"address,omitempty"`

	// The name for this cluster network subnet reserved IP. The name must not be used by another reserved IP in the
	// cluster network subnet. Names starting with `ibm-` are reserved for provider-owned resources, and are not allowed.
	// If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateClusterNetworkSubnetReservedIPOptions : Instantiate CreateClusterNetworkSubnetReservedIPOptions
func (*VpcV1) NewCreateClusterNetworkSubnetReservedIPOptions(clusterNetworkID string, clusterNetworkSubnetID string) *CreateClusterNetworkSubnetReservedIPOptions {
	return &CreateClusterNetworkSubnetReservedIPOptions{
		ClusterNetworkID:       core.StringPtr(clusterNetworkID),
		ClusterNetworkSubnetID: core.StringPtr(clusterNetworkSubnetID),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *CreateClusterNetworkSubnetReservedIPOptions) SetClusterNetworkID(clusterNetworkID string) *CreateClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkSubnetID : Allow user to set ClusterNetworkSubnetID
func (_options *CreateClusterNetworkSubnetReservedIPOptions) SetClusterNetworkSubnetID(clusterNetworkSubnetID string) *CreateClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkSubnetID = core.StringPtr(clusterNetworkSubnetID)
	return _options
}

// SetAddress : Allow user to set Address
func (_options *CreateClusterNetworkSubnetReservedIPOptions) SetAddress(address string) *CreateClusterNetworkSubnetReservedIPOptions {
	_options.Address = core.StringPtr(address)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateClusterNetworkSubnetReservedIPOptions) SetName(name string) *CreateClusterNetworkSubnetReservedIPOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateClusterNetworkSubnetReservedIPOptions) SetHeaders(param map[string]string) *CreateClusterNetworkSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// CreateDedicatedHostGroupOptions : The CreateDedicatedHostGroup options.
type CreateDedicatedHostGroupOptions struct {
	// The dedicated host profile class for hosts in this group.
	Class *string `json:"class" validate:"required"`

	// The dedicated host profile family for hosts in this group.
	Family *string `json:"family" validate:"required"`

	// The zone this dedicated host group will reside in.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// The name for this dedicated host group. The name must not be used by another dedicated host group in the region. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateDedicatedHostGroupOptions.Family property.
// The dedicated host profile family for hosts in this group.
const (
	CreateDedicatedHostGroupOptionsFamilyBalancedConst = "balanced"
	CreateDedicatedHostGroupOptionsFamilyComputeConst  = "compute"
	CreateDedicatedHostGroupOptionsFamilyMemoryConst   = "memory"
)

// NewCreateDedicatedHostGroupOptions : Instantiate CreateDedicatedHostGroupOptions
func (*VpcV1) NewCreateDedicatedHostGroupOptions(class string, family string, zone ZoneIdentityIntf) *CreateDedicatedHostGroupOptions {
	return &CreateDedicatedHostGroupOptions{
		Class:  core.StringPtr(class),
		Family: core.StringPtr(family),
		Zone:   zone,
	}
}

// SetClass : Allow user to set Class
func (_options *CreateDedicatedHostGroupOptions) SetClass(class string) *CreateDedicatedHostGroupOptions {
	_options.Class = core.StringPtr(class)
	return _options
}

// SetFamily : Allow user to set Family
func (_options *CreateDedicatedHostGroupOptions) SetFamily(family string) *CreateDedicatedHostGroupOptions {
	_options.Family = core.StringPtr(family)
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreateDedicatedHostGroupOptions) SetZone(zone ZoneIdentityIntf) *CreateDedicatedHostGroupOptions {
	_options.Zone = zone
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateDedicatedHostGroupOptions) SetName(name string) *CreateDedicatedHostGroupOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateDedicatedHostGroupOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateDedicatedHostGroupOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateDedicatedHostGroupOptions) SetHeaders(param map[string]string) *CreateDedicatedHostGroupOptions {
	options.Headers = param
	return options
}

// CreateDedicatedHostOptions : The CreateDedicatedHost options.
type CreateDedicatedHostOptions struct {
	// The dedicated host prototype object.
	DedicatedHostPrototype DedicatedHostPrototypeIntf `json:"DedicatedHostPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateDedicatedHostOptions : Instantiate CreateDedicatedHostOptions
func (*VpcV1) NewCreateDedicatedHostOptions(dedicatedHostPrototype DedicatedHostPrototypeIntf) *CreateDedicatedHostOptions {
	return &CreateDedicatedHostOptions{
		DedicatedHostPrototype: dedicatedHostPrototype,
	}
}

// SetDedicatedHostPrototype : Allow user to set DedicatedHostPrototype
func (_options *CreateDedicatedHostOptions) SetDedicatedHostPrototype(dedicatedHostPrototype DedicatedHostPrototypeIntf) *CreateDedicatedHostOptions {
	_options.DedicatedHostPrototype = dedicatedHostPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateDedicatedHostOptions) SetHeaders(param map[string]string) *CreateDedicatedHostOptions {
	options.Headers = param
	return options
}

// CreateEndpointGatewayOptions : The CreateEndpointGateway options.
type CreateEndpointGatewayOptions struct {
	// The target to use for this endpoint gateway. The target:
	// - Must not already be the target of another endpoint gateway in the VPC
	// - Must not have a service endpoint that overlaps with any `service_endpoints` of
	//   another endpoint gateway in the VPC.
	//
	// If `allow_dns_resolution_binding` is `true`, then there must not be another endpoint
	// gateway with `allow_dns_resolution_binding` set to `true` in the [DNS
	// sharing](/docs/vpc?topic=vpc-vpe-dns-sharing) connected topology that:
	// - Has the same `target` as this endpoint gateway
	// - Has `service_endpoints` that overlap with the `service_endpoints` for this endpoint
	//   gateway.
	Target EndpointGatewayTargetPrototypeIntf `json:"target" validate:"required"`

	// The VPC this endpoint gateway will reside in.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// Indicates whether to allow DNS resolution for this endpoint gateway when the VPC this endpoint gateway resides in
	// has a DNS resolution binding to a VPC with `dns.enable_hub` set to `true`.
	//
	// If `true`, then there must not be another endpoint gateway with
	// `allow_dns_resolution_binding` set to `true` in the [DNS sharing](/docs/vpc?topic=vpc-vpe-dns-sharing) connected
	// topology that:
	// - Has the same `target` as this endpoint gateway
	// - Has `service_endpoints` that overlap with the `service_endpoints` for this endpoint
	//   gateway.
	//
	// Must be `true` if the VPC this endpoint gateway resides in has `dns.enable_hub` set to
	// `true`.
	AllowDnsResolutionBinding *bool `json:"allow_dns_resolution_binding,omitempty"`

	// The reserved IPs to bind to this endpoint gateway. At most one reserved IP per zone is allowed.
	Ips []EndpointGatewayReservedIPIntf `json:"ips,omitempty"`

	// The name for this endpoint gateway. The name must not be used by another endpoint gateway in the VPC. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The security groups to use for this endpoint gateway. If unspecified, the VPC's default security group is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateEndpointGatewayOptions : Instantiate CreateEndpointGatewayOptions
func (*VpcV1) NewCreateEndpointGatewayOptions(target EndpointGatewayTargetPrototypeIntf, vpc VPCIdentityIntf) *CreateEndpointGatewayOptions {
	return &CreateEndpointGatewayOptions{
		Target: target,
		VPC:    vpc,
	}
}

// SetTarget : Allow user to set Target
func (_options *CreateEndpointGatewayOptions) SetTarget(target EndpointGatewayTargetPrototypeIntf) *CreateEndpointGatewayOptions {
	_options.Target = target
	return _options
}

// SetVPC : Allow user to set VPC
func (_options *CreateEndpointGatewayOptions) SetVPC(vpc VPCIdentityIntf) *CreateEndpointGatewayOptions {
	_options.VPC = vpc
	return _options
}

// SetAllowDnsResolutionBinding : Allow user to set AllowDnsResolutionBinding
func (_options *CreateEndpointGatewayOptions) SetAllowDnsResolutionBinding(allowDnsResolutionBinding bool) *CreateEndpointGatewayOptions {
	_options.AllowDnsResolutionBinding = core.BoolPtr(allowDnsResolutionBinding)
	return _options
}

// SetIps : Allow user to set Ips
func (_options *CreateEndpointGatewayOptions) SetIps(ips []EndpointGatewayReservedIPIntf) *CreateEndpointGatewayOptions {
	_options.Ips = ips
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateEndpointGatewayOptions) SetName(name string) *CreateEndpointGatewayOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateEndpointGatewayOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateEndpointGatewayOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetSecurityGroups : Allow user to set SecurityGroups
func (_options *CreateEndpointGatewayOptions) SetSecurityGroups(securityGroups []SecurityGroupIdentityIntf) *CreateEndpointGatewayOptions {
	_options.SecurityGroups = securityGroups
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateEndpointGatewayOptions) SetHeaders(param map[string]string) *CreateEndpointGatewayOptions {
	options.Headers = param
	return options
}

// CreateFloatingIPOptions : The CreateFloatingIP options.
type CreateFloatingIPOptions struct {
	// The floating IP prototype object.
	FloatingIPPrototype FloatingIPPrototypeIntf `json:"FloatingIPPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateFloatingIPOptions : Instantiate CreateFloatingIPOptions
func (*VpcV1) NewCreateFloatingIPOptions(floatingIPPrototype FloatingIPPrototypeIntf) *CreateFloatingIPOptions {
	return &CreateFloatingIPOptions{
		FloatingIPPrototype: floatingIPPrototype,
	}
}

// SetFloatingIPPrototype : Allow user to set FloatingIPPrototype
func (_options *CreateFloatingIPOptions) SetFloatingIPPrototype(floatingIPPrototype FloatingIPPrototypeIntf) *CreateFloatingIPOptions {
	_options.FloatingIPPrototype = floatingIPPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateFloatingIPOptions) SetHeaders(param map[string]string) *CreateFloatingIPOptions {
	options.Headers = param
	return options
}

// CreateFlowLogCollectorOptions : The CreateFlowLogCollector options.
type CreateFlowLogCollectorOptions struct {
	// The Cloud Object Storage bucket where the collected flows will be logged.
	// The bucket must exist and an IAM service authorization must grant
	// `IBM Cloud Flow Logs` resources of `VPC Infrastructure Services` writer
	// access to the bucket. For more information, see [Creating a flow log
	// collector](https://cloud.ibm.com/docs/vpc?topic=vpc-ordering-flow-log-collector).
	StorageBucket LegacyCloudObjectStorageBucketIdentityIntf `json:"storage_bucket" validate:"required"`

	// The target this collector will collect flow logs for.
	//
	// If the target is an instance, subnet, or VPC, flow logs will not be collected for any
	// instance network attachments, virtual network interfaces or instance network interfaces
	// within the target that are themselves the target of a more specific flow log collector.
	//
	// The target must not be a virtual network interface that is attached to a bare metal server
	// network attachment or to a file share mount target.
	Target FlowLogCollectorTargetPrototypeIntf `json:"target" validate:"required"`

	// Indicates whether this collector will be active upon creation.
	Active *bool `json:"active,omitempty"`

	// The name for this flow log collector. The name must not be used by another flow log collector in the VPC. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateFlowLogCollectorOptions : Instantiate CreateFlowLogCollectorOptions
func (*VpcV1) NewCreateFlowLogCollectorOptions(storageBucket LegacyCloudObjectStorageBucketIdentityIntf, target FlowLogCollectorTargetPrototypeIntf) *CreateFlowLogCollectorOptions {
	return &CreateFlowLogCollectorOptions{
		StorageBucket: storageBucket,
		Target:        target,
	}
}

// SetStorageBucket : Allow user to set StorageBucket
func (_options *CreateFlowLogCollectorOptions) SetStorageBucket(storageBucket LegacyCloudObjectStorageBucketIdentityIntf) *CreateFlowLogCollectorOptions {
	_options.StorageBucket = storageBucket
	return _options
}

// SetTarget : Allow user to set Target
func (_options *CreateFlowLogCollectorOptions) SetTarget(target FlowLogCollectorTargetPrototypeIntf) *CreateFlowLogCollectorOptions {
	_options.Target = target
	return _options
}

// SetActive : Allow user to set Active
func (_options *CreateFlowLogCollectorOptions) SetActive(active bool) *CreateFlowLogCollectorOptions {
	_options.Active = core.BoolPtr(active)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateFlowLogCollectorOptions) SetName(name string) *CreateFlowLogCollectorOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateFlowLogCollectorOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateFlowLogCollectorOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateFlowLogCollectorOptions) SetHeaders(param map[string]string) *CreateFlowLogCollectorOptions {
	options.Headers = param
	return options
}

// CreateIkePolicyOptions : The CreateIkePolicy options.
type CreateIkePolicyOptions struct {
	// The authentication algorithm.
	AuthenticationAlgorithm *string `json:"authentication_algorithm" validate:"required"`

	// The Diffie-Hellman group.
	DhGroup *int64 `json:"dh_group" validate:"required"`

	// The encryption algorithm.
	EncryptionAlgorithm *string `json:"encryption_algorithm" validate:"required"`

	// The IKE protocol version.
	IkeVersion *int64 `json:"ike_version" validate:"required"`

	// The key lifetime in seconds.
	KeyLifetime *int64 `json:"key_lifetime,omitempty"`

	// The name for this IKE policy. The name must not be used by another IKE policies in the region. If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateIkePolicyOptions.AuthenticationAlgorithm property.
// The authentication algorithm.
const (
	CreateIkePolicyOptionsAuthenticationAlgorithmSha256Const = "sha256"
	CreateIkePolicyOptionsAuthenticationAlgorithmSha384Const = "sha384"
	CreateIkePolicyOptionsAuthenticationAlgorithmSha512Const = "sha512"
)

// Constants associated with the CreateIkePolicyOptions.EncryptionAlgorithm property.
// The encryption algorithm.
const (
	CreateIkePolicyOptionsEncryptionAlgorithmAes128Const = "aes128"
	CreateIkePolicyOptionsEncryptionAlgorithmAes192Const = "aes192"
	CreateIkePolicyOptionsEncryptionAlgorithmAes256Const = "aes256"
)

// NewCreateIkePolicyOptions : Instantiate CreateIkePolicyOptions
func (*VpcV1) NewCreateIkePolicyOptions(authenticationAlgorithm string, dhGroup int64, encryptionAlgorithm string, ikeVersion int64) *CreateIkePolicyOptions {
	return &CreateIkePolicyOptions{
		AuthenticationAlgorithm: core.StringPtr(authenticationAlgorithm),
		DhGroup:                 core.Int64Ptr(dhGroup),
		EncryptionAlgorithm:     core.StringPtr(encryptionAlgorithm),
		IkeVersion:              core.Int64Ptr(ikeVersion),
	}
}

// SetAuthenticationAlgorithm : Allow user to set AuthenticationAlgorithm
func (_options *CreateIkePolicyOptions) SetAuthenticationAlgorithm(authenticationAlgorithm string) *CreateIkePolicyOptions {
	_options.AuthenticationAlgorithm = core.StringPtr(authenticationAlgorithm)
	return _options
}

// SetDhGroup : Allow user to set DhGroup
func (_options *CreateIkePolicyOptions) SetDhGroup(dhGroup int64) *CreateIkePolicyOptions {
	_options.DhGroup = core.Int64Ptr(dhGroup)
	return _options
}

// SetEncryptionAlgorithm : Allow user to set EncryptionAlgorithm
func (_options *CreateIkePolicyOptions) SetEncryptionAlgorithm(encryptionAlgorithm string) *CreateIkePolicyOptions {
	_options.EncryptionAlgorithm = core.StringPtr(encryptionAlgorithm)
	return _options
}

// SetIkeVersion : Allow user to set IkeVersion
func (_options *CreateIkePolicyOptions) SetIkeVersion(ikeVersion int64) *CreateIkePolicyOptions {
	_options.IkeVersion = core.Int64Ptr(ikeVersion)
	return _options
}

// SetKeyLifetime : Allow user to set KeyLifetime
func (_options *CreateIkePolicyOptions) SetKeyLifetime(keyLifetime int64) *CreateIkePolicyOptions {
	_options.KeyLifetime = core.Int64Ptr(keyLifetime)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateIkePolicyOptions) SetName(name string) *CreateIkePolicyOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateIkePolicyOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateIkePolicyOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateIkePolicyOptions) SetHeaders(param map[string]string) *CreateIkePolicyOptions {
	options.Headers = param
	return options
}

// CreateImageExportJobOptions : The CreateImageExportJob options.
type CreateImageExportJobOptions struct {
	// The image identifier.
	ImageID *string `json:"image_id" validate:"required,ne="`

	// The Cloud Object Storage bucket to export the image to. The bucket must exist and an IAM
	// service authorization must grant `Image Service for VPC` of
	// `VPC Infrastructure Services` writer access to the bucket.
	StorageBucket CloudObjectStorageBucketIdentityIntf `json:"storage_bucket" validate:"required"`

	// The format to use for the exported image. If the image is encrypted, only `qcow2` is supported.
	Format *string `json:"format,omitempty"`

	// The name for this image export job. The name must not be used by another export job for the image. If unspecified,
	// the name will be a hyphenated list of randomly-selected words prefixed with the first 16 characters of the parent
	// image name.
	//
	// The exported image object name in Cloud Object Storage (`storage_object.name` in the response) will be based on this
	// name. The object name will be unique within the bucket.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateImageExportJobOptions.Format property.
// The format to use for the exported image. If the image is encrypted, only `qcow2` is supported.
const (
	CreateImageExportJobOptionsFormatQcow2Const = "qcow2"
	CreateImageExportJobOptionsFormatVhdConst   = "vhd"
)

// NewCreateImageExportJobOptions : Instantiate CreateImageExportJobOptions
func (*VpcV1) NewCreateImageExportJobOptions(imageID string, storageBucket CloudObjectStorageBucketIdentityIntf) *CreateImageExportJobOptions {
	return &CreateImageExportJobOptions{
		ImageID:       core.StringPtr(imageID),
		StorageBucket: storageBucket,
	}
}

// SetImageID : Allow user to set ImageID
func (_options *CreateImageExportJobOptions) SetImageID(imageID string) *CreateImageExportJobOptions {
	_options.ImageID = core.StringPtr(imageID)
	return _options
}

// SetStorageBucket : Allow user to set StorageBucket
func (_options *CreateImageExportJobOptions) SetStorageBucket(storageBucket CloudObjectStorageBucketIdentityIntf) *CreateImageExportJobOptions {
	_options.StorageBucket = storageBucket
	return _options
}

// SetFormat : Allow user to set Format
func (_options *CreateImageExportJobOptions) SetFormat(format string) *CreateImageExportJobOptions {
	_options.Format = core.StringPtr(format)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateImageExportJobOptions) SetName(name string) *CreateImageExportJobOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateImageExportJobOptions) SetHeaders(param map[string]string) *CreateImageExportJobOptions {
	options.Headers = param
	return options
}

// CreateImageOptions : The CreateImage options.
type CreateImageOptions struct {
	// The image prototype object.
	ImagePrototype ImagePrototypeIntf `json:"ImagePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateImageOptions : Instantiate CreateImageOptions
func (*VpcV1) NewCreateImageOptions(imagePrototype ImagePrototypeIntf) *CreateImageOptions {
	return &CreateImageOptions{
		ImagePrototype: imagePrototype,
	}
}

// SetImagePrototype : Allow user to set ImagePrototype
func (_options *CreateImageOptions) SetImagePrototype(imagePrototype ImagePrototypeIntf) *CreateImageOptions {
	_options.ImagePrototype = imagePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateImageOptions) SetHeaders(param map[string]string) *CreateImageOptions {
	options.Headers = param
	return options
}

// CreateInstanceActionOptions : The CreateInstanceAction options.
type CreateInstanceActionOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The type of action.
	Type *string `json:"type" validate:"required"`

	// If set to true, the action will be forced immediately, and all queued actions deleted. Ignored for the start action.
	Force *bool `json:"force,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateInstanceActionOptions.Type property.
// The type of action.
const (
	CreateInstanceActionOptionsTypeRebootConst = "reboot"
	CreateInstanceActionOptionsTypeStartConst  = "start"
	CreateInstanceActionOptionsTypeStopConst   = "stop"
)

// NewCreateInstanceActionOptions : Instantiate CreateInstanceActionOptions
func (*VpcV1) NewCreateInstanceActionOptions(instanceID string, typeVar string) *CreateInstanceActionOptions {
	return &CreateInstanceActionOptions{
		InstanceID: core.StringPtr(instanceID),
		Type:       core.StringPtr(typeVar),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *CreateInstanceActionOptions) SetInstanceID(instanceID string) *CreateInstanceActionOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetType : Allow user to set Type
func (_options *CreateInstanceActionOptions) SetType(typeVar string) *CreateInstanceActionOptions {
	_options.Type = core.StringPtr(typeVar)
	return _options
}

// SetForce : Allow user to set Force
func (_options *CreateInstanceActionOptions) SetForce(force bool) *CreateInstanceActionOptions {
	_options.Force = core.BoolPtr(force)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceActionOptions) SetHeaders(param map[string]string) *CreateInstanceActionOptions {
	options.Headers = param
	return options
}

// CreateInstanceConsoleAccessTokenOptions : The CreateInstanceConsoleAccessToken options.
type CreateInstanceConsoleAccessTokenOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance console type for which this token may be used.
	ConsoleType *string `json:"console_type" validate:"required"`

	// Indicates whether to disconnect an existing serial console session as the serial console cannot be shared.  This has
	// no effect on VNC consoles.
	Force *bool `json:"force,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateInstanceConsoleAccessTokenOptions.ConsoleType property.
// The instance console type for which this token may be used.
const (
	CreateInstanceConsoleAccessTokenOptionsConsoleTypeSerialConst = "serial"
	CreateInstanceConsoleAccessTokenOptionsConsoleTypeVncConst    = "vnc"
)

// NewCreateInstanceConsoleAccessTokenOptions : Instantiate CreateInstanceConsoleAccessTokenOptions
func (*VpcV1) NewCreateInstanceConsoleAccessTokenOptions(instanceID string, consoleType string) *CreateInstanceConsoleAccessTokenOptions {
	return &CreateInstanceConsoleAccessTokenOptions{
		InstanceID:  core.StringPtr(instanceID),
		ConsoleType: core.StringPtr(consoleType),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *CreateInstanceConsoleAccessTokenOptions) SetInstanceID(instanceID string) *CreateInstanceConsoleAccessTokenOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetConsoleType : Allow user to set ConsoleType
func (_options *CreateInstanceConsoleAccessTokenOptions) SetConsoleType(consoleType string) *CreateInstanceConsoleAccessTokenOptions {
	_options.ConsoleType = core.StringPtr(consoleType)
	return _options
}

// SetForce : Allow user to set Force
func (_options *CreateInstanceConsoleAccessTokenOptions) SetForce(force bool) *CreateInstanceConsoleAccessTokenOptions {
	_options.Force = core.BoolPtr(force)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceConsoleAccessTokenOptions) SetHeaders(param map[string]string) *CreateInstanceConsoleAccessTokenOptions {
	options.Headers = param
	return options
}

// CreateInstanceGroupManagerActionOptions : The CreateInstanceGroupManagerAction options.
type CreateInstanceGroupManagerActionOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager action prototype object.
	InstanceGroupManagerActionPrototype InstanceGroupManagerActionPrototypeIntf `json:"InstanceGroupManagerActionPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceGroupManagerActionOptions : Instantiate CreateInstanceGroupManagerActionOptions
func (*VpcV1) NewCreateInstanceGroupManagerActionOptions(instanceGroupID string, instanceGroupManagerID string, instanceGroupManagerActionPrototype InstanceGroupManagerActionPrototypeIntf) *CreateInstanceGroupManagerActionOptions {
	return &CreateInstanceGroupManagerActionOptions{
		InstanceGroupID:                     core.StringPtr(instanceGroupID),
		InstanceGroupManagerID:              core.StringPtr(instanceGroupManagerID),
		InstanceGroupManagerActionPrototype: instanceGroupManagerActionPrototype,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *CreateInstanceGroupManagerActionOptions) SetInstanceGroupID(instanceGroupID string) *CreateInstanceGroupManagerActionOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *CreateInstanceGroupManagerActionOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *CreateInstanceGroupManagerActionOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetInstanceGroupManagerActionPrototype : Allow user to set InstanceGroupManagerActionPrototype
func (_options *CreateInstanceGroupManagerActionOptions) SetInstanceGroupManagerActionPrototype(instanceGroupManagerActionPrototype InstanceGroupManagerActionPrototypeIntf) *CreateInstanceGroupManagerActionOptions {
	_options.InstanceGroupManagerActionPrototype = instanceGroupManagerActionPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceGroupManagerActionOptions) SetHeaders(param map[string]string) *CreateInstanceGroupManagerActionOptions {
	options.Headers = param
	return options
}

// CreateInstanceGroupManagerOptions : The CreateInstanceGroupManager options.
type CreateInstanceGroupManagerOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager prototype object.
	InstanceGroupManagerPrototype InstanceGroupManagerPrototypeIntf `json:"InstanceGroupManagerPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceGroupManagerOptions : Instantiate CreateInstanceGroupManagerOptions
func (*VpcV1) NewCreateInstanceGroupManagerOptions(instanceGroupID string, instanceGroupManagerPrototype InstanceGroupManagerPrototypeIntf) *CreateInstanceGroupManagerOptions {
	return &CreateInstanceGroupManagerOptions{
		InstanceGroupID:               core.StringPtr(instanceGroupID),
		InstanceGroupManagerPrototype: instanceGroupManagerPrototype,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *CreateInstanceGroupManagerOptions) SetInstanceGroupID(instanceGroupID string) *CreateInstanceGroupManagerOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerPrototype : Allow user to set InstanceGroupManagerPrototype
func (_options *CreateInstanceGroupManagerOptions) SetInstanceGroupManagerPrototype(instanceGroupManagerPrototype InstanceGroupManagerPrototypeIntf) *CreateInstanceGroupManagerOptions {
	_options.InstanceGroupManagerPrototype = instanceGroupManagerPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceGroupManagerOptions) SetHeaders(param map[string]string) *CreateInstanceGroupManagerOptions {
	options.Headers = param
	return options
}

// CreateInstanceGroupManagerPolicyOptions : The CreateInstanceGroupManagerPolicy options.
type CreateInstanceGroupManagerPolicyOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager policy prototype object.
	InstanceGroupManagerPolicyPrototype InstanceGroupManagerPolicyPrototypeIntf `json:"InstanceGroupManagerPolicyPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceGroupManagerPolicyOptions : Instantiate CreateInstanceGroupManagerPolicyOptions
func (*VpcV1) NewCreateInstanceGroupManagerPolicyOptions(instanceGroupID string, instanceGroupManagerID string, instanceGroupManagerPolicyPrototype InstanceGroupManagerPolicyPrototypeIntf) *CreateInstanceGroupManagerPolicyOptions {
	return &CreateInstanceGroupManagerPolicyOptions{
		InstanceGroupID:                     core.StringPtr(instanceGroupID),
		InstanceGroupManagerID:              core.StringPtr(instanceGroupManagerID),
		InstanceGroupManagerPolicyPrototype: instanceGroupManagerPolicyPrototype,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *CreateInstanceGroupManagerPolicyOptions) SetInstanceGroupID(instanceGroupID string) *CreateInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *CreateInstanceGroupManagerPolicyOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *CreateInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetInstanceGroupManagerPolicyPrototype : Allow user to set InstanceGroupManagerPolicyPrototype
func (_options *CreateInstanceGroupManagerPolicyOptions) SetInstanceGroupManagerPolicyPrototype(instanceGroupManagerPolicyPrototype InstanceGroupManagerPolicyPrototypeIntf) *CreateInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupManagerPolicyPrototype = instanceGroupManagerPolicyPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceGroupManagerPolicyOptions) SetHeaders(param map[string]string) *CreateInstanceGroupManagerPolicyOptions {
	options.Headers = param
	return options
}

// CreateInstanceGroupOptions : The CreateInstanceGroup options.
type CreateInstanceGroupOptions struct {
	// The instance template to use when creating new instances.
	//
	// The specified template must not have `default_trusted_profile.auto_link` set to `true`.
	InstanceTemplate InstanceTemplateIdentityIntf `json:"instance_template" validate:"required"`

	// The subnets to use when creating new instances.
	Subnets []SubnetIdentityIntf `json:"subnets" validate:"required"`

	// The port to use for new load balancer pool members created by this instance group. The load balancer pool member
	// will receive load balancer traffic on this port, unless the load balancer listener is using a port range. (Traffic
	// received on a listener using a port range will be sent to members using the same port the listener received it on.)
	//
	// This port will also be used for health checks unless the port property of
	// `health_monitor` property is specified.
	//
	// This property must be specified if and only if `load_balancer_pool` has been specified.
	ApplicationPort *int64 `json:"application_port,omitempty"`

	// The load balancer associated with the specified load balancer pool.
	// Required if `load_balancer_pool` is specified. The load balancer must have
	// `instance_groups_supported` set to `true`.
	LoadBalancer LoadBalancerIdentityIntf `json:"load_balancer,omitempty"`

	// If specified, this instance group will manage the load balancer pool. A pool member
	// will be created for each instance created by this group.  The specified load
	// balancer pool must not be used by another instance group in the VPC.
	//
	// If specified, `load_balancer` and `application_port` must also be specified.
	LoadBalancerPool LoadBalancerPoolIdentityIntf `json:"load_balancer_pool,omitempty"`

	// The number of instances in the instance group.
	MembershipCount *int64 `json:"membership_count,omitempty"`

	// The name for this instance group. The name must not be used by another instance group in the region. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceGroupOptions : Instantiate CreateInstanceGroupOptions
func (*VpcV1) NewCreateInstanceGroupOptions(instanceTemplate InstanceTemplateIdentityIntf, subnets []SubnetIdentityIntf) *CreateInstanceGroupOptions {
	return &CreateInstanceGroupOptions{
		InstanceTemplate: instanceTemplate,
		Subnets:          subnets,
	}
}

// SetInstanceTemplate : Allow user to set InstanceTemplate
func (_options *CreateInstanceGroupOptions) SetInstanceTemplate(instanceTemplate InstanceTemplateIdentityIntf) *CreateInstanceGroupOptions {
	_options.InstanceTemplate = instanceTemplate
	return _options
}

// SetSubnets : Allow user to set Subnets
func (_options *CreateInstanceGroupOptions) SetSubnets(subnets []SubnetIdentityIntf) *CreateInstanceGroupOptions {
	_options.Subnets = subnets
	return _options
}

// SetApplicationPort : Allow user to set ApplicationPort
func (_options *CreateInstanceGroupOptions) SetApplicationPort(applicationPort int64) *CreateInstanceGroupOptions {
	_options.ApplicationPort = core.Int64Ptr(applicationPort)
	return _options
}

// SetLoadBalancer : Allow user to set LoadBalancer
func (_options *CreateInstanceGroupOptions) SetLoadBalancer(loadBalancer LoadBalancerIdentityIntf) *CreateInstanceGroupOptions {
	_options.LoadBalancer = loadBalancer
	return _options
}

// SetLoadBalancerPool : Allow user to set LoadBalancerPool
func (_options *CreateInstanceGroupOptions) SetLoadBalancerPool(loadBalancerPool LoadBalancerPoolIdentityIntf) *CreateInstanceGroupOptions {
	_options.LoadBalancerPool = loadBalancerPool
	return _options
}

// SetMembershipCount : Allow user to set MembershipCount
func (_options *CreateInstanceGroupOptions) SetMembershipCount(membershipCount int64) *CreateInstanceGroupOptions {
	_options.MembershipCount = core.Int64Ptr(membershipCount)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateInstanceGroupOptions) SetName(name string) *CreateInstanceGroupOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateInstanceGroupOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateInstanceGroupOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceGroupOptions) SetHeaders(param map[string]string) *CreateInstanceGroupOptions {
	options.Headers = param
	return options
}

// CreateInstanceNetworkAttachmentOptions : The CreateInstanceNetworkAttachment options.
type CreateInstanceNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// A virtual network interface for the instance network attachment. This can be specified
	// using an existing virtual network interface, or a prototype object for a new virtual
	// network interface.
	//
	// If an existing virtual network interface is specified, `enable_infrastructure_nat` must be
	// `true`.
	VirtualNetworkInterface InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf `json:"virtual_network_interface" validate:"required"`

	// The name for this network attachment. Names must be unique within the instance the network attachment resides in. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceNetworkAttachmentOptions : Instantiate CreateInstanceNetworkAttachmentOptions
func (*VpcV1) NewCreateInstanceNetworkAttachmentOptions(instanceID string, virtualNetworkInterface InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf) *CreateInstanceNetworkAttachmentOptions {
	return &CreateInstanceNetworkAttachmentOptions{
		InstanceID:              core.StringPtr(instanceID),
		VirtualNetworkInterface: virtualNetworkInterface,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *CreateInstanceNetworkAttachmentOptions) SetInstanceID(instanceID string) *CreateInstanceNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetVirtualNetworkInterface : Allow user to set VirtualNetworkInterface
func (_options *CreateInstanceNetworkAttachmentOptions) SetVirtualNetworkInterface(virtualNetworkInterface InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf) *CreateInstanceNetworkAttachmentOptions {
	_options.VirtualNetworkInterface = virtualNetworkInterface
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateInstanceNetworkAttachmentOptions) SetName(name string) *CreateInstanceNetworkAttachmentOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceNetworkAttachmentOptions) SetHeaders(param map[string]string) *CreateInstanceNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// CreateInstanceNetworkInterfaceOptions : The CreateInstanceNetworkInterface options.
type CreateInstanceNetworkInterfaceOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The associated subnet.
	Subnet SubnetIdentityIntf `json:"subnet" validate:"required"`

	// Indicates whether source IP spoofing is allowed on this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// The name for the instance network interface. The name must not be used by another network interface on the virtual
	// server instance. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the instance network interface. This can be
	// specified using an existing reserved IP, or a prototype object for a new reserved IP.
	//
	// If an existing reserved IP or a prototype object with an address is specified, it must
	// be available on the instance network interface's subnet. Otherwise, an
	// available address on the subnet will be automatically selected and reserved.
	PrimaryIP NetworkInterfaceIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The security groups to use for this instance network interface. If unspecified, the VPC's default security group is
	// used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceNetworkInterfaceOptions : Instantiate CreateInstanceNetworkInterfaceOptions
func (*VpcV1) NewCreateInstanceNetworkInterfaceOptions(instanceID string, subnet SubnetIdentityIntf) *CreateInstanceNetworkInterfaceOptions {
	return &CreateInstanceNetworkInterfaceOptions{
		InstanceID: core.StringPtr(instanceID),
		Subnet:     subnet,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *CreateInstanceNetworkInterfaceOptions) SetInstanceID(instanceID string) *CreateInstanceNetworkInterfaceOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetSubnet : Allow user to set Subnet
func (_options *CreateInstanceNetworkInterfaceOptions) SetSubnet(subnet SubnetIdentityIntf) *CreateInstanceNetworkInterfaceOptions {
	_options.Subnet = subnet
	return _options
}

// SetAllowIPSpoofing : Allow user to set AllowIPSpoofing
func (_options *CreateInstanceNetworkInterfaceOptions) SetAllowIPSpoofing(allowIPSpoofing bool) *CreateInstanceNetworkInterfaceOptions {
	_options.AllowIPSpoofing = core.BoolPtr(allowIPSpoofing)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateInstanceNetworkInterfaceOptions) SetName(name string) *CreateInstanceNetworkInterfaceOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetPrimaryIP : Allow user to set PrimaryIP
func (_options *CreateInstanceNetworkInterfaceOptions) SetPrimaryIP(primaryIP NetworkInterfaceIPPrototypeIntf) *CreateInstanceNetworkInterfaceOptions {
	_options.PrimaryIP = primaryIP
	return _options
}

// SetSecurityGroups : Allow user to set SecurityGroups
func (_options *CreateInstanceNetworkInterfaceOptions) SetSecurityGroups(securityGroups []SecurityGroupIdentityIntf) *CreateInstanceNetworkInterfaceOptions {
	_options.SecurityGroups = securityGroups
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceNetworkInterfaceOptions) SetHeaders(param map[string]string) *CreateInstanceNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// CreateInstanceOptions : The CreateInstance options.
type CreateInstanceOptions struct {
	// The instance prototype object.
	InstancePrototype InstancePrototypeIntf `json:"InstancePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceOptions : Instantiate CreateInstanceOptions
func (*VpcV1) NewCreateInstanceOptions(instancePrototype InstancePrototypeIntf) *CreateInstanceOptions {
	return &CreateInstanceOptions{
		InstancePrototype: instancePrototype,
	}
}

// SetInstancePrototype : Allow user to set InstancePrototype
func (_options *CreateInstanceOptions) SetInstancePrototype(instancePrototype InstancePrototypeIntf) *CreateInstanceOptions {
	_options.InstancePrototype = instancePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceOptions) SetHeaders(param map[string]string) *CreateInstanceOptions {
	options.Headers = param
	return options
}

// CreateInstanceTemplateOptions : The CreateInstanceTemplate options.
type CreateInstanceTemplateOptions struct {
	// The instance template prototype object.
	InstanceTemplatePrototype InstanceTemplatePrototypeIntf `json:"InstanceTemplatePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceTemplateOptions : Instantiate CreateInstanceTemplateOptions
func (*VpcV1) NewCreateInstanceTemplateOptions(instanceTemplatePrototype InstanceTemplatePrototypeIntf) *CreateInstanceTemplateOptions {
	return &CreateInstanceTemplateOptions{
		InstanceTemplatePrototype: instanceTemplatePrototype,
	}
}

// SetInstanceTemplatePrototype : Allow user to set InstanceTemplatePrototype
func (_options *CreateInstanceTemplateOptions) SetInstanceTemplatePrototype(instanceTemplatePrototype InstanceTemplatePrototypeIntf) *CreateInstanceTemplateOptions {
	_options.InstanceTemplatePrototype = instanceTemplatePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceTemplateOptions) SetHeaders(param map[string]string) *CreateInstanceTemplateOptions {
	options.Headers = param
	return options
}

// CreateInstanceVolumeAttachmentOptions : The CreateInstanceVolumeAttachment options.
type CreateInstanceVolumeAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The volume to use for this attachment. This can be specified as an existing unattached
	// volume, or a prototype object for a new volume.
	Volume VolumeAttachmentPrototypeVolumeIntf `json:"volume" validate:"required"`

	// Indicates whether deleting the instance will also delete the attached volume.
	DeleteVolumeOnInstanceDelete *bool `json:"delete_volume_on_instance_delete,omitempty"`

	// The name for this volume attachment. The name must not be used by another volume attachment on the instance. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateInstanceVolumeAttachmentOptions : Instantiate CreateInstanceVolumeAttachmentOptions
func (*VpcV1) NewCreateInstanceVolumeAttachmentOptions(instanceID string, volume VolumeAttachmentPrototypeVolumeIntf) *CreateInstanceVolumeAttachmentOptions {
	return &CreateInstanceVolumeAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		Volume:     volume,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *CreateInstanceVolumeAttachmentOptions) SetInstanceID(instanceID string) *CreateInstanceVolumeAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetVolume : Allow user to set Volume
func (_options *CreateInstanceVolumeAttachmentOptions) SetVolume(volume VolumeAttachmentPrototypeVolumeIntf) *CreateInstanceVolumeAttachmentOptions {
	_options.Volume = volume
	return _options
}

// SetDeleteVolumeOnInstanceDelete : Allow user to set DeleteVolumeOnInstanceDelete
func (_options *CreateInstanceVolumeAttachmentOptions) SetDeleteVolumeOnInstanceDelete(deleteVolumeOnInstanceDelete bool) *CreateInstanceVolumeAttachmentOptions {
	_options.DeleteVolumeOnInstanceDelete = core.BoolPtr(deleteVolumeOnInstanceDelete)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateInstanceVolumeAttachmentOptions) SetName(name string) *CreateInstanceVolumeAttachmentOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateInstanceVolumeAttachmentOptions) SetHeaders(param map[string]string) *CreateInstanceVolumeAttachmentOptions {
	options.Headers = param
	return options
}

// CreateIpsecPolicyOptions : The CreateIpsecPolicy options.
type CreateIpsecPolicyOptions struct {
	// The authentication algorithm
	//
	// Must be `disabled` if and only if the `encryption_algorithm` is `aes128gcm16`,
	// `aes192gcm16`, or `aes256gcm16`
	//
	// The `md5` and `sha1` algorithms have been deprecated.
	AuthenticationAlgorithm *string `json:"authentication_algorithm" validate:"required"`

	// The encryption algorithm
	//
	// The `authentication_algorithm` must be `disabled` if and only if
	// `encryption_algorithm` is `aes128gcm16`, `aes192gcm16`, or `aes256gcm16`
	//
	// The `triple_des` algorithm has been deprecated.
	EncryptionAlgorithm *string `json:"encryption_algorithm" validate:"required"`

	// The Perfect Forward Secrecy group.
	//
	// Groups `group_2` and `group_5` have been deprecated.
	Pfs *string `json:"pfs" validate:"required"`

	// The key lifetime in seconds.
	KeyLifetime *int64 `json:"key_lifetime,omitempty"`

	// The name for this IPsec policy. The name must not be used by another IPsec policies in the region. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateIpsecPolicyOptions.AuthenticationAlgorithm property.
// The authentication algorithm
//
// Must be `disabled` if and only if the `encryption_algorithm` is `aes128gcm16`,
// `aes192gcm16`, or `aes256gcm16`
//
// The `md5` and `sha1` algorithms have been deprecated.
const (
	CreateIpsecPolicyOptionsAuthenticationAlgorithmDisabledConst = "disabled"
	CreateIpsecPolicyOptionsAuthenticationAlgorithmSha256Const   = "sha256"
	CreateIpsecPolicyOptionsAuthenticationAlgorithmSha384Const   = "sha384"
	CreateIpsecPolicyOptionsAuthenticationAlgorithmSha512Const   = "sha512"
)

// Constants associated with the CreateIpsecPolicyOptions.EncryptionAlgorithm property.
// The encryption algorithm
//
// The `authentication_algorithm` must be `disabled` if and only if
// `encryption_algorithm` is `aes128gcm16`, `aes192gcm16`, or `aes256gcm16`
//
// The `triple_des` algorithm has been deprecated.
const (
	CreateIpsecPolicyOptionsEncryptionAlgorithmAes128Const      = "aes128"
	CreateIpsecPolicyOptionsEncryptionAlgorithmAes128gcm16Const = "aes128gcm16"
	CreateIpsecPolicyOptionsEncryptionAlgorithmAes192Const      = "aes192"
	CreateIpsecPolicyOptionsEncryptionAlgorithmAes192gcm16Const = "aes192gcm16"
	CreateIpsecPolicyOptionsEncryptionAlgorithmAes256Const      = "aes256"
	CreateIpsecPolicyOptionsEncryptionAlgorithmAes256gcm16Const = "aes256gcm16"
)

// Constants associated with the CreateIpsecPolicyOptions.Pfs property.
// The Perfect Forward Secrecy group.
//
// Groups `group_2` and `group_5` have been deprecated.
const (
	CreateIpsecPolicyOptionsPfsDisabledConst = "disabled"
	CreateIpsecPolicyOptionsPfsGroup14Const  = "group_14"
	CreateIpsecPolicyOptionsPfsGroup15Const  = "group_15"
	CreateIpsecPolicyOptionsPfsGroup16Const  = "group_16"
	CreateIpsecPolicyOptionsPfsGroup17Const  = "group_17"
	CreateIpsecPolicyOptionsPfsGroup18Const  = "group_18"
	CreateIpsecPolicyOptionsPfsGroup19Const  = "group_19"
	CreateIpsecPolicyOptionsPfsGroup20Const  = "group_20"
	CreateIpsecPolicyOptionsPfsGroup21Const  = "group_21"
	CreateIpsecPolicyOptionsPfsGroup22Const  = "group_22"
	CreateIpsecPolicyOptionsPfsGroup23Const  = "group_23"
	CreateIpsecPolicyOptionsPfsGroup24Const  = "group_24"
	CreateIpsecPolicyOptionsPfsGroup31Const  = "group_31"
)

// NewCreateIpsecPolicyOptions : Instantiate CreateIpsecPolicyOptions
func (*VpcV1) NewCreateIpsecPolicyOptions(authenticationAlgorithm string, encryptionAlgorithm string, pfs string) *CreateIpsecPolicyOptions {
	return &CreateIpsecPolicyOptions{
		AuthenticationAlgorithm: core.StringPtr(authenticationAlgorithm),
		EncryptionAlgorithm:     core.StringPtr(encryptionAlgorithm),
		Pfs:                     core.StringPtr(pfs),
	}
}

// SetAuthenticationAlgorithm : Allow user to set AuthenticationAlgorithm
func (_options *CreateIpsecPolicyOptions) SetAuthenticationAlgorithm(authenticationAlgorithm string) *CreateIpsecPolicyOptions {
	_options.AuthenticationAlgorithm = core.StringPtr(authenticationAlgorithm)
	return _options
}

// SetEncryptionAlgorithm : Allow user to set EncryptionAlgorithm
func (_options *CreateIpsecPolicyOptions) SetEncryptionAlgorithm(encryptionAlgorithm string) *CreateIpsecPolicyOptions {
	_options.EncryptionAlgorithm = core.StringPtr(encryptionAlgorithm)
	return _options
}

// SetPfs : Allow user to set Pfs
func (_options *CreateIpsecPolicyOptions) SetPfs(pfs string) *CreateIpsecPolicyOptions {
	_options.Pfs = core.StringPtr(pfs)
	return _options
}

// SetKeyLifetime : Allow user to set KeyLifetime
func (_options *CreateIpsecPolicyOptions) SetKeyLifetime(keyLifetime int64) *CreateIpsecPolicyOptions {
	_options.KeyLifetime = core.Int64Ptr(keyLifetime)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateIpsecPolicyOptions) SetName(name string) *CreateIpsecPolicyOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateIpsecPolicyOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateIpsecPolicyOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateIpsecPolicyOptions) SetHeaders(param map[string]string) *CreateIpsecPolicyOptions {
	options.Headers = param
	return options
}

// CreateKeyOptions : The CreateKey options.
type CreateKeyOptions struct {
	// The public SSH key to use, in OpenSSH format (consisting of three space-separated fields: the algorithm name,
	// base64-encoded key value, and a comment). The algorithm and comment fields may be omitted, as only the key field is
	// used.
	//
	// The key field must not match another key in the region.
	//
	// Keys of type `rsa` must be 2048 or 4096 bits in length (4096 is recommended). Keys of type `ed25519` must be 256
	// bits in length.
	PublicKey *string `json:"public_key" validate:"required"`

	// The name for this key. The name must not be used by another key in the region. If unspecified, the name will be a
	// hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The crypto-system for this key.
	Type *string `json:"type,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateKeyOptions.Type property.
// The crypto-system for this key.
const (
	CreateKeyOptionsTypeEd25519Const = "ed25519"
	CreateKeyOptionsTypeRsaConst     = "rsa"
)

// NewCreateKeyOptions : Instantiate CreateKeyOptions
func (*VpcV1) NewCreateKeyOptions(publicKey string) *CreateKeyOptions {
	return &CreateKeyOptions{
		PublicKey: core.StringPtr(publicKey),
	}
}

// SetPublicKey : Allow user to set PublicKey
func (_options *CreateKeyOptions) SetPublicKey(publicKey string) *CreateKeyOptions {
	_options.PublicKey = core.StringPtr(publicKey)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateKeyOptions) SetName(name string) *CreateKeyOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateKeyOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateKeyOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetType : Allow user to set Type
func (_options *CreateKeyOptions) SetType(typeVar string) *CreateKeyOptions {
	_options.Type = core.StringPtr(typeVar)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateKeyOptions) SetHeaders(param map[string]string) *CreateKeyOptions {
	options.Headers = param
	return options
}

// CreateLoadBalancerListenerOptions : The CreateLoadBalancerListener options.
type CreateLoadBalancerListenerOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener protocol. Each listener in the load balancer must have a non-overlapping port range and `protocol`
	// combination.
	//
	// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
	// `application` family support `tcp`, `http` and
	// `https`.
	//
	// Additional restrictions:
	// - If `default_pool` is set, the pool's protocol must match, or be compatible with
	//   the listener's protocol. At present, the compatible protocols are `http` and
	//   `https`.
	// - If `https_redirect` is set, the protocol must be `http`.
	Protocol *string `json:"protocol" validate:"required"`

	// If set to `true`, this listener will accept and forward PROXY protocol information. Supported by load balancers in
	// the `application` family (otherwise always `false`). Additional restrictions:
	// - If this listener has `https_redirect` specified, its `accept_proxy_protocol` value must
	//   match the `accept_proxy_protocol` value of the `https_redirect` listener.
	// - If this listener is the target of another listener's `https_redirect`, its
	//   `accept_proxy_protocol` value must match that listener's `accept_proxy_protocol` value.
	AcceptProxyProtocol *bool `json:"accept_proxy_protocol,omitempty"`

	// The certificate instance to use for SSL termination. The listener must have a
	// `protocol` of `https`.
	CertificateInstance CertificateInstanceIdentityIntf `json:"certificate_instance,omitempty"`

	// The concurrent connection limit for the listener. If reached, incoming connections may be queued or rejected.
	//
	// Supported for load balancers in the `application` family.
	//
	// If unspecified, the limit will be `15000` for load balancers in the `application` family.
	ConnectionLimit *int64 `json:"connection_limit,omitempty"`

	// The default pool for this listener. If `https_redirect` is specified, the
	// default pool will not be used.
	// If specified, the pool must:
	//
	// - Belong to this load balancer.
	// - Have the same `protocol` as this listener, or have a compatible protocol.
	//   At present, the compatible protocols are `http` and `https`.
	// - Not already be the `default_pool` for another listener.
	//
	// If unspecified, this listener will be created with no default pool, but one may be
	// subsequently set.
	DefaultPool LoadBalancerPoolIdentityIntf `json:"default_pool,omitempty"`

	// The target listener that requests will be redirected to if none of the listener's
	// `policies` match.
	//
	// If specified, this listener must have a `protocol` of `http`, and the target
	// listener must have a `protocol` of `https`.
	HTTPSRedirect *LoadBalancerListenerHTTPSRedirectPrototype `json:"https_redirect,omitempty"`

	// The idle connection timeout of the listener in seconds.
	//
	// Supported for load balancers in the `application` family.
	//
	// If unspecified, the timeout will be `50` for load balancers in the `application` family.
	IdleConnectionTimeout *int64 `json:"idle_connection_timeout,omitempty"`

	// The policy prototype objects for this listener. The load balancer must be in the
	// `application` family.
	Policies []LoadBalancerListenerPolicyPrototype `json:"policies,omitempty"`

	// The listener port number. Each listener in the load balancer must have a non-overlapping port range and `protocol`
	// combination. Protocol values of `tcp`, `http` and `https` share the TCP port space.
	//
	// If `port_min` is also specified, `port` must have the same value as `port_min`.
	Port *int64 `json:"port,omitempty"`

	// The inclusive upper bound of the range of ports used by this listener. Must not be less than `port_min`.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `65535`.
	//
	// The specified port range must not overlap with port ranges used by other listeners for this load balancer using the
	// same protocol. Protocol values of `tcp`, `http` and
	// `https` share the TCP port space.
	PortMax *int64 `json:"port_max,omitempty"`

	// The inclusive lower bound of the range of ports used by this listener. Must not be greater than `port_max`.
	//
	// If specified, `port_max` must also be specified, and must not be smaller. If unspecified, `port_max` must also be
	// unspecified.
	//
	// If `port` is also specified, `port_min` must have the same value as `port`.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `1`.
	//
	// The specified port range must not overlap with port ranges used by other listeners for this load balancer using the
	// same protocol. Protocol values of `tcp`, `http` and
	// `https` share the TCP port space.
	PortMin *int64 `json:"port_min,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateLoadBalancerListenerOptions.Protocol property.
// The listener protocol. Each listener in the load balancer must have a non-overlapping port range and `protocol`
// combination.
//
// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
// `application` family support `tcp`, `http` and
// `https`.
//
// Additional restrictions:
//   - If `default_pool` is set, the pool's protocol must match, or be compatible with
//     the listener's protocol. At present, the compatible protocols are `http` and
//     `https`.
//   - If `https_redirect` is set, the protocol must be `http`.
const (
	CreateLoadBalancerListenerOptionsProtocolHTTPConst  = "http"
	CreateLoadBalancerListenerOptionsProtocolHTTPSConst = "https"
	CreateLoadBalancerListenerOptionsProtocolTCPConst   = "tcp"
	CreateLoadBalancerListenerOptionsProtocolUDPConst   = "udp"
)

// NewCreateLoadBalancerListenerOptions : Instantiate CreateLoadBalancerListenerOptions
func (*VpcV1) NewCreateLoadBalancerListenerOptions(loadBalancerID string, protocol string) *CreateLoadBalancerListenerOptions {
	return &CreateLoadBalancerListenerOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		Protocol:       core.StringPtr(protocol),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *CreateLoadBalancerListenerOptions) SetLoadBalancerID(loadBalancerID string) *CreateLoadBalancerListenerOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetProtocol : Allow user to set Protocol
func (_options *CreateLoadBalancerListenerOptions) SetProtocol(protocol string) *CreateLoadBalancerListenerOptions {
	_options.Protocol = core.StringPtr(protocol)
	return _options
}

// SetAcceptProxyProtocol : Allow user to set AcceptProxyProtocol
func (_options *CreateLoadBalancerListenerOptions) SetAcceptProxyProtocol(acceptProxyProtocol bool) *CreateLoadBalancerListenerOptions {
	_options.AcceptProxyProtocol = core.BoolPtr(acceptProxyProtocol)
	return _options
}

// SetCertificateInstance : Allow user to set CertificateInstance
func (_options *CreateLoadBalancerListenerOptions) SetCertificateInstance(certificateInstance CertificateInstanceIdentityIntf) *CreateLoadBalancerListenerOptions {
	_options.CertificateInstance = certificateInstance
	return _options
}

// SetConnectionLimit : Allow user to set ConnectionLimit
func (_options *CreateLoadBalancerListenerOptions) SetConnectionLimit(connectionLimit int64) *CreateLoadBalancerListenerOptions {
	_options.ConnectionLimit = core.Int64Ptr(connectionLimit)
	return _options
}

// SetDefaultPool : Allow user to set DefaultPool
func (_options *CreateLoadBalancerListenerOptions) SetDefaultPool(defaultPool LoadBalancerPoolIdentityIntf) *CreateLoadBalancerListenerOptions {
	_options.DefaultPool = defaultPool
	return _options
}

// SetHTTPSRedirect : Allow user to set HTTPSRedirect
func (_options *CreateLoadBalancerListenerOptions) SetHTTPSRedirect(httpsRedirect *LoadBalancerListenerHTTPSRedirectPrototype) *CreateLoadBalancerListenerOptions {
	_options.HTTPSRedirect = httpsRedirect
	return _options
}

// SetIdleConnectionTimeout : Allow user to set IdleConnectionTimeout
func (_options *CreateLoadBalancerListenerOptions) SetIdleConnectionTimeout(idleConnectionTimeout int64) *CreateLoadBalancerListenerOptions {
	_options.IdleConnectionTimeout = core.Int64Ptr(idleConnectionTimeout)
	return _options
}

// SetPolicies : Allow user to set Policies
func (_options *CreateLoadBalancerListenerOptions) SetPolicies(policies []LoadBalancerListenerPolicyPrototype) *CreateLoadBalancerListenerOptions {
	_options.Policies = policies
	return _options
}

// SetPort : Allow user to set Port
func (_options *CreateLoadBalancerListenerOptions) SetPort(port int64) *CreateLoadBalancerListenerOptions {
	_options.Port = core.Int64Ptr(port)
	return _options
}

// SetPortMax : Allow user to set PortMax
func (_options *CreateLoadBalancerListenerOptions) SetPortMax(portMax int64) *CreateLoadBalancerListenerOptions {
	_options.PortMax = core.Int64Ptr(portMax)
	return _options
}

// SetPortMin : Allow user to set PortMin
func (_options *CreateLoadBalancerListenerOptions) SetPortMin(portMin int64) *CreateLoadBalancerListenerOptions {
	_options.PortMin = core.Int64Ptr(portMin)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateLoadBalancerListenerOptions) SetHeaders(param map[string]string) *CreateLoadBalancerListenerOptions {
	options.Headers = param
	return options
}

// CreateLoadBalancerListenerPolicyOptions : The CreateLoadBalancerListenerPolicy options.
type CreateLoadBalancerListenerPolicyOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy action:
	// - `forward_to_listener`: Requests will be forwarded to the specified
	//   `target` listener.
	// - `forward_to_pool`: Requests will be forwarded to the specified `target` pool.
	// - `https_redirect`: Requests will be redirected to the specified `target.listener`.
	//    This listener must have a `protocol` of `http`, and the target listener must
	//    have a `protocol` of `https`.
	// - `redirect`: Requests will be redirected to the specified `target.url`
	// - `reject`: Requests will be rejected with a `403` status code.
	Action *string `json:"action" validate:"required"`

	// The priority of the policy. The priority is unique across all policies for this load balancer listener. Lower value
	// indicates higher priority.
	Priority *int64 `json:"priority" validate:"required"`

	// The name for this policy. The name must not be used by another policy for the load balancer listener. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The rule prototype objects for this policy.
	Rules []LoadBalancerListenerPolicyRulePrototype `json:"rules,omitempty"`

	// - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity` in this
	//   load balancer to forward to.
	// - If `action` is `forward_to_pool`, use `LoadBalancerPoolIdentity` to specify a pool in
	//   this load balancer to forward to.
	// - If `action` is `https_redirect`, use
	//   `LoadBalancerListenerPolicyHTTPSRedirectPrototype` to specify a listener on this
	//   load balancer to redirect to.
	// - If `action` is `redirect`, use `LoadBalancerListenerPolicyRedirectURLPrototype`to
	//   specify a URL to redirect to.
	Target LoadBalancerListenerPolicyTargetPrototypeIntf `json:"target,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateLoadBalancerListenerPolicyOptions.Action property.
// The policy action:
//   - `forward_to_listener`: Requests will be forwarded to the specified
//     `target` listener.
//   - `forward_to_pool`: Requests will be forwarded to the specified `target` pool.
//   - `https_redirect`: Requests will be redirected to the specified `target.listener`.
//     This listener must have a `protocol` of `http`, and the target listener must
//     have a `protocol` of `https`.
//   - `redirect`: Requests will be redirected to the specified `target.url`
//   - `reject`: Requests will be rejected with a `403` status code.
const (
	CreateLoadBalancerListenerPolicyOptionsActionForwardToListenerConst = "forward_to_listener"
	CreateLoadBalancerListenerPolicyOptionsActionForwardToPoolConst     = "forward_to_pool"
	CreateLoadBalancerListenerPolicyOptionsActionHTTPSRedirectConst     = "https_redirect"
	CreateLoadBalancerListenerPolicyOptionsActionRedirectConst          = "redirect"
	CreateLoadBalancerListenerPolicyOptionsActionRejectConst            = "reject"
)

// NewCreateLoadBalancerListenerPolicyOptions : Instantiate CreateLoadBalancerListenerPolicyOptions
func (*VpcV1) NewCreateLoadBalancerListenerPolicyOptions(loadBalancerID string, listenerID string, action string, priority int64) *CreateLoadBalancerListenerPolicyOptions {
	return &CreateLoadBalancerListenerPolicyOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		Action:         core.StringPtr(action),
		Priority:       core.Int64Ptr(priority),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *CreateLoadBalancerListenerPolicyOptions) SetLoadBalancerID(loadBalancerID string) *CreateLoadBalancerListenerPolicyOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *CreateLoadBalancerListenerPolicyOptions) SetListenerID(listenerID string) *CreateLoadBalancerListenerPolicyOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetAction : Allow user to set Action
func (_options *CreateLoadBalancerListenerPolicyOptions) SetAction(action string) *CreateLoadBalancerListenerPolicyOptions {
	_options.Action = core.StringPtr(action)
	return _options
}

// SetPriority : Allow user to set Priority
func (_options *CreateLoadBalancerListenerPolicyOptions) SetPriority(priority int64) *CreateLoadBalancerListenerPolicyOptions {
	_options.Priority = core.Int64Ptr(priority)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateLoadBalancerListenerPolicyOptions) SetName(name string) *CreateLoadBalancerListenerPolicyOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetRules : Allow user to set Rules
func (_options *CreateLoadBalancerListenerPolicyOptions) SetRules(rules []LoadBalancerListenerPolicyRulePrototype) *CreateLoadBalancerListenerPolicyOptions {
	_options.Rules = rules
	return _options
}

// SetTarget : Allow user to set Target
func (_options *CreateLoadBalancerListenerPolicyOptions) SetTarget(target LoadBalancerListenerPolicyTargetPrototypeIntf) *CreateLoadBalancerListenerPolicyOptions {
	_options.Target = target
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateLoadBalancerListenerPolicyOptions) SetHeaders(param map[string]string) *CreateLoadBalancerListenerPolicyOptions {
	options.Headers = param
	return options
}

// CreateLoadBalancerListenerPolicyRuleOptions : The CreateLoadBalancerListenerPolicyRule options.
type CreateLoadBalancerListenerPolicyRuleOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	PolicyID *string `json:"policy_id" validate:"required,ne="`

	// The condition for the rule.
	Condition *string `json:"condition" validate:"required"`

	// The content the rule applies to:
	// - `body`: The UTF-8 form-encoded HTTP request body
	// - `header`: The HTTP header
	// - `hostname`: The fully-qualified domain name of the server specified in the Host
	//   HTTP request header
	// - `path`: The path of the HTTP request
	// - `query`: The query of the HTTP request URL
	// - `sni_hostname`: The fully-qualified domain name of the server provided in the
	//   "server name indicator" extension during TLS negotiation
	//
	// - For listeners with `protocol` `http` or `https`, any type may be specified.
	// - For listeners with `protocol` `tcp`, only type `sni_hostname` may be specified.
	Type *string `json:"type" validate:"required"`

	// The value to be matched for the rule condition.
	//
	// If the rule type is `query` and the rule condition is not `matches_regex`, the value must be percent-encoded.
	Value *string `json:"value" validate:"required"`

	// The field to match for this rule.
	// - If the `type` is `header`, this property must be specified.
	// - If the `type` is `body` or `query`, this property may be specified.
	// - For all other types, this property must not be specified.
	Field *string `json:"field,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateLoadBalancerListenerPolicyRuleOptions.Condition property.
// The condition for the rule.
const (
	CreateLoadBalancerListenerPolicyRuleOptionsConditionContainsConst     = "contains"
	CreateLoadBalancerListenerPolicyRuleOptionsConditionEqualsConst       = "equals"
	CreateLoadBalancerListenerPolicyRuleOptionsConditionMatchesRegexConst = "matches_regex"
)

// Constants associated with the CreateLoadBalancerListenerPolicyRuleOptions.Type property.
// The content the rule applies to:
//   - `body`: The UTF-8 form-encoded HTTP request body
//   - `header`: The HTTP header
//   - `hostname`: The fully-qualified domain name of the server specified in the Host
//     HTTP request header
//   - `path`: The path of the HTTP request
//   - `query`: The query of the HTTP request URL
//   - `sni_hostname`: The fully-qualified domain name of the server provided in the
//     "server name indicator" extension during TLS negotiation
//
// - For listeners with `protocol` `http` or `https`, any type may be specified.
// - For listeners with `protocol` `tcp`, only type `sni_hostname` may be specified.
const (
	CreateLoadBalancerListenerPolicyRuleOptionsTypeBodyConst        = "body"
	CreateLoadBalancerListenerPolicyRuleOptionsTypeHeaderConst      = "header"
	CreateLoadBalancerListenerPolicyRuleOptionsTypeHostnameConst    = "hostname"
	CreateLoadBalancerListenerPolicyRuleOptionsTypePathConst        = "path"
	CreateLoadBalancerListenerPolicyRuleOptionsTypeQueryConst       = "query"
	CreateLoadBalancerListenerPolicyRuleOptionsTypeSniHostnameConst = "sni_hostname"
)

// NewCreateLoadBalancerListenerPolicyRuleOptions : Instantiate CreateLoadBalancerListenerPolicyRuleOptions
func (*VpcV1) NewCreateLoadBalancerListenerPolicyRuleOptions(loadBalancerID string, listenerID string, policyID string, condition string, typeVar string, value string) *CreateLoadBalancerListenerPolicyRuleOptions {
	return &CreateLoadBalancerListenerPolicyRuleOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		PolicyID:       core.StringPtr(policyID),
		Condition:      core.StringPtr(condition),
		Type:           core.StringPtr(typeVar),
		Value:          core.StringPtr(value),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetLoadBalancerID(loadBalancerID string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetListenerID(listenerID string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetPolicyID : Allow user to set PolicyID
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetPolicyID(policyID string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.PolicyID = core.StringPtr(policyID)
	return _options
}

// SetCondition : Allow user to set Condition
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetCondition(condition string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.Condition = core.StringPtr(condition)
	return _options
}

// SetType : Allow user to set Type
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetType(typeVar string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.Type = core.StringPtr(typeVar)
	return _options
}

// SetValue : Allow user to set Value
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetValue(value string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.Value = core.StringPtr(value)
	return _options
}

// SetField : Allow user to set Field
func (_options *CreateLoadBalancerListenerPolicyRuleOptions) SetField(field string) *CreateLoadBalancerListenerPolicyRuleOptions {
	_options.Field = core.StringPtr(field)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateLoadBalancerListenerPolicyRuleOptions) SetHeaders(param map[string]string) *CreateLoadBalancerListenerPolicyRuleOptions {
	options.Headers = param
	return options
}

// CreateLoadBalancerOptions : The CreateLoadBalancer options.
type CreateLoadBalancerOptions struct {
	// Indicates whether this load balancer is public.
	//
	// At present,
	// - If `route_mode` is set to `true`, the load balancer must be private.
	// - If `is_private_path` is specified, it must be set to `false`.
	IsPublic *bool `json:"is_public" validate:"required"`

	// The subnets to provision this load balancer in.  The subnets must be in the same VPC.
	// - If 'availability' is specified as `subnet` in the profile, the load balancer's availability will depend on the
	// availability of the zones that the subnets reside in.
	// - If 'availability' is specified as `region` in the profile, the load balancer remains available as long as any zone
	// in the region is available. Only members in healthy zones will be sent new connections.
	//
	// Load balancers in the `network` family allow only one subnet to be specified.
	Subnets []SubnetIdentityIntf `json:"subnets" validate:"required"`

	// The DNS configuration for this load balancer.
	//
	// If unspecified, DNS `A` records for this load balancer's `hostname` property will be added
	// to the public DNS zone `lb.appdomain.cloud`. Otherwise, those DNS `A` records will be
	// added to the specified `zone`.
	//
	// Not supported by private path load balancers.
	Dns *LoadBalancerDnsPrototype `json:"dns,omitempty"`

	// Indicates whether this is a private path load balancer.
	IsPrivatePath *bool `json:"is_private_path,omitempty"`

	// The listeners of this load balancer.
	Listeners []LoadBalancerListenerPrototypeLoadBalancerContext `json:"listeners,omitempty"`

	// The logging configuration to use for this load balancer. See [VPC Datapath
	// Logging](https://cloud.ibm.com/docs/vpc?topic=vpc-datapath-logging) on the logging
	// format, fields and permitted values. If unspecified, `datapath.active` will be `false`.
	//
	// To activate logging, the load balancer profile must support the specified logging type.
	Logging *LoadBalancerLoggingPrototype `json:"logging,omitempty"`

	// The name for this load balancer. The name must not be used by another load balancer in the VPC.  If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The pools of this load balancer.
	Pools []LoadBalancerPoolPrototypeLoadBalancerContext `json:"pools,omitempty"`

	// The profile to use for this load balancer.
	//
	// If unspecified, `application` will be used.
	Profile LoadBalancerProfileIdentityIntf `json:"profile,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Indicates whether [route mode](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-vnf&interface=ui) is enabled for this
	// load balancer.
	//
	// At present, public load balancers are not supported with route mode enabled.
	RouteMode *bool `json:"route_mode,omitempty"`

	// The security groups to use for this load balancer. If unspecified, the VPC's default security group is used.
	//
	// The load balancer profile must support security groups.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateLoadBalancerOptions : Instantiate CreateLoadBalancerOptions
func (*VpcV1) NewCreateLoadBalancerOptions(isPublic bool, subnets []SubnetIdentityIntf) *CreateLoadBalancerOptions {
	return &CreateLoadBalancerOptions{
		IsPublic: core.BoolPtr(isPublic),
		Subnets:  subnets,
	}
}

// SetIsPublic : Allow user to set IsPublic
func (_options *CreateLoadBalancerOptions) SetIsPublic(isPublic bool) *CreateLoadBalancerOptions {
	_options.IsPublic = core.BoolPtr(isPublic)
	return _options
}

// SetSubnets : Allow user to set Subnets
func (_options *CreateLoadBalancerOptions) SetSubnets(subnets []SubnetIdentityIntf) *CreateLoadBalancerOptions {
	_options.Subnets = subnets
	return _options
}

// SetDns : Allow user to set Dns
func (_options *CreateLoadBalancerOptions) SetDns(dns *LoadBalancerDnsPrototype) *CreateLoadBalancerOptions {
	_options.Dns = dns
	return _options
}

// SetIsPrivatePath : Allow user to set IsPrivatePath
func (_options *CreateLoadBalancerOptions) SetIsPrivatePath(isPrivatePath bool) *CreateLoadBalancerOptions {
	_options.IsPrivatePath = core.BoolPtr(isPrivatePath)
	return _options
}

// SetListeners : Allow user to set Listeners
func (_options *CreateLoadBalancerOptions) SetListeners(listeners []LoadBalancerListenerPrototypeLoadBalancerContext) *CreateLoadBalancerOptions {
	_options.Listeners = listeners
	return _options
}

// SetLogging : Allow user to set Logging
func (_options *CreateLoadBalancerOptions) SetLogging(logging *LoadBalancerLoggingPrototype) *CreateLoadBalancerOptions {
	_options.Logging = logging
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateLoadBalancerOptions) SetName(name string) *CreateLoadBalancerOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetPools : Allow user to set Pools
func (_options *CreateLoadBalancerOptions) SetPools(pools []LoadBalancerPoolPrototypeLoadBalancerContext) *CreateLoadBalancerOptions {
	_options.Pools = pools
	return _options
}

// SetProfile : Allow user to set Profile
func (_options *CreateLoadBalancerOptions) SetProfile(profile LoadBalancerProfileIdentityIntf) *CreateLoadBalancerOptions {
	_options.Profile = profile
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateLoadBalancerOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateLoadBalancerOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetRouteMode : Allow user to set RouteMode
func (_options *CreateLoadBalancerOptions) SetRouteMode(routeMode bool) *CreateLoadBalancerOptions {
	_options.RouteMode = core.BoolPtr(routeMode)
	return _options
}

// SetSecurityGroups : Allow user to set SecurityGroups
func (_options *CreateLoadBalancerOptions) SetSecurityGroups(securityGroups []SecurityGroupIdentityIntf) *CreateLoadBalancerOptions {
	_options.SecurityGroups = securityGroups
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateLoadBalancerOptions) SetHeaders(param map[string]string) *CreateLoadBalancerOptions {
	options.Headers = param
	return options
}

// CreateLoadBalancerPoolMemberOptions : The CreateLoadBalancerPoolMember options.
type CreateLoadBalancerPoolMemberOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	PoolID *string `json:"pool_id" validate:"required,ne="`

	// The port the member will receive load balancer traffic on. Applies only to load balancer traffic received on a
	// listener with a single port. (If the traffic is received on a listener with a port range, the member will receive
	// the traffic on the same port the listener received it on.)
	//
	// This port will also be used for health checks unless the `port` property of
	// `health_monitor` property is specified.
	//
	// The port must be unique across all members for all pools associated with this pool's listener.
	//
	// For load balancers in the `network` family, the same `port` and `target` tuple cannot be shared by a pool member of
	// any other load balancer in the same VPC.
	Port *int64 `json:"port" validate:"required"`

	// The pool member target.
	//
	// If the load balancer has `route_mode` set to `true`, the member must be in a zone the load
	// balancer has a subnet in.
	//
	// For load balancers in the `network` family, the same `port` and `target` tuple cannot
	// be shared by a pool member of any other load balancer in the same VPC.
	Target LoadBalancerPoolMemberTargetPrototypeIntf `json:"target" validate:"required"`

	// The weight of the member.
	//
	// If specified, the pool algorithm must be `weighted_round_robin` and the load balancer must be in the `application`
	// family.
	//
	// If unspecified, the weight will be `50` for load balancers in the `application` family.
	Weight *int64 `json:"weight,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateLoadBalancerPoolMemberOptions : Instantiate CreateLoadBalancerPoolMemberOptions
func (*VpcV1) NewCreateLoadBalancerPoolMemberOptions(loadBalancerID string, poolID string, port int64, target LoadBalancerPoolMemberTargetPrototypeIntf) *CreateLoadBalancerPoolMemberOptions {
	return &CreateLoadBalancerPoolMemberOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		PoolID:         core.StringPtr(poolID),
		Port:           core.Int64Ptr(port),
		Target:         target,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *CreateLoadBalancerPoolMemberOptions) SetLoadBalancerID(loadBalancerID string) *CreateLoadBalancerPoolMemberOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetPoolID : Allow user to set PoolID
func (_options *CreateLoadBalancerPoolMemberOptions) SetPoolID(poolID string) *CreateLoadBalancerPoolMemberOptions {
	_options.PoolID = core.StringPtr(poolID)
	return _options
}

// SetPort : Allow user to set Port
func (_options *CreateLoadBalancerPoolMemberOptions) SetPort(port int64) *CreateLoadBalancerPoolMemberOptions {
	_options.Port = core.Int64Ptr(port)
	return _options
}

// SetTarget : Allow user to set Target
func (_options *CreateLoadBalancerPoolMemberOptions) SetTarget(target LoadBalancerPoolMemberTargetPrototypeIntf) *CreateLoadBalancerPoolMemberOptions {
	_options.Target = target
	return _options
}

// SetWeight : Allow user to set Weight
func (_options *CreateLoadBalancerPoolMemberOptions) SetWeight(weight int64) *CreateLoadBalancerPoolMemberOptions {
	_options.Weight = core.Int64Ptr(weight)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateLoadBalancerPoolMemberOptions) SetHeaders(param map[string]string) *CreateLoadBalancerPoolMemberOptions {
	options.Headers = param
	return options
}

// CreateLoadBalancerPoolOptions : The CreateLoadBalancerPool options.
type CreateLoadBalancerPoolOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The load balancing algorithm. The `least_connections` algorithm is only supported for load balancers that have
	// `availability` with value `subnet` in the profile.
	Algorithm *string `json:"algorithm" validate:"required"`

	// The health monitor of this pool.
	//
	// If this pool has a member targeting a load balancer then:
	//
	// - If the targeted load balancer has multiple subnets, this health monitor will be
	//   used to direct traffic to the available subnets.
	// - The health checks spawned by this health monitor will be handled as any other
	//   traffic (that is, subject to the configuration of listeners and pools on the target
	//   load balancer).
	// - This health monitor does not affect how pool member health is determined within the
	//   target load balancer.
	//
	// For more information, see [Private Path network load balancer frequently asked
	// questions](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-faqs#ppnlb-faqs).
	HealthMonitor LoadBalancerPoolHealthMonitorPrototypeIntf `json:"health_monitor" validate:"required"`

	// The protocol used for this load balancer pool. Load balancers in the `network` family support `tcp` and `udp` (if
	// `udp_supported` is `true`). Load balancers in the
	// `application` family support `tcp`, `http`, and `https`.
	Protocol *string `json:"protocol" validate:"required"`

	// The failsafe policy to use for this pool.
	//
	// If unspecified, the default failsafe policy action from the profile will be used.
	FailsafePolicy *LoadBalancerPoolFailsafePolicyPrototype `json:"failsafe_policy,omitempty"`

	// The members for this load balancer pool. For load balancers in the `network` family, the same `port` and `target`
	// tuple cannot be shared by a pool member of any other load balancer in the same VPC.
	Members []LoadBalancerPoolMemberPrototype `json:"members,omitempty"`

	// The name for this load balancer pool. The name must not be used by another pool for the load balancer. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The PROXY protocol setting for this pool:
	// - `v1`: Enabled with version 1 (human-readable header format)
	// - `v2`: Enabled with version 2 (binary header format)
	// - `disabled`: Disabled
	//
	// For load balancers in the `network` family, this property must be `disabled`.
	ProxyProtocol *string `json:"proxy_protocol,omitempty"`

	// The session persistence of this pool. If specified, the load balancer must have
	// `source_ip_session_persistence_supported` set to `true` in its profile.
	//
	// If unspecified, session persistence will be disabled, and traffic will be distributed
	// across members of the pool.
	SessionPersistence *LoadBalancerPoolSessionPersistencePrototype `json:"session_persistence,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateLoadBalancerPoolOptions.Algorithm property.
// The load balancing algorithm. The `least_connections` algorithm is only supported for load balancers that have
// `availability` with value `subnet` in the profile.
const (
	CreateLoadBalancerPoolOptionsAlgorithmLeastConnectionsConst   = "least_connections"
	CreateLoadBalancerPoolOptionsAlgorithmRoundRobinConst         = "round_robin"
	CreateLoadBalancerPoolOptionsAlgorithmWeightedRoundRobinConst = "weighted_round_robin"
)

// Constants associated with the CreateLoadBalancerPoolOptions.Protocol property.
// The protocol used for this load balancer pool. Load balancers in the `network` family support `tcp` and `udp` (if
// `udp_supported` is `true`). Load balancers in the
// `application` family support `tcp`, `http`, and `https`.
const (
	CreateLoadBalancerPoolOptionsProtocolHTTPConst  = "http"
	CreateLoadBalancerPoolOptionsProtocolHTTPSConst = "https"
	CreateLoadBalancerPoolOptionsProtocolTCPConst   = "tcp"
	CreateLoadBalancerPoolOptionsProtocolUDPConst   = "udp"
)

// Constants associated with the CreateLoadBalancerPoolOptions.ProxyProtocol property.
// The PROXY protocol setting for this pool:
// - `v1`: Enabled with version 1 (human-readable header format)
// - `v2`: Enabled with version 2 (binary header format)
// - `disabled`: Disabled
//
// For load balancers in the `network` family, this property must be `disabled`.
const (
	CreateLoadBalancerPoolOptionsProxyProtocolDisabledConst = "disabled"
	CreateLoadBalancerPoolOptionsProxyProtocolV1Const       = "v1"
	CreateLoadBalancerPoolOptionsProxyProtocolV2Const       = "v2"
)

// NewCreateLoadBalancerPoolOptions : Instantiate CreateLoadBalancerPoolOptions
func (*VpcV1) NewCreateLoadBalancerPoolOptions(loadBalancerID string, algorithm string, healthMonitor LoadBalancerPoolHealthMonitorPrototypeIntf, protocol string) *CreateLoadBalancerPoolOptions {
	return &CreateLoadBalancerPoolOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		Algorithm:      core.StringPtr(algorithm),
		HealthMonitor:  healthMonitor,
		Protocol:       core.StringPtr(protocol),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *CreateLoadBalancerPoolOptions) SetLoadBalancerID(loadBalancerID string) *CreateLoadBalancerPoolOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetAlgorithm : Allow user to set Algorithm
func (_options *CreateLoadBalancerPoolOptions) SetAlgorithm(algorithm string) *CreateLoadBalancerPoolOptions {
	_options.Algorithm = core.StringPtr(algorithm)
	return _options
}

// SetHealthMonitor : Allow user to set HealthMonitor
func (_options *CreateLoadBalancerPoolOptions) SetHealthMonitor(healthMonitor LoadBalancerPoolHealthMonitorPrototypeIntf) *CreateLoadBalancerPoolOptions {
	_options.HealthMonitor = healthMonitor
	return _options
}

// SetProtocol : Allow user to set Protocol
func (_options *CreateLoadBalancerPoolOptions) SetProtocol(protocol string) *CreateLoadBalancerPoolOptions {
	_options.Protocol = core.StringPtr(protocol)
	return _options
}

// SetFailsafePolicy : Allow user to set FailsafePolicy
func (_options *CreateLoadBalancerPoolOptions) SetFailsafePolicy(failsafePolicy *LoadBalancerPoolFailsafePolicyPrototype) *CreateLoadBalancerPoolOptions {
	_options.FailsafePolicy = failsafePolicy
	return _options
}

// SetMembers : Allow user to set Members
func (_options *CreateLoadBalancerPoolOptions) SetMembers(members []LoadBalancerPoolMemberPrototype) *CreateLoadBalancerPoolOptions {
	_options.Members = members
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateLoadBalancerPoolOptions) SetName(name string) *CreateLoadBalancerPoolOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetProxyProtocol : Allow user to set ProxyProtocol
func (_options *CreateLoadBalancerPoolOptions) SetProxyProtocol(proxyProtocol string) *CreateLoadBalancerPoolOptions {
	_options.ProxyProtocol = core.StringPtr(proxyProtocol)
	return _options
}

// SetSessionPersistence : Allow user to set SessionPersistence
func (_options *CreateLoadBalancerPoolOptions) SetSessionPersistence(sessionPersistence *LoadBalancerPoolSessionPersistencePrototype) *CreateLoadBalancerPoolOptions {
	_options.SessionPersistence = sessionPersistence
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateLoadBalancerPoolOptions) SetHeaders(param map[string]string) *CreateLoadBalancerPoolOptions {
	options.Headers = param
	return options
}

// CreateNetworkACLOptions : The CreateNetworkACL options.
type CreateNetworkACLOptions struct {
	// The network ACL prototype object.
	NetworkACLPrototype NetworkACLPrototypeIntf `json:"NetworkACLPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateNetworkACLOptions : Instantiate CreateNetworkACLOptions
func (*VpcV1) NewCreateNetworkACLOptions(networkACLPrototype NetworkACLPrototypeIntf) *CreateNetworkACLOptions {
	return &CreateNetworkACLOptions{
		NetworkACLPrototype: networkACLPrototype,
	}
}

// SetNetworkACLPrototype : Allow user to set NetworkACLPrototype
func (_options *CreateNetworkACLOptions) SetNetworkACLPrototype(networkACLPrototype NetworkACLPrototypeIntf) *CreateNetworkACLOptions {
	_options.NetworkACLPrototype = networkACLPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateNetworkACLOptions) SetHeaders(param map[string]string) *CreateNetworkACLOptions {
	options.Headers = param
	return options
}

// CreateNetworkACLRuleOptions : The CreateNetworkACLRule options.
type CreateNetworkACLRuleOptions struct {
	// The network ACL identifier.
	NetworkACLID *string `json:"network_acl_id" validate:"required,ne="`

	// The network ACL rule prototype object.
	NetworkACLRulePrototype NetworkACLRulePrototypeIntf `json:"NetworkACLRulePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateNetworkACLRuleOptions : Instantiate CreateNetworkACLRuleOptions
func (*VpcV1) NewCreateNetworkACLRuleOptions(networkACLID string, networkACLRulePrototype NetworkACLRulePrototypeIntf) *CreateNetworkACLRuleOptions {
	return &CreateNetworkACLRuleOptions{
		NetworkACLID:            core.StringPtr(networkACLID),
		NetworkACLRulePrototype: networkACLRulePrototype,
	}
}

// SetNetworkACLID : Allow user to set NetworkACLID
func (_options *CreateNetworkACLRuleOptions) SetNetworkACLID(networkACLID string) *CreateNetworkACLRuleOptions {
	_options.NetworkACLID = core.StringPtr(networkACLID)
	return _options
}

// SetNetworkACLRulePrototype : Allow user to set NetworkACLRulePrototype
func (_options *CreateNetworkACLRuleOptions) SetNetworkACLRulePrototype(networkACLRulePrototype NetworkACLRulePrototypeIntf) *CreateNetworkACLRuleOptions {
	_options.NetworkACLRulePrototype = networkACLRulePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateNetworkACLRuleOptions) SetHeaders(param map[string]string) *CreateNetworkACLRuleOptions {
	options.Headers = param
	return options
}

// CreatePlacementGroupOptions : The CreatePlacementGroup options.
type CreatePlacementGroupOptions struct {
	// The strategy for this placement group:
	// - `host_spread`: place on different compute hosts
	// - `power_spread`: place on compute hosts that use different power sources.
	Strategy *string `json:"strategy" validate:"required"`

	// The name for this placement group. The name must not be used by another placement group in the region. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreatePlacementGroupOptions.Strategy property.
// The strategy for this placement group:
// - `host_spread`: place on different compute hosts
// - `power_spread`: place on compute hosts that use different power sources.
const (
	CreatePlacementGroupOptionsStrategyHostSpreadConst  = "host_spread"
	CreatePlacementGroupOptionsStrategyPowerSpreadConst = "power_spread"
)

// NewCreatePlacementGroupOptions : Instantiate CreatePlacementGroupOptions
func (*VpcV1) NewCreatePlacementGroupOptions(strategy string) *CreatePlacementGroupOptions {
	return &CreatePlacementGroupOptions{
		Strategy: core.StringPtr(strategy),
	}
}

// SetStrategy : Allow user to set Strategy
func (_options *CreatePlacementGroupOptions) SetStrategy(strategy string) *CreatePlacementGroupOptions {
	_options.Strategy = core.StringPtr(strategy)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreatePlacementGroupOptions) SetName(name string) *CreatePlacementGroupOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreatePlacementGroupOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreatePlacementGroupOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreatePlacementGroupOptions) SetHeaders(param map[string]string) *CreatePlacementGroupOptions {
	options.Headers = param
	return options
}

// CreatePrivatePathServiceGatewayAccountPolicyOptions : The CreatePrivatePathServiceGatewayAccountPolicy options.
type CreatePrivatePathServiceGatewayAccountPolicyOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The access policy for the account. Updating the access policy only affects pending and future endpoint gateway
	// bindings.
	// - permit: access will be permitted
	// - deny: access will be denied
	// - review: access will be manually reviewed
	//
	// - Updating to `review` sets the status of future endpoint gateway bindings from
	//    this account to `pending`.
	// - Updating to `permit` updates both the status of any `pending` and future endpoint
	//   gateway bindings from this account to `permitted`.
	// - Updating to `deny` updates both the status of any `pending` and future endpoint
	//   gateway bindings from this account to `denied`.
	AccessPolicy *string `json:"access_policy" validate:"required"`

	// The account for this access policy. The account must be unique across all account
	// policies for this private path service gateway.
	Account AccountIdentityIntf `json:"account" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreatePrivatePathServiceGatewayAccountPolicyOptions.AccessPolicy property.
// The access policy for the account. Updating the access policy only affects pending and future endpoint gateway
// bindings.
// - permit: access will be permitted
// - deny: access will be denied
// - review: access will be manually reviewed
//
//   - Updating to `review` sets the status of future endpoint gateway bindings from
//     this account to `pending`.
//   - Updating to `permit` updates both the status of any `pending` and future endpoint
//     gateway bindings from this account to `permitted`.
//   - Updating to `deny` updates both the status of any `pending` and future endpoint
//     gateway bindings from this account to `denied`.
const (
	CreatePrivatePathServiceGatewayAccountPolicyOptionsAccessPolicyDenyConst   = "deny"
	CreatePrivatePathServiceGatewayAccountPolicyOptionsAccessPolicyPermitConst = "permit"
	CreatePrivatePathServiceGatewayAccountPolicyOptionsAccessPolicyReviewConst = "review"
)

// NewCreatePrivatePathServiceGatewayAccountPolicyOptions : Instantiate CreatePrivatePathServiceGatewayAccountPolicyOptions
func (*VpcV1) NewCreatePrivatePathServiceGatewayAccountPolicyOptions(privatePathServiceGatewayID string, accessPolicy string, account AccountIdentityIntf) *CreatePrivatePathServiceGatewayAccountPolicyOptions {
	return &CreatePrivatePathServiceGatewayAccountPolicyOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		AccessPolicy:                core.StringPtr(accessPolicy),
		Account:                     account,
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *CreatePrivatePathServiceGatewayAccountPolicyOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *CreatePrivatePathServiceGatewayAccountPolicyOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetAccessPolicy : Allow user to set AccessPolicy
func (_options *CreatePrivatePathServiceGatewayAccountPolicyOptions) SetAccessPolicy(accessPolicy string) *CreatePrivatePathServiceGatewayAccountPolicyOptions {
	_options.AccessPolicy = core.StringPtr(accessPolicy)
	return _options
}

// SetAccount : Allow user to set Account
func (_options *CreatePrivatePathServiceGatewayAccountPolicyOptions) SetAccount(account AccountIdentityIntf) *CreatePrivatePathServiceGatewayAccountPolicyOptions {
	_options.Account = account
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreatePrivatePathServiceGatewayAccountPolicyOptions) SetHeaders(param map[string]string) *CreatePrivatePathServiceGatewayAccountPolicyOptions {
	options.Headers = param
	return options
}

// CreatePrivatePathServiceGatewayOptions : The CreatePrivatePathServiceGateway options.
type CreatePrivatePathServiceGatewayOptions struct {
	// The load balancer for this private path service gateway. The load balancer must
	// have `is_private_path` set to `true`.
	//
	// The private path service gateway will reside in the same VPC as the specified load
	// balancer.
	LoadBalancer LoadBalancerIdentityIntf `json:"load_balancer" validate:"required"`

	// The fully qualified domain names for this private path service gateway. Any uppercase letters will be converted to
	// lowercase.
	ServiceEndpoints []string `json:"service_endpoints" validate:"required"`

	// The policy to use for bindings from accounts without an explicit account policy.
	DefaultAccessPolicy *string `json:"default_access_policy,omitempty"`

	// The name for this private path service gateway. The name must not be used by another private path service gateway in
	// the VPC. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Indicates whether this private path service gateway has zonal affinity.
	// - `true`:  Traffic to the service from a zone the service resides in will remain in
	//            that zone.
	// - `false`: Traffic to the service from a zone will be load balanced across all zones
	//            in the region the service resides in.
	ZonalAffinity *bool `json:"zonal_affinity,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreatePrivatePathServiceGatewayOptions.DefaultAccessPolicy property.
// The policy to use for bindings from accounts without an explicit account policy.
const (
	CreatePrivatePathServiceGatewayOptionsDefaultAccessPolicyDenyConst   = "deny"
	CreatePrivatePathServiceGatewayOptionsDefaultAccessPolicyPermitConst = "permit"
	CreatePrivatePathServiceGatewayOptionsDefaultAccessPolicyReviewConst = "review"
)

// NewCreatePrivatePathServiceGatewayOptions : Instantiate CreatePrivatePathServiceGatewayOptions
func (*VpcV1) NewCreatePrivatePathServiceGatewayOptions(loadBalancer LoadBalancerIdentityIntf, serviceEndpoints []string) *CreatePrivatePathServiceGatewayOptions {
	return &CreatePrivatePathServiceGatewayOptions{
		LoadBalancer:     loadBalancer,
		ServiceEndpoints: serviceEndpoints,
	}
}

// SetLoadBalancer : Allow user to set LoadBalancer
func (_options *CreatePrivatePathServiceGatewayOptions) SetLoadBalancer(loadBalancer LoadBalancerIdentityIntf) *CreatePrivatePathServiceGatewayOptions {
	_options.LoadBalancer = loadBalancer
	return _options
}

// SetServiceEndpoints : Allow user to set ServiceEndpoints
func (_options *CreatePrivatePathServiceGatewayOptions) SetServiceEndpoints(serviceEndpoints []string) *CreatePrivatePathServiceGatewayOptions {
	_options.ServiceEndpoints = serviceEndpoints
	return _options
}

// SetDefaultAccessPolicy : Allow user to set DefaultAccessPolicy
func (_options *CreatePrivatePathServiceGatewayOptions) SetDefaultAccessPolicy(defaultAccessPolicy string) *CreatePrivatePathServiceGatewayOptions {
	_options.DefaultAccessPolicy = core.StringPtr(defaultAccessPolicy)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreatePrivatePathServiceGatewayOptions) SetName(name string) *CreatePrivatePathServiceGatewayOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreatePrivatePathServiceGatewayOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreatePrivatePathServiceGatewayOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetZonalAffinity : Allow user to set ZonalAffinity
func (_options *CreatePrivatePathServiceGatewayOptions) SetZonalAffinity(zonalAffinity bool) *CreatePrivatePathServiceGatewayOptions {
	_options.ZonalAffinity = core.BoolPtr(zonalAffinity)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreatePrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *CreatePrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// CreatePublicAddressRangeOptions : The CreatePublicAddressRange options.
type CreatePublicAddressRangeOptions struct {
	// The total number of public IPv4 addresses required. Must be a power of 2.
	Ipv4AddressCount *int64 `json:"ipv4_address_count" validate:"required"`

	// The name for this public address range. The name must not be used by another public address range in the region. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The target to bind this public address range to. If unspecified, the public address
	// range will not be bound to a target at creation.
	Target *PublicAddressRangeTargetPrototype `json:"target,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreatePublicAddressRangeOptions : Instantiate CreatePublicAddressRangeOptions
func (*VpcV1) NewCreatePublicAddressRangeOptions(ipv4AddressCount int64) *CreatePublicAddressRangeOptions {
	return &CreatePublicAddressRangeOptions{
		Ipv4AddressCount: core.Int64Ptr(ipv4AddressCount),
	}
}

// SetIpv4AddressCount : Allow user to set Ipv4AddressCount
func (_options *CreatePublicAddressRangeOptions) SetIpv4AddressCount(ipv4AddressCount int64) *CreatePublicAddressRangeOptions {
	_options.Ipv4AddressCount = core.Int64Ptr(ipv4AddressCount)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreatePublicAddressRangeOptions) SetName(name string) *CreatePublicAddressRangeOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreatePublicAddressRangeOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreatePublicAddressRangeOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetTarget : Allow user to set Target
func (_options *CreatePublicAddressRangeOptions) SetTarget(target *PublicAddressRangeTargetPrototype) *CreatePublicAddressRangeOptions {
	_options.Target = target
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreatePublicAddressRangeOptions) SetHeaders(param map[string]string) *CreatePublicAddressRangeOptions {
	options.Headers = param
	return options
}

// CreatePublicGatewayOptions : The CreatePublicGateway options.
type CreatePublicGatewayOptions struct {
	// The VPC this public gateway will reside in.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The zone this public gateway will reside in.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	FloatingIP PublicGatewayFloatingIPPrototypeIntf `json:"floating_ip,omitempty"`

	// The name for this public gateway. The name must not be used by another public gateway in the VPC. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreatePublicGatewayOptions : Instantiate CreatePublicGatewayOptions
func (*VpcV1) NewCreatePublicGatewayOptions(vpc VPCIdentityIntf, zone ZoneIdentityIntf) *CreatePublicGatewayOptions {
	return &CreatePublicGatewayOptions{
		VPC:  vpc,
		Zone: zone,
	}
}

// SetVPC : Allow user to set VPC
func (_options *CreatePublicGatewayOptions) SetVPC(vpc VPCIdentityIntf) *CreatePublicGatewayOptions {
	_options.VPC = vpc
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreatePublicGatewayOptions) SetZone(zone ZoneIdentityIntf) *CreatePublicGatewayOptions {
	_options.Zone = zone
	return _options
}

// SetFloatingIP : Allow user to set FloatingIP
func (_options *CreatePublicGatewayOptions) SetFloatingIP(floatingIP PublicGatewayFloatingIPPrototypeIntf) *CreatePublicGatewayOptions {
	_options.FloatingIP = floatingIP
	return _options
}

// SetName : Allow user to set Name
func (_options *CreatePublicGatewayOptions) SetName(name string) *CreatePublicGatewayOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreatePublicGatewayOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreatePublicGatewayOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreatePublicGatewayOptions) SetHeaders(param map[string]string) *CreatePublicGatewayOptions {
	options.Headers = param
	return options
}

// CreateReservationOptions : The CreateReservation options.
type CreateReservationOptions struct {
	// The capacity reservation configuration to use.
	Capacity *ReservationCapacityPrototype `json:"capacity" validate:"required"`

	// The committed use configuration to use for this reservation.
	CommittedUse *ReservationCommittedUsePrototype `json:"committed_use" validate:"required"`

	// The [instance profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) or
	// [bare metal server
	// profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile)
	// to use for this reservation.
	Profile *ReservationProfilePrototype `json:"profile" validate:"required"`

	// The zone to use for this reservation.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// The affinity policy to use for this reservation:
	// - `automatic`: The reservation will be automatically selected
	// - `restricted`: The reservation must be manually requested.
	AffinityPolicy *string `json:"affinity_policy,omitempty"`

	// The name for this reservation. The name must not be used by another reservation in the region. If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateReservationOptions.AffinityPolicy property.
// The affinity policy to use for this reservation:
// - `automatic`: The reservation will be automatically selected
// - `restricted`: The reservation must be manually requested.
const (
	CreateReservationOptionsAffinityPolicyAutomaticConst  = "automatic"
	CreateReservationOptionsAffinityPolicyRestrictedConst = "restricted"
)

// NewCreateReservationOptions : Instantiate CreateReservationOptions
func (*VpcV1) NewCreateReservationOptions(capacity *ReservationCapacityPrototype, committedUse *ReservationCommittedUsePrototype, profile *ReservationProfilePrototype, zone ZoneIdentityIntf) *CreateReservationOptions {
	return &CreateReservationOptions{
		Capacity:     capacity,
		CommittedUse: committedUse,
		Profile:      profile,
		Zone:         zone,
	}
}

// SetCapacity : Allow user to set Capacity
func (_options *CreateReservationOptions) SetCapacity(capacity *ReservationCapacityPrototype) *CreateReservationOptions {
	_options.Capacity = capacity
	return _options
}

// SetCommittedUse : Allow user to set CommittedUse
func (_options *CreateReservationOptions) SetCommittedUse(committedUse *ReservationCommittedUsePrototype) *CreateReservationOptions {
	_options.CommittedUse = committedUse
	return _options
}

// SetProfile : Allow user to set Profile
func (_options *CreateReservationOptions) SetProfile(profile *ReservationProfilePrototype) *CreateReservationOptions {
	_options.Profile = profile
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreateReservationOptions) SetZone(zone ZoneIdentityIntf) *CreateReservationOptions {
	_options.Zone = zone
	return _options
}

// SetAffinityPolicy : Allow user to set AffinityPolicy
func (_options *CreateReservationOptions) SetAffinityPolicy(affinityPolicy string) *CreateReservationOptions {
	_options.AffinityPolicy = core.StringPtr(affinityPolicy)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateReservationOptions) SetName(name string) *CreateReservationOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateReservationOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateReservationOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateReservationOptions) SetHeaders(param map[string]string) *CreateReservationOptions {
	options.Headers = param
	return options
}

// CreateSecurityGroupOptions : The CreateSecurityGroup options.
type CreateSecurityGroupOptions struct {
	// The VPC this security group will reside in.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The name for this security group. The name must not be used by another security group for the VPC. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The prototype objects for rules to be created for this security group. If unspecified, no rules will be created,
	// resulting in no traffic being allowed.
	Rules []SecurityGroupRulePrototypeIntf `json:"rules,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSecurityGroupOptions : Instantiate CreateSecurityGroupOptions
func (*VpcV1) NewCreateSecurityGroupOptions(vpc VPCIdentityIntf) *CreateSecurityGroupOptions {
	return &CreateSecurityGroupOptions{
		VPC: vpc,
	}
}

// SetVPC : Allow user to set VPC
func (_options *CreateSecurityGroupOptions) SetVPC(vpc VPCIdentityIntf) *CreateSecurityGroupOptions {
	_options.VPC = vpc
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateSecurityGroupOptions) SetName(name string) *CreateSecurityGroupOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateSecurityGroupOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateSecurityGroupOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetRules : Allow user to set Rules
func (_options *CreateSecurityGroupOptions) SetRules(rules []SecurityGroupRulePrototypeIntf) *CreateSecurityGroupOptions {
	_options.Rules = rules
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSecurityGroupOptions) SetHeaders(param map[string]string) *CreateSecurityGroupOptions {
	options.Headers = param
	return options
}

// CreateSecurityGroupRuleOptions : The CreateSecurityGroupRule options.
type CreateSecurityGroupRuleOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The properties of the security group rule to be created.
	SecurityGroupRulePrototype SecurityGroupRulePrototypeIntf `json:"SecurityGroupRulePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSecurityGroupRuleOptions : Instantiate CreateSecurityGroupRuleOptions
func (*VpcV1) NewCreateSecurityGroupRuleOptions(securityGroupID string, securityGroupRulePrototype SecurityGroupRulePrototypeIntf) *CreateSecurityGroupRuleOptions {
	return &CreateSecurityGroupRuleOptions{
		SecurityGroupID:            core.StringPtr(securityGroupID),
		SecurityGroupRulePrototype: securityGroupRulePrototype,
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *CreateSecurityGroupRuleOptions) SetSecurityGroupID(securityGroupID string) *CreateSecurityGroupRuleOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetSecurityGroupRulePrototype : Allow user to set SecurityGroupRulePrototype
func (_options *CreateSecurityGroupRuleOptions) SetSecurityGroupRulePrototype(securityGroupRulePrototype SecurityGroupRulePrototypeIntf) *CreateSecurityGroupRuleOptions {
	_options.SecurityGroupRulePrototype = securityGroupRulePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSecurityGroupRuleOptions) SetHeaders(param map[string]string) *CreateSecurityGroupRuleOptions {
	options.Headers = param
	return options
}

// CreateSecurityGroupTargetBindingOptions : The CreateSecurityGroupTargetBinding options.
type CreateSecurityGroupTargetBindingOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The security group target identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSecurityGroupTargetBindingOptions : Instantiate CreateSecurityGroupTargetBindingOptions
func (*VpcV1) NewCreateSecurityGroupTargetBindingOptions(securityGroupID string, id string) *CreateSecurityGroupTargetBindingOptions {
	return &CreateSecurityGroupTargetBindingOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *CreateSecurityGroupTargetBindingOptions) SetSecurityGroupID(securityGroupID string) *CreateSecurityGroupTargetBindingOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *CreateSecurityGroupTargetBindingOptions) SetID(id string) *CreateSecurityGroupTargetBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSecurityGroupTargetBindingOptions) SetHeaders(param map[string]string) *CreateSecurityGroupTargetBindingOptions {
	options.Headers = param
	return options
}

// CreateShareMountTargetOptions : The CreateShareMountTarget options.
type CreateShareMountTargetOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The share mount target prototype object.
	ShareMountTargetPrototype ShareMountTargetPrototypeIntf `json:"ShareMountTargetPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateShareMountTargetOptions : Instantiate CreateShareMountTargetOptions
func (*VpcV1) NewCreateShareMountTargetOptions(shareID string, shareMountTargetPrototype ShareMountTargetPrototypeIntf) *CreateShareMountTargetOptions {
	return &CreateShareMountTargetOptions{
		ShareID:                   core.StringPtr(shareID),
		ShareMountTargetPrototype: shareMountTargetPrototype,
	}
}

// SetShareID : Allow user to set ShareID
func (_options *CreateShareMountTargetOptions) SetShareID(shareID string) *CreateShareMountTargetOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetShareMountTargetPrototype : Allow user to set ShareMountTargetPrototype
func (_options *CreateShareMountTargetOptions) SetShareMountTargetPrototype(shareMountTargetPrototype ShareMountTargetPrototypeIntf) *CreateShareMountTargetOptions {
	_options.ShareMountTargetPrototype = shareMountTargetPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateShareMountTargetOptions) SetHeaders(param map[string]string) *CreateShareMountTargetOptions {
	options.Headers = param
	return options
}

// CreateShareOptions : The CreateShare options.
type CreateShareOptions struct {
	// The file share prototype object.
	SharePrototype SharePrototypeIntf `json:"SharePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateShareOptions : Instantiate CreateShareOptions
func (*VpcV1) NewCreateShareOptions(sharePrototype SharePrototypeIntf) *CreateShareOptions {
	return &CreateShareOptions{
		SharePrototype: sharePrototype,
	}
}

// SetSharePrototype : Allow user to set SharePrototype
func (_options *CreateShareOptions) SetSharePrototype(sharePrototype SharePrototypeIntf) *CreateShareOptions {
	_options.SharePrototype = sharePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateShareOptions) SetHeaders(param map[string]string) *CreateShareOptions {
	options.Headers = param
	return options
}

// CreateShareSnapshotOptions : The CreateShareSnapshot options.
type CreateShareSnapshotOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The name for this share snapshot. The name must not be used by another snapshot for the file share. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this share snapshot.
	UserTags []string `json:"user_tags,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateShareSnapshotOptions : Instantiate CreateShareSnapshotOptions
func (*VpcV1) NewCreateShareSnapshotOptions(shareID string) *CreateShareSnapshotOptions {
	return &CreateShareSnapshotOptions{
		ShareID: core.StringPtr(shareID),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *CreateShareSnapshotOptions) SetShareID(shareID string) *CreateShareSnapshotOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateShareSnapshotOptions) SetName(name string) *CreateShareSnapshotOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetUserTags : Allow user to set UserTags
func (_options *CreateShareSnapshotOptions) SetUserTags(userTags []string) *CreateShareSnapshotOptions {
	_options.UserTags = userTags
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateShareSnapshotOptions) SetHeaders(param map[string]string) *CreateShareSnapshotOptions {
	options.Headers = param
	return options
}

// CreateSnapshotCloneOptions : The CreateSnapshotClone options.
type CreateSnapshotCloneOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The zone name.
	ZoneName *string `json:"zone_name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSnapshotCloneOptions : Instantiate CreateSnapshotCloneOptions
func (*VpcV1) NewCreateSnapshotCloneOptions(id string, zoneName string) *CreateSnapshotCloneOptions {
	return &CreateSnapshotCloneOptions{
		ID:       core.StringPtr(id),
		ZoneName: core.StringPtr(zoneName),
	}
}

// SetID : Allow user to set ID
func (_options *CreateSnapshotCloneOptions) SetID(id string) *CreateSnapshotCloneOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *CreateSnapshotCloneOptions) SetZoneName(zoneName string) *CreateSnapshotCloneOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSnapshotCloneOptions) SetHeaders(param map[string]string) *CreateSnapshotCloneOptions {
	options.Headers = param
	return options
}

// CreateSnapshotConsistencyGroupOptions : The CreateSnapshotConsistencyGroup options.
type CreateSnapshotConsistencyGroupOptions struct {
	// The snapshot consistency group prototype object.
	SnapshotConsistencyGroupPrototype SnapshotConsistencyGroupPrototypeIntf `json:"SnapshotConsistencyGroupPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSnapshotConsistencyGroupOptions : Instantiate CreateSnapshotConsistencyGroupOptions
func (*VpcV1) NewCreateSnapshotConsistencyGroupOptions(snapshotConsistencyGroupPrototype SnapshotConsistencyGroupPrototypeIntf) *CreateSnapshotConsistencyGroupOptions {
	return &CreateSnapshotConsistencyGroupOptions{
		SnapshotConsistencyGroupPrototype: snapshotConsistencyGroupPrototype,
	}
}

// SetSnapshotConsistencyGroupPrototype : Allow user to set SnapshotConsistencyGroupPrototype
func (_options *CreateSnapshotConsistencyGroupOptions) SetSnapshotConsistencyGroupPrototype(snapshotConsistencyGroupPrototype SnapshotConsistencyGroupPrototypeIntf) *CreateSnapshotConsistencyGroupOptions {
	_options.SnapshotConsistencyGroupPrototype = snapshotConsistencyGroupPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSnapshotConsistencyGroupOptions) SetHeaders(param map[string]string) *CreateSnapshotConsistencyGroupOptions {
	options.Headers = param
	return options
}

// CreateSnapshotOptions : The CreateSnapshot options.
type CreateSnapshotOptions struct {
	// The snapshot prototype object.
	SnapshotPrototype SnapshotPrototypeIntf `json:"SnapshotPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSnapshotOptions : Instantiate CreateSnapshotOptions
func (*VpcV1) NewCreateSnapshotOptions(snapshotPrototype SnapshotPrototypeIntf) *CreateSnapshotOptions {
	return &CreateSnapshotOptions{
		SnapshotPrototype: snapshotPrototype,
	}
}

// SetSnapshotPrototype : Allow user to set SnapshotPrototype
func (_options *CreateSnapshotOptions) SetSnapshotPrototype(snapshotPrototype SnapshotPrototypeIntf) *CreateSnapshotOptions {
	_options.SnapshotPrototype = snapshotPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSnapshotOptions) SetHeaders(param map[string]string) *CreateSnapshotOptions {
	options.Headers = param
	return options
}

// CreateSubnetOptions : The CreateSubnet options.
type CreateSubnetOptions struct {
	// The subnet prototype object.
	SubnetPrototype SubnetPrototypeIntf `json:"SubnetPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSubnetOptions : Instantiate CreateSubnetOptions
func (*VpcV1) NewCreateSubnetOptions(subnetPrototype SubnetPrototypeIntf) *CreateSubnetOptions {
	return &CreateSubnetOptions{
		SubnetPrototype: subnetPrototype,
	}
}

// SetSubnetPrototype : Allow user to set SubnetPrototype
func (_options *CreateSubnetOptions) SetSubnetPrototype(subnetPrototype SubnetPrototypeIntf) *CreateSubnetOptions {
	_options.SubnetPrototype = subnetPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSubnetOptions) SetHeaders(param map[string]string) *CreateSubnetOptions {
	options.Headers = param
	return options
}

// CreateSubnetReservedIPOptions : The CreateSubnetReservedIP options.
type CreateSubnetReservedIPOptions struct {
	// The subnet identifier.
	SubnetID *string `json:"subnet_id" validate:"required,ne="`

	// The IP address to reserve, which must not already be reserved on the subnet.
	//
	// If unspecified, an available address on the subnet will automatically be selected.
	Address *string `json:"address,omitempty"`

	// Indicates whether this reserved IP member will be automatically deleted when either
	// `target` is deleted, or the reserved IP is unbound. Must be `false` if the reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this reserved IP. The name must not be used by another reserved IP in the subnet. Names starting with
	// `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified, the name will be a hyphenated
	// list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The target to bind this reserved IP to.  The target must be in the same VPC.
	//
	// The following targets are supported:
	// - An endpoint gateway not already bound to a reserved IP in the subnet's zone.
	// - A virtual network interface.
	//
	// If unspecified, the reserved IP will be created unbound.
	Target ReservedIPTargetPrototypeIntf `json:"target,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateSubnetReservedIPOptions : Instantiate CreateSubnetReservedIPOptions
func (*VpcV1) NewCreateSubnetReservedIPOptions(subnetID string) *CreateSubnetReservedIPOptions {
	return &CreateSubnetReservedIPOptions{
		SubnetID: core.StringPtr(subnetID),
	}
}

// SetSubnetID : Allow user to set SubnetID
func (_options *CreateSubnetReservedIPOptions) SetSubnetID(subnetID string) *CreateSubnetReservedIPOptions {
	_options.SubnetID = core.StringPtr(subnetID)
	return _options
}

// SetAddress : Allow user to set Address
func (_options *CreateSubnetReservedIPOptions) SetAddress(address string) *CreateSubnetReservedIPOptions {
	_options.Address = core.StringPtr(address)
	return _options
}

// SetAutoDelete : Allow user to set AutoDelete
func (_options *CreateSubnetReservedIPOptions) SetAutoDelete(autoDelete bool) *CreateSubnetReservedIPOptions {
	_options.AutoDelete = core.BoolPtr(autoDelete)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateSubnetReservedIPOptions) SetName(name string) *CreateSubnetReservedIPOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetTarget : Allow user to set Target
func (_options *CreateSubnetReservedIPOptions) SetTarget(target ReservedIPTargetPrototypeIntf) *CreateSubnetReservedIPOptions {
	_options.Target = target
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateSubnetReservedIPOptions) SetHeaders(param map[string]string) *CreateSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// CreateVirtualNetworkInterfaceOptions : The CreateVirtualNetworkInterface options.
type CreateVirtualNetworkInterfaceOptions struct {
	// Indicates whether source IP spoofing is allowed on this interface. If `false`, source IP spoofing is prevented on
	// this interface. If `true`, source IP spoofing is allowed on this interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// Indicates whether this virtual network interface will be automatically deleted when
	// `target` is deleted. Must be `false` if the virtual network interface is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the virtual network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - Can only be attached to a `target` with a `resource_type` of
	//   `bare_metal_server_network_attachment`.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The additional IP addresses to bind to the virtual network interface. Each item may be either a reserved IP
	// identity, or a reserved IP prototype object which will be used to create a new reserved IP. All IP addresses must be
	// in the primary IP's subnet.
	//
	// If reserved IP identities are provided, the specified reserved IPs must be unbound.
	//
	// If reserved IP prototype objects with addresses are provided, the addresses must be available on the virtual network
	// interface's subnet. For any prototype objects that do not specify an address, an available address on the subnet
	// will be automatically selected and reserved.
	Ips []VirtualNetworkInterfaceIPPrototypeIntf `json:"ips,omitempty"`

	// The name for this virtual network interface. The name must not be used by another virtual network interface in the
	// VPC. If unspecified, the name will be a hyphenated list of randomly-selected words. Names beginning with `ibm-` are
	// reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the virtual network interface. May be either a
	// reserved IP identity, or a reserved IP prototype object which will be used to create a
	// new reserved IP.
	//
	// If a reserved IP identity is provided, the specified reserved IP must be unbound.
	//
	// If a reserved IP prototype object with an address is provided, the address must be
	// available on the virtual network interface's subnet. If no address is specified,
	// an available address on the subnet will be automatically selected and reserved.
	PrimaryIP VirtualNetworkInterfacePrimaryIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The protocol state filtering mode to use for this virtual network interface. If
	// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
	// resource type:
	//
	// - `bare_metal_server_network_attachment`: disabled
	// - `instance_network_attachment`: enabled
	// - `share_mount_target`: enabled
	//
	// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
	// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
	// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
	ProtocolStateFilteringMode *string `json:"protocol_state_filtering_mode,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The security groups to use for this virtual network interface. If unspecified, the default security group of the VPC
	// for the subnet is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet. Required if `primary_ip` does not specify a reserved IP
	// identity.
	Subnet SubnetIdentityIntf `json:"subnet,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVirtualNetworkInterfaceOptions.ProtocolStateFilteringMode property.
// The protocol state filtering mode to use for this virtual network interface. If
// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
// resource type:
//
// - `bare_metal_server_network_attachment`: disabled
// - `instance_network_attachment`: enabled
// - `share_mount_target`: enabled
//
// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
const (
	CreateVirtualNetworkInterfaceOptionsProtocolStateFilteringModeAutoConst     = "auto"
	CreateVirtualNetworkInterfaceOptionsProtocolStateFilteringModeDisabledConst = "disabled"
	CreateVirtualNetworkInterfaceOptionsProtocolStateFilteringModeEnabledConst  = "enabled"
)

// NewCreateVirtualNetworkInterfaceOptions : Instantiate CreateVirtualNetworkInterfaceOptions
func (*VpcV1) NewCreateVirtualNetworkInterfaceOptions() *CreateVirtualNetworkInterfaceOptions {
	return &CreateVirtualNetworkInterfaceOptions{}
}

// SetAllowIPSpoofing : Allow user to set AllowIPSpoofing
func (_options *CreateVirtualNetworkInterfaceOptions) SetAllowIPSpoofing(allowIPSpoofing bool) *CreateVirtualNetworkInterfaceOptions {
	_options.AllowIPSpoofing = core.BoolPtr(allowIPSpoofing)
	return _options
}

// SetAutoDelete : Allow user to set AutoDelete
func (_options *CreateVirtualNetworkInterfaceOptions) SetAutoDelete(autoDelete bool) *CreateVirtualNetworkInterfaceOptions {
	_options.AutoDelete = core.BoolPtr(autoDelete)
	return _options
}

// SetEnableInfrastructureNat : Allow user to set EnableInfrastructureNat
func (_options *CreateVirtualNetworkInterfaceOptions) SetEnableInfrastructureNat(enableInfrastructureNat bool) *CreateVirtualNetworkInterfaceOptions {
	_options.EnableInfrastructureNat = core.BoolPtr(enableInfrastructureNat)
	return _options
}

// SetIps : Allow user to set Ips
func (_options *CreateVirtualNetworkInterfaceOptions) SetIps(ips []VirtualNetworkInterfaceIPPrototypeIntf) *CreateVirtualNetworkInterfaceOptions {
	_options.Ips = ips
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVirtualNetworkInterfaceOptions) SetName(name string) *CreateVirtualNetworkInterfaceOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetPrimaryIP : Allow user to set PrimaryIP
func (_options *CreateVirtualNetworkInterfaceOptions) SetPrimaryIP(primaryIP VirtualNetworkInterfacePrimaryIPPrototypeIntf) *CreateVirtualNetworkInterfaceOptions {
	_options.PrimaryIP = primaryIP
	return _options
}

// SetProtocolStateFilteringMode : Allow user to set ProtocolStateFilteringMode
func (_options *CreateVirtualNetworkInterfaceOptions) SetProtocolStateFilteringMode(protocolStateFilteringMode string) *CreateVirtualNetworkInterfaceOptions {
	_options.ProtocolStateFilteringMode = core.StringPtr(protocolStateFilteringMode)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateVirtualNetworkInterfaceOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateVirtualNetworkInterfaceOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetSecurityGroups : Allow user to set SecurityGroups
func (_options *CreateVirtualNetworkInterfaceOptions) SetSecurityGroups(securityGroups []SecurityGroupIdentityIntf) *CreateVirtualNetworkInterfaceOptions {
	_options.SecurityGroups = securityGroups
	return _options
}

// SetSubnet : Allow user to set Subnet
func (_options *CreateVirtualNetworkInterfaceOptions) SetSubnet(subnet SubnetIdentityIntf) *CreateVirtualNetworkInterfaceOptions {
	_options.Subnet = subnet
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVirtualNetworkInterfaceOptions) SetHeaders(param map[string]string) *CreateVirtualNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// CreateVolumeOptions : The CreateVolume options.
type CreateVolumeOptions struct {
	// The volume prototype object.
	VolumePrototype VolumePrototypeIntf `json:"VolumePrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateVolumeOptions : Instantiate CreateVolumeOptions
func (*VpcV1) NewCreateVolumeOptions(volumePrototype VolumePrototypeIntf) *CreateVolumeOptions {
	return &CreateVolumeOptions{
		VolumePrototype: volumePrototype,
	}
}

// SetVolumePrototype : Allow user to set VolumePrototype
func (_options *CreateVolumeOptions) SetVolumePrototype(volumePrototype VolumePrototypeIntf) *CreateVolumeOptions {
	_options.VolumePrototype = volumePrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVolumeOptions) SetHeaders(param map[string]string) *CreateVolumeOptions {
	options.Headers = param
	return options
}

// CreateVPCAddressPrefixOptions : The CreateVPCAddressPrefix options.
type CreateVPCAddressPrefixOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The IPv4 range of the address prefix, expressed in CIDR format. The range must not overlap with any existing address
	// prefixes in the VPC or any of the following reserved address ranges:
	//
	//   - `127.0.0.0/8` (IPv4 loopback addresses)
	//   - `161.26.0.0/16` (IBM services)
	//   - `166.8.0.0/14` (Cloud Service Endpoints)
	//   - `169.254.0.0/16` (IPv4 link-local addresses)
	//   - `224.0.0.0/4` (IPv4 multicast addresses)
	//
	// The prefix length of the address prefix's CIDR must be between `/9` (8,388,608 addresses) and `/29` (8 addresses).
	CIDR *string `json:"cidr" validate:"required"`

	// The zone this address prefix will reside in.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// Indicates whether this will be the default address prefix for this zone in this VPC. If `true`, the VPC must not
	// have a default address prefix for this zone.
	IsDefault *bool `json:"is_default,omitempty"`

	// The name for this address prefix. The name must not be used by another address prefix for the VPC. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateVPCAddressPrefixOptions : Instantiate CreateVPCAddressPrefixOptions
func (*VpcV1) NewCreateVPCAddressPrefixOptions(vpcID string, cidr string, zone ZoneIdentityIntf) *CreateVPCAddressPrefixOptions {
	return &CreateVPCAddressPrefixOptions{
		VPCID: core.StringPtr(vpcID),
		CIDR:  core.StringPtr(cidr),
		Zone:  zone,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *CreateVPCAddressPrefixOptions) SetVPCID(vpcID string) *CreateVPCAddressPrefixOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *CreateVPCAddressPrefixOptions) SetCIDR(cidr string) *CreateVPCAddressPrefixOptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreateVPCAddressPrefixOptions) SetZone(zone ZoneIdentityIntf) *CreateVPCAddressPrefixOptions {
	_options.Zone = zone
	return _options
}

// SetIsDefault : Allow user to set IsDefault
func (_options *CreateVPCAddressPrefixOptions) SetIsDefault(isDefault bool) *CreateVPCAddressPrefixOptions {
	_options.IsDefault = core.BoolPtr(isDefault)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPCAddressPrefixOptions) SetName(name string) *CreateVPCAddressPrefixOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPCAddressPrefixOptions) SetHeaders(param map[string]string) *CreateVPCAddressPrefixOptions {
	options.Headers = param
	return options
}

// CreateVPCDnsResolutionBindingOptions : The CreateVPCDnsResolutionBinding options.
type CreateVPCDnsResolutionBindingOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The VPC to bind this VPC to for DNS resolution. The VPC must be different from the VPC
	// specified in the URL, must have `dns.enable_hub` set to `true`, and may be in a
	// different account (subject to IAM policies).
	//
	// Additionally, the VPC specified in the URL (this VPC) must have `dns.enable_hub` set
	// to `false` and a `dns.resolution_binding_count` of zero.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The name for this DNS resolution binding. The name must not be used by another DNS resolution binding for the VPC.
	// If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateVPCDnsResolutionBindingOptions : Instantiate CreateVPCDnsResolutionBindingOptions
func (*VpcV1) NewCreateVPCDnsResolutionBindingOptions(vpcID string, vpc VPCIdentityIntf) *CreateVPCDnsResolutionBindingOptions {
	return &CreateVPCDnsResolutionBindingOptions{
		VPCID: core.StringPtr(vpcID),
		VPC:   vpc,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *CreateVPCDnsResolutionBindingOptions) SetVPCID(vpcID string) *CreateVPCDnsResolutionBindingOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPC : Allow user to set VPC
func (_options *CreateVPCDnsResolutionBindingOptions) SetVPC(vpc VPCIdentityIntf) *CreateVPCDnsResolutionBindingOptions {
	_options.VPC = vpc
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPCDnsResolutionBindingOptions) SetName(name string) *CreateVPCDnsResolutionBindingOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPCDnsResolutionBindingOptions) SetHeaders(param map[string]string) *CreateVPCDnsResolutionBindingOptions {
	options.Headers = param
	return options
}

// CreateVPCOptions : The CreateVPC options.
type CreateVPCOptions struct {
	// Indicates whether a [default address prefix](https://cloud.ibm.com/docs/vpc?topic=vpc-configuring-address-prefixes)
	// will be automatically created for each zone in this VPC. If `manual`, this VPC will be created with no default
	// address prefixes.
	//
	// Since address prefixes are managed identically regardless of whether they were automatically created, the value is
	// not preserved as a VPC property.
	AddressPrefixManagement *string `json:"address_prefix_management,omitempty"`

	// Indicates whether this VPC will be connected to Classic Infrastructure. If true, this VPC's resources will have
	// private network connectivity to the account's Classic Infrastructure resources. Only one VPC, per region, may be
	// connected in this way. This value is set at creation and subsequently immutable.
	//
	// This property has been deprecated. Instead, use a [Transit Gateway](https://cloud.ibm.com/docs/transit-gateway) to
	// connect this VPC to Classic Infrastructure. For more information, see [upcoming
	// changes](https://cloud.ibm.com/docs/vpc?topic=vpc-api-change-log#upcoming-changes).
	// Deprecated: this field is deprecated and may be removed in a future release.
	ClassicAccess *bool `json:"classic_access,omitempty"`

	// The DNS configuration for this VPC.
	//
	// If unspecified, the system will assign DNS servers capable of resolving hosts and endpoint
	// gateways within this VPC, and hosts on the internet.
	Dns *VpcdnsPrototype `json:"dns,omitempty"`

	// The name for this VPC. The name must not be used by another VPC in the region. If unspecified, the name will be a
	// hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVPCOptions.AddressPrefixManagement property.
// Indicates whether a [default address prefix](https://cloud.ibm.com/docs/vpc?topic=vpc-configuring-address-prefixes)
// will be automatically created for each zone in this VPC. If `manual`, this VPC will be created with no default
// address prefixes.
//
// Since address prefixes are managed identically regardless of whether they were automatically created, the value is
// not preserved as a VPC property.
const (
	CreateVPCOptionsAddressPrefixManagementAutoConst   = "auto"
	CreateVPCOptionsAddressPrefixManagementManualConst = "manual"
)

// NewCreateVPCOptions : Instantiate CreateVPCOptions
func (*VpcV1) NewCreateVPCOptions() *CreateVPCOptions {
	return &CreateVPCOptions{}
}

// SetAddressPrefixManagement : Allow user to set AddressPrefixManagement
func (_options *CreateVPCOptions) SetAddressPrefixManagement(addressPrefixManagement string) *CreateVPCOptions {
	_options.AddressPrefixManagement = core.StringPtr(addressPrefixManagement)
	return _options
}

// SetClassicAccess : Allow user to set ClassicAccess
// Deprecated: this method is deprecated and may be removed in a future release.
func (_options *CreateVPCOptions) SetClassicAccess(classicAccess bool) *CreateVPCOptions {
	_options.ClassicAccess = core.BoolPtr(classicAccess)
	return _options
}

// SetDns : Allow user to set Dns
func (_options *CreateVPCOptions) SetDns(dns *VpcdnsPrototype) *CreateVPCOptions {
	_options.Dns = dns
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPCOptions) SetName(name string) *CreateVPCOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateVPCOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateVPCOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPCOptions) SetHeaders(param map[string]string) *CreateVPCOptions {
	options.Headers = param
	return options
}

// CreateVPCRouteOptions : The CreateVPCRoute options.
type CreateVPCRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The destination CIDR of the route. The host identifier in the CIDR must be zero.
	//
	// At most two routes per `zone` in a table can have the same `destination` and
	// `priority`, and only if both routes have an `action` of `deliver` and the `next_hop` is an IP address.
	Destination *string `json:"destination" validate:"required"`

	// The zone to apply the route to.
	//
	// If subnets are attached to the route's routing table, egress traffic from those
	// subnets in this zone will be subject to this route. If this route's routing table
	// has any of `route_direct_link_ingress`, `route_internet_ingress`,
	// `route_transit_gateway_ingress` or `route_vpc_zone_ingress`  set to`true`, traffic
	// from those ingress sources arriving in this zone will be subject to this route.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// The action to perform with a packet matching the route:
	// - `delegate`: delegate to system-provided routes
	// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
	// - `deliver`: deliver the packet to the specified `next_hop`
	// - `drop`: drop the packet.
	Action *string `json:"action,omitempty"`

	// Indicates whether this route will be advertised to the ingress sources specified by the `advertise_routes_to`
	// routing table property.
	//
	// All routes in a routing table with the same `destination` and `zone` must have the same
	// `advertise` value.
	Advertise *bool `json:"advertise,omitempty"`

	// The name for this route. The name must not be used by another route in the routing table. Names starting with `ibm-`
	// are reserved for system-provided routes, and are not allowed. If unspecified, the name will be a hyphenated list of
	// randomly-selected words.
	Name *string `json:"name,omitempty"`

	// If `action` is `deliver`, the next hop that packets will be delivered to (must not be
	// `0.0.0.0`). For other `action` values, it must be omitted or specified as `0.0.0.0`.
	//
	// At most two routes per `zone` in a table can have the same `destination` and `priority`,
	// and only when each route has an `action` of `deliver` and `next_hop` is an IP address.
	NextHop RouteNextHopPrototypeIntf `json:"next_hop,omitempty"`

	// The priority of this route. Smaller values have higher priority.
	//
	// If a routing table contains multiple routes with the same `zone` and `destination`, the route with the highest
	// priority (smallest value) is selected. If two routes have the same `destination` and `priority`, traffic is
	// distributed between them.
	Priority *int64 `json:"priority,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVPCRouteOptions.Action property.
// The action to perform with a packet matching the route:
// - `delegate`: delegate to system-provided routes
// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
// - `deliver`: deliver the packet to the specified `next_hop`
// - `drop`: drop the packet.
const (
	CreateVPCRouteOptionsActionDelegateConst    = "delegate"
	CreateVPCRouteOptionsActionDelegateVPCConst = "delegate_vpc"
	CreateVPCRouteOptionsActionDeliverConst     = "deliver"
	CreateVPCRouteOptionsActionDropConst        = "drop"
)

// NewCreateVPCRouteOptions : Instantiate CreateVPCRouteOptions
func (*VpcV1) NewCreateVPCRouteOptions(vpcID string, destination string, zone ZoneIdentityIntf) *CreateVPCRouteOptions {
	return &CreateVPCRouteOptions{
		VPCID:       core.StringPtr(vpcID),
		Destination: core.StringPtr(destination),
		Zone:        zone,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *CreateVPCRouteOptions) SetVPCID(vpcID string) *CreateVPCRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetDestination : Allow user to set Destination
func (_options *CreateVPCRouteOptions) SetDestination(destination string) *CreateVPCRouteOptions {
	_options.Destination = core.StringPtr(destination)
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreateVPCRouteOptions) SetZone(zone ZoneIdentityIntf) *CreateVPCRouteOptions {
	_options.Zone = zone
	return _options
}

// SetAction : Allow user to set Action
func (_options *CreateVPCRouteOptions) SetAction(action string) *CreateVPCRouteOptions {
	_options.Action = core.StringPtr(action)
	return _options
}

// SetAdvertise : Allow user to set Advertise
func (_options *CreateVPCRouteOptions) SetAdvertise(advertise bool) *CreateVPCRouteOptions {
	_options.Advertise = core.BoolPtr(advertise)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPCRouteOptions) SetName(name string) *CreateVPCRouteOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetNextHop : Allow user to set NextHop
func (_options *CreateVPCRouteOptions) SetNextHop(nextHop RouteNextHopPrototypeIntf) *CreateVPCRouteOptions {
	_options.NextHop = nextHop
	return _options
}

// SetPriority : Allow user to set Priority
func (_options *CreateVPCRouteOptions) SetPriority(priority int64) *CreateVPCRouteOptions {
	_options.Priority = core.Int64Ptr(priority)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPCRouteOptions) SetHeaders(param map[string]string) *CreateVPCRouteOptions {
	options.Headers = param
	return options
}

// CreateVPCRoutingTableOptions : The CreateVPCRoutingTable options.
type CreateVPCRoutingTableOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The filters specifying the resources that may create routes in this routing table.
	//
	// If specified, `resource_type` must be `vpn_gateway` or `vpn_server`.
	AcceptRoutesFrom []ResourceFilter `json:"accept_routes_from,omitempty"`

	// The ingress sources to advertise routes to. Routes in the table with `advertise` enabled will be advertised to these
	// sources.
	AdvertiseRoutesTo []string `json:"advertise_routes_to,omitempty"`

	// The name for this routing table. The name must not be used by another routing table in the VPC. If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// If set to `true`, this routing table will be used to route traffic that originates from [Direct
	// Link](https://cloud.ibm.com/docs/dl) to this VPC. The VPC must not already have a routing table with this property
	// set to `true`.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	//
	// If [Classic Access](https://cloud.ibm.com/docs/vpc?topic=vpc-setting-up-access-to-classic-infrastructure) is enabled
	// for this VPC, and this property is set to `true`, its incoming traffic will also be routed according to this routing
	// table.
	RouteDirectLinkIngress *bool `json:"route_direct_link_ingress,omitempty"`

	// If set to `true`, this routing table will be used to route traffic that originates from the internet. For this to
	// succeed, the VPC must not already have a routing table with this property set to `true`.
	//
	// Incoming traffic will be routed according to the routing table with two exceptions:
	// - Traffic destined for IP addresses associated with public gateways will not be
	//   subject to routes in this routing table.
	// - Routes with an `action` of `deliver` are treated as `drop` unless the `next_hop` is
	//   an IP address in a subnet in the route's `zone` that is able to accept traffic.
	//   Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	//   connection, the packet will be dropped.
	RouteInternetIngress *bool `json:"route_internet_ingress,omitempty"`

	// If set to `true`, this routing table will be used to route traffic that originates from [Transit
	// Gateway](https://cloud.ibm.com/docs/transit-gateway) to this VPC. The VPC must not already have a routing table with
	// this property set to `true`.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteTransitGatewayIngress *bool `json:"route_transit_gateway_ingress,omitempty"`

	// If set to `true`, this routing table will be used to route traffic that originates from subnets in other zones in
	// this VPC. The VPC must not already have a routing table with this property set to `true`.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteVPCZoneIngress *bool `json:"route_vpc_zone_ingress,omitempty"`

	// The prototype objects for routes to create for this routing table. If unspecified, the routing table will be created
	// with no routes.
	Routes []RoutePrototype `json:"routes,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVPCRoutingTableOptions.AdvertiseRoutesTo property.
// An ingress source that routes can be advertised to:
//
// - `direct_link` (requires `route_direct_link_ingress` be set to `true`)
// - `transit_gateway` (requires `route_transit_gateway_ingress` be set to `true`).
const (
	CreateVPCRoutingTableOptionsAdvertiseRoutesToDirectLinkConst     = "direct_link"
	CreateVPCRoutingTableOptionsAdvertiseRoutesToTransitGatewayConst = "transit_gateway"
)

// NewCreateVPCRoutingTableOptions : Instantiate CreateVPCRoutingTableOptions
func (*VpcV1) NewCreateVPCRoutingTableOptions(vpcID string) *CreateVPCRoutingTableOptions {
	return &CreateVPCRoutingTableOptions{
		VPCID: core.StringPtr(vpcID),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *CreateVPCRoutingTableOptions) SetVPCID(vpcID string) *CreateVPCRoutingTableOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetAcceptRoutesFrom : Allow user to set AcceptRoutesFrom
func (_options *CreateVPCRoutingTableOptions) SetAcceptRoutesFrom(acceptRoutesFrom []ResourceFilter) *CreateVPCRoutingTableOptions {
	_options.AcceptRoutesFrom = acceptRoutesFrom
	return _options
}

// SetAdvertiseRoutesTo : Allow user to set AdvertiseRoutesTo
func (_options *CreateVPCRoutingTableOptions) SetAdvertiseRoutesTo(advertiseRoutesTo []string) *CreateVPCRoutingTableOptions {
	_options.AdvertiseRoutesTo = advertiseRoutesTo
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPCRoutingTableOptions) SetName(name string) *CreateVPCRoutingTableOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetRouteDirectLinkIngress : Allow user to set RouteDirectLinkIngress
func (_options *CreateVPCRoutingTableOptions) SetRouteDirectLinkIngress(routeDirectLinkIngress bool) *CreateVPCRoutingTableOptions {
	_options.RouteDirectLinkIngress = core.BoolPtr(routeDirectLinkIngress)
	return _options
}

// SetRouteInternetIngress : Allow user to set RouteInternetIngress
func (_options *CreateVPCRoutingTableOptions) SetRouteInternetIngress(routeInternetIngress bool) *CreateVPCRoutingTableOptions {
	_options.RouteInternetIngress = core.BoolPtr(routeInternetIngress)
	return _options
}

// SetRouteTransitGatewayIngress : Allow user to set RouteTransitGatewayIngress
func (_options *CreateVPCRoutingTableOptions) SetRouteTransitGatewayIngress(routeTransitGatewayIngress bool) *CreateVPCRoutingTableOptions {
	_options.RouteTransitGatewayIngress = core.BoolPtr(routeTransitGatewayIngress)
	return _options
}

// SetRouteVPCZoneIngress : Allow user to set RouteVPCZoneIngress
func (_options *CreateVPCRoutingTableOptions) SetRouteVPCZoneIngress(routeVPCZoneIngress bool) *CreateVPCRoutingTableOptions {
	_options.RouteVPCZoneIngress = core.BoolPtr(routeVPCZoneIngress)
	return _options
}

// SetRoutes : Allow user to set Routes
func (_options *CreateVPCRoutingTableOptions) SetRoutes(routes []RoutePrototype) *CreateVPCRoutingTableOptions {
	_options.Routes = routes
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPCRoutingTableOptions) SetHeaders(param map[string]string) *CreateVPCRoutingTableOptions {
	options.Headers = param
	return options
}

// CreateVPCRoutingTableRouteOptions : The CreateVPCRoutingTableRoute options.
type CreateVPCRoutingTableRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	RoutingTableID *string `json:"routing_table_id" validate:"required,ne="`

	// The destination CIDR of the route. The host identifier in the CIDR must be zero.
	//
	// At most two routes per `zone` in a table can have the same `destination` and
	// `priority`, and only if both routes have an `action` of `deliver` and the `next_hop` is an IP address.
	Destination *string `json:"destination" validate:"required"`

	// The zone to apply the route to.
	//
	// If subnets are attached to the route's routing table, egress traffic from those
	// subnets in this zone will be subject to this route. If this route's routing table
	// has any of `route_direct_link_ingress`, `route_internet_ingress`,
	// `route_transit_gateway_ingress` or `route_vpc_zone_ingress`  set to`true`, traffic
	// from those ingress sources arriving in this zone will be subject to this route.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`

	// The action to perform with a packet matching the route:
	// - `delegate`: delegate to system-provided routes
	// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
	// - `deliver`: deliver the packet to the specified `next_hop`
	// - `drop`: drop the packet.
	Action *string `json:"action,omitempty"`

	// Indicates whether this route will be advertised to the ingress sources specified by the `advertise_routes_to`
	// routing table property.
	//
	// All routes in a routing table with the same `destination` and `zone` must have the same
	// `advertise` value.
	Advertise *bool `json:"advertise,omitempty"`

	// The name for this route. The name must not be used by another route in the routing table. Names starting with `ibm-`
	// are reserved for system-provided routes, and are not allowed. If unspecified, the name will be a hyphenated list of
	// randomly-selected words.
	Name *string `json:"name,omitempty"`

	// If `action` is `deliver`, the next hop that packets will be delivered to (must not be
	// `0.0.0.0`). For other `action` values, it must be omitted or specified as `0.0.0.0`.
	//
	// At most two routes per `zone` in a table can have the same `destination` and `priority`,
	// and only when each route has an `action` of `deliver` and `next_hop` is an IP address.
	NextHop RouteNextHopPrototypeIntf `json:"next_hop,omitempty"`

	// The priority of this route. Smaller values have higher priority.
	//
	// If a routing table contains multiple routes with the same `zone` and `destination`, the route with the highest
	// priority (smallest value) is selected. If two routes have the same `destination` and `priority`, traffic is
	// distributed between them.
	Priority *int64 `json:"priority,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVPCRoutingTableRouteOptions.Action property.
// The action to perform with a packet matching the route:
// - `delegate`: delegate to system-provided routes
// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
// - `deliver`: deliver the packet to the specified `next_hop`
// - `drop`: drop the packet.
const (
	CreateVPCRoutingTableRouteOptionsActionDelegateConst    = "delegate"
	CreateVPCRoutingTableRouteOptionsActionDelegateVPCConst = "delegate_vpc"
	CreateVPCRoutingTableRouteOptionsActionDeliverConst     = "deliver"
	CreateVPCRoutingTableRouteOptionsActionDropConst        = "drop"
)

// NewCreateVPCRoutingTableRouteOptions : Instantiate CreateVPCRoutingTableRouteOptions
func (*VpcV1) NewCreateVPCRoutingTableRouteOptions(vpcID string, routingTableID string, destination string, zone ZoneIdentityIntf) *CreateVPCRoutingTableRouteOptions {
	return &CreateVPCRoutingTableRouteOptions{
		VPCID:          core.StringPtr(vpcID),
		RoutingTableID: core.StringPtr(routingTableID),
		Destination:    core.StringPtr(destination),
		Zone:           zone,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *CreateVPCRoutingTableRouteOptions) SetVPCID(vpcID string) *CreateVPCRoutingTableRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetRoutingTableID : Allow user to set RoutingTableID
func (_options *CreateVPCRoutingTableRouteOptions) SetRoutingTableID(routingTableID string) *CreateVPCRoutingTableRouteOptions {
	_options.RoutingTableID = core.StringPtr(routingTableID)
	return _options
}

// SetDestination : Allow user to set Destination
func (_options *CreateVPCRoutingTableRouteOptions) SetDestination(destination string) *CreateVPCRoutingTableRouteOptions {
	_options.Destination = core.StringPtr(destination)
	return _options
}

// SetZone : Allow user to set Zone
func (_options *CreateVPCRoutingTableRouteOptions) SetZone(zone ZoneIdentityIntf) *CreateVPCRoutingTableRouteOptions {
	_options.Zone = zone
	return _options
}

// SetAction : Allow user to set Action
func (_options *CreateVPCRoutingTableRouteOptions) SetAction(action string) *CreateVPCRoutingTableRouteOptions {
	_options.Action = core.StringPtr(action)
	return _options
}

// SetAdvertise : Allow user to set Advertise
func (_options *CreateVPCRoutingTableRouteOptions) SetAdvertise(advertise bool) *CreateVPCRoutingTableRouteOptions {
	_options.Advertise = core.BoolPtr(advertise)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPCRoutingTableRouteOptions) SetName(name string) *CreateVPCRoutingTableRouteOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetNextHop : Allow user to set NextHop
func (_options *CreateVPCRoutingTableRouteOptions) SetNextHop(nextHop RouteNextHopPrototypeIntf) *CreateVPCRoutingTableRouteOptions {
	_options.NextHop = nextHop
	return _options
}

// SetPriority : Allow user to set Priority
func (_options *CreateVPCRoutingTableRouteOptions) SetPriority(priority int64) *CreateVPCRoutingTableRouteOptions {
	_options.Priority = core.Int64Ptr(priority)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPCRoutingTableRouteOptions) SetHeaders(param map[string]string) *CreateVPCRoutingTableRouteOptions {
	options.Headers = param
	return options
}

// CreateVPNGatewayConnectionOptions : The CreateVPNGatewayConnection options.
type CreateVPNGatewayConnectionOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection prototype object.
	VPNGatewayConnectionPrototype VPNGatewayConnectionPrototypeIntf `json:"VPNGatewayConnectionPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateVPNGatewayConnectionOptions : Instantiate CreateVPNGatewayConnectionOptions
func (*VpcV1) NewCreateVPNGatewayConnectionOptions(vpnGatewayID string, vpnGatewayConnectionPrototype VPNGatewayConnectionPrototypeIntf) *CreateVPNGatewayConnectionOptions {
	return &CreateVPNGatewayConnectionOptions{
		VPNGatewayID:                  core.StringPtr(vpnGatewayID),
		VPNGatewayConnectionPrototype: vpnGatewayConnectionPrototype,
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *CreateVPNGatewayConnectionOptions) SetVPNGatewayID(vpnGatewayID string) *CreateVPNGatewayConnectionOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetVPNGatewayConnectionPrototype : Allow user to set VPNGatewayConnectionPrototype
func (_options *CreateVPNGatewayConnectionOptions) SetVPNGatewayConnectionPrototype(vpnGatewayConnectionPrototype VPNGatewayConnectionPrototypeIntf) *CreateVPNGatewayConnectionOptions {
	_options.VPNGatewayConnectionPrototype = vpnGatewayConnectionPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPNGatewayConnectionOptions) SetHeaders(param map[string]string) *CreateVPNGatewayConnectionOptions {
	options.Headers = param
	return options
}

// CreateVPNGatewayOptions : The CreateVPNGateway options.
type CreateVPNGatewayOptions struct {
	// The VPN gateway prototype object.
	VPNGatewayPrototype VPNGatewayPrototypeIntf `json:"VPNGatewayPrototype" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewCreateVPNGatewayOptions : Instantiate CreateVPNGatewayOptions
func (*VpcV1) NewCreateVPNGatewayOptions(vpnGatewayPrototype VPNGatewayPrototypeIntf) *CreateVPNGatewayOptions {
	return &CreateVPNGatewayOptions{
		VPNGatewayPrototype: vpnGatewayPrototype,
	}
}

// SetVPNGatewayPrototype : Allow user to set VPNGatewayPrototype
func (_options *CreateVPNGatewayOptions) SetVPNGatewayPrototype(vpnGatewayPrototype VPNGatewayPrototypeIntf) *CreateVPNGatewayOptions {
	_options.VPNGatewayPrototype = vpnGatewayPrototype
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPNGatewayOptions) SetHeaders(param map[string]string) *CreateVPNGatewayOptions {
	options.Headers = param
	return options
}

// CreateVPNServerOptions : The CreateVPNServer options.
type CreateVPNServerOptions struct {
	// The certificate instance for this VPN server.
	Certificate CertificateInstanceIdentityIntf `json:"certificate" validate:"required"`

	// The methods used to authenticate VPN clients to this VPN server. VPN clients must authenticate against all specified
	// methods.
	ClientAuthentication []VPNServerAuthenticationPrototypeIntf `json:"client_authentication" validate:"required"`

	// The VPN client IPv4 address pool, expressed in CIDR format. The request must not overlap with any existing address
	// prefixes in the VPC or any of the following reserved address ranges:
	//   - `127.0.0.0/8` (IPv4 loopback addresses)
	//   - `161.26.0.0/16` (IBM services)
	//   - `166.8.0.0/14` (Cloud Service Endpoints)
	//   - `169.254.0.0/16` (IPv4 link-local addresses)
	//   - `224.0.0.0/4` (IPv4 multicast addresses)
	//
	// The prefix length of the client IP address pool's CIDR must be between
	// `/9` (8,388,608 addresses) and `/22` (1024 addresses). A CIDR block that contains twice the number of IP addresses
	// that are required to enable the maximum number of concurrent connections is recommended.
	ClientIPPool *string `json:"client_ip_pool" validate:"required"`

	// The subnets to provision this VPN server in.  Use subnets in different zones for high availability.
	Subnets []SubnetIdentityIntf `json:"subnets" validate:"required"`

	// The DNS server addresses that will be provided to VPN clients connected to this VPN server.
	ClientDnsServerIps []IP `json:"client_dns_server_ips,omitempty"`

	// The seconds a VPN client can be idle before this VPN server will disconnect it.   Specify `0` to prevent the server
	// from disconnecting idle clients.
	ClientIdleTimeout *int64 `json:"client_idle_timeout,omitempty"`

	// Indicates whether the split tunneling is enabled on this VPN server.
	EnableSplitTunneling *bool `json:"enable_split_tunneling,omitempty"`

	// The name for this VPN server. The name must not be used by another VPN server in the VPC. If unspecified, the name
	// will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The port number to use for this VPN server.
	Port *int64 `json:"port,omitempty"`

	// The transport protocol to use for this VPN server.
	Protocol *string `json:"protocol,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The security groups to use for this VPN server. If unspecified, the VPC's default security group is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVPNServerOptions.Protocol property.
// The transport protocol to use for this VPN server.
const (
	CreateVPNServerOptionsProtocolTCPConst = "tcp"
	CreateVPNServerOptionsProtocolUDPConst = "udp"
)

// NewCreateVPNServerOptions : Instantiate CreateVPNServerOptions
func (*VpcV1) NewCreateVPNServerOptions(certificate CertificateInstanceIdentityIntf, clientAuthentication []VPNServerAuthenticationPrototypeIntf, clientIPPool string, subnets []SubnetIdentityIntf) *CreateVPNServerOptions {
	return &CreateVPNServerOptions{
		Certificate:          certificate,
		ClientAuthentication: clientAuthentication,
		ClientIPPool:         core.StringPtr(clientIPPool),
		Subnets:              subnets,
	}
}

// SetCertificate : Allow user to set Certificate
func (_options *CreateVPNServerOptions) SetCertificate(certificate CertificateInstanceIdentityIntf) *CreateVPNServerOptions {
	_options.Certificate = certificate
	return _options
}

// SetClientAuthentication : Allow user to set ClientAuthentication
func (_options *CreateVPNServerOptions) SetClientAuthentication(clientAuthentication []VPNServerAuthenticationPrototypeIntf) *CreateVPNServerOptions {
	_options.ClientAuthentication = clientAuthentication
	return _options
}

// SetClientIPPool : Allow user to set ClientIPPool
func (_options *CreateVPNServerOptions) SetClientIPPool(clientIPPool string) *CreateVPNServerOptions {
	_options.ClientIPPool = core.StringPtr(clientIPPool)
	return _options
}

// SetSubnets : Allow user to set Subnets
func (_options *CreateVPNServerOptions) SetSubnets(subnets []SubnetIdentityIntf) *CreateVPNServerOptions {
	_options.Subnets = subnets
	return _options
}

// SetClientDnsServerIps : Allow user to set ClientDnsServerIps
func (_options *CreateVPNServerOptions) SetClientDnsServerIps(clientDnsServerIps []IP) *CreateVPNServerOptions {
	_options.ClientDnsServerIps = clientDnsServerIps
	return _options
}

// SetClientIdleTimeout : Allow user to set ClientIdleTimeout
func (_options *CreateVPNServerOptions) SetClientIdleTimeout(clientIdleTimeout int64) *CreateVPNServerOptions {
	_options.ClientIdleTimeout = core.Int64Ptr(clientIdleTimeout)
	return _options
}

// SetEnableSplitTunneling : Allow user to set EnableSplitTunneling
func (_options *CreateVPNServerOptions) SetEnableSplitTunneling(enableSplitTunneling bool) *CreateVPNServerOptions {
	_options.EnableSplitTunneling = core.BoolPtr(enableSplitTunneling)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPNServerOptions) SetName(name string) *CreateVPNServerOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetPort : Allow user to set Port
func (_options *CreateVPNServerOptions) SetPort(port int64) *CreateVPNServerOptions {
	_options.Port = core.Int64Ptr(port)
	return _options
}

// SetProtocol : Allow user to set Protocol
func (_options *CreateVPNServerOptions) SetProtocol(protocol string) *CreateVPNServerOptions {
	_options.Protocol = core.StringPtr(protocol)
	return _options
}

// SetResourceGroup : Allow user to set ResourceGroup
func (_options *CreateVPNServerOptions) SetResourceGroup(resourceGroup ResourceGroupIdentityIntf) *CreateVPNServerOptions {
	_options.ResourceGroup = resourceGroup
	return _options
}

// SetSecurityGroups : Allow user to set SecurityGroups
func (_options *CreateVPNServerOptions) SetSecurityGroups(securityGroups []SecurityGroupIdentityIntf) *CreateVPNServerOptions {
	_options.SecurityGroups = securityGroups
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPNServerOptions) SetHeaders(param map[string]string) *CreateVPNServerOptions {
	options.Headers = param
	return options
}

// CreateVPNServerRouteOptions : The CreateVPNServerRoute options.
type CreateVPNServerRouteOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The destination to use for this VPN route in the VPN server. Must be unique within the VPN server. If an incoming
	// packet does not match any destination, it will be dropped.
	Destination *string `json:"destination" validate:"required"`

	// The action to perform with a packet matching the VPN route:
	// - `translate`: translate the source IP address to one of the private IP addresses of
	//   the VPN server, then deliver the packet to target.
	// - `deliver`: deliver the packet to the target.
	// - `drop`: drop the packet.
	Action *string `json:"action,omitempty"`

	// The name for this VPN server route. The name must not be used by another route for the VPN server. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the CreateVPNServerRouteOptions.Action property.
// The action to perform with a packet matching the VPN route:
//   - `translate`: translate the source IP address to one of the private IP addresses of
//     the VPN server, then deliver the packet to target.
//   - `deliver`: deliver the packet to the target.
//   - `drop`: drop the packet.
const (
	CreateVPNServerRouteOptionsActionDeliverConst   = "deliver"
	CreateVPNServerRouteOptionsActionDropConst      = "drop"
	CreateVPNServerRouteOptionsActionTranslateConst = "translate"
)

// NewCreateVPNServerRouteOptions : Instantiate CreateVPNServerRouteOptions
func (*VpcV1) NewCreateVPNServerRouteOptions(vpnServerID string, destination string) *CreateVPNServerRouteOptions {
	return &CreateVPNServerRouteOptions{
		VPNServerID: core.StringPtr(vpnServerID),
		Destination: core.StringPtr(destination),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *CreateVPNServerRouteOptions) SetVPNServerID(vpnServerID string) *CreateVPNServerRouteOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetDestination : Allow user to set Destination
func (_options *CreateVPNServerRouteOptions) SetDestination(destination string) *CreateVPNServerRouteOptions {
	_options.Destination = core.StringPtr(destination)
	return _options
}

// SetAction : Allow user to set Action
func (_options *CreateVPNServerRouteOptions) SetAction(action string) *CreateVPNServerRouteOptions {
	_options.Action = core.StringPtr(action)
	return _options
}

// SetName : Allow user to set Name
func (_options *CreateVPNServerRouteOptions) SetName(name string) *CreateVPNServerRouteOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *CreateVPNServerRouteOptions) SetHeaders(param map[string]string) *CreateVPNServerRouteOptions {
	options.Headers = param
	return options
}

// DnsInstanceIdentity : Identifies a DNS instance by a unique property.
// Models which "extend" this model:
// - DnsInstanceIdentityByCRN
type DnsInstanceIdentity struct {
	// The CRN for this DNS instance.
	CRN *string `json:"crn,omitempty"`
}

func (*DnsInstanceIdentity) isaDnsInstanceIdentity() bool {
	return true
}

type DnsInstanceIdentityIntf interface {
	isaDnsInstanceIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalDnsInstanceIdentity unmarshals an instance of DnsInstanceIdentity from the specified map of raw messages.
func UnmarshalDnsInstanceIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DnsInstanceIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the DnsInstanceIdentity
func (dnsInstanceIdentity *DnsInstanceIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(dnsInstanceIdentity.CRN) {
		_patch["crn"] = dnsInstanceIdentity.CRN
	}

	return
}

// DnsInstanceReferenceLoadBalancerDnsContext : DnsInstanceReferenceLoadBalancerDnsContext struct
type DnsInstanceReferenceLoadBalancerDnsContext struct {
	// The CRN for this DNS instance.
	CRN *string `json:"crn" validate:"required"`
}

// UnmarshalDnsInstanceReferenceLoadBalancerDnsContext unmarshals an instance of DnsInstanceReferenceLoadBalancerDnsContext from the specified map of raw messages.
func UnmarshalDnsInstanceReferenceLoadBalancerDnsContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DnsInstanceReferenceLoadBalancerDnsContext)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DnsServer : A DNS server.
type DnsServer struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address" validate:"required"`

	// If present, DHCP configuration for this zone will have this DNS server listed first.
	ZoneAffinity *ZoneReference `json:"zone_affinity,omitempty"`
}

// UnmarshalDnsServer unmarshals an instance of DnsServer from the specified map of raw messages.
func UnmarshalDnsServer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DnsServer)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone_affinity", &obj.ZoneAffinity, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone_affinity-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DnsServerPrototype : DnsServerPrototype struct
type DnsServerPrototype struct {
	// The DNS server IPv4 address.
	Address *string `json:"address,omitempty"`

	// If specified, DHCP configuration for the specified zone will have this DNS server listed
	// first.
	ZoneAffinity ZoneIdentityIntf `json:"zone_affinity,omitempty"`
}

// UnmarshalDnsServerPrototype unmarshals an instance of DnsServerPrototype from the specified map of raw messages.
func UnmarshalDnsServerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DnsServerPrototype)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone_affinity", &obj.ZoneAffinity, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone_affinity-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the DnsServerPrototype
func (dnsServerPrototype *DnsServerPrototype) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(dnsServerPrototype.Address) {
		_patch["address"] = dnsServerPrototype.Address
	}
	if !core.IsNil(dnsServerPrototype.ZoneAffinity) {
		_patch["zone_affinity"] = dnsServerPrototype.ZoneAffinity.asPatch()
	}

	return
}

// DnsZoneIdentity : Identifies a DNS zone by a unique property.
// Models which "extend" this model:
// - DnsZoneIdentityByID
type DnsZoneIdentity struct {
	ID *string `json:"id,omitempty"`
}

func (*DnsZoneIdentity) isaDnsZoneIdentity() bool {
	return true
}

type DnsZoneIdentityIntf interface {
	isaDnsZoneIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalDnsZoneIdentity unmarshals an instance of DnsZoneIdentity from the specified map of raw messages.
func UnmarshalDnsZoneIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DnsZoneIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the DnsZoneIdentity
func (dnsZoneIdentity *DnsZoneIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(dnsZoneIdentity.ID) {
		_patch["id"] = dnsZoneIdentity.ID
	}

	return
}

// DnsZoneReference : DnsZoneReference struct
type DnsZoneReference struct {
	ID *string `json:"id" validate:"required"`
}

// UnmarshalDnsZoneReference unmarshals an instance of DnsZoneReference from the specified map of raw messages.
func UnmarshalDnsZoneReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DnsZoneReference)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHost : DedicatedHost struct
type DedicatedHost struct {
	// The amount of memory in gibibytes that is currently available for instances.
	AvailableMemory *int64 `json:"available_memory" validate:"required"`

	// The available VCPU for the dedicated host.
	AvailableVcpu *Vcpu `json:"available_vcpu" validate:"required"`

	// The date and time that the dedicated host was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this dedicated host.
	CRN *string `json:"crn" validate:"required"`

	// The disks for the dedicated host.
	Disks []DedicatedHostDisk `json:"disks" validate:"required"`

	// The dedicated host group this dedicated host is in.
	Group *DedicatedHostGroupReference `json:"group" validate:"required"`

	// The URL for this dedicated host.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this dedicated host.
	ID *string `json:"id" validate:"required"`

	// If set to true, instances can be placed on this dedicated host.
	InstancePlacementEnabled *bool `json:"instance_placement_enabled" validate:"required"`

	// The instances that are allocated to this dedicated host.
	Instances []InstanceReference `json:"instances" validate:"required"`

	// The lifecycle state of the dedicated host.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The total amount of memory in gibibytes for this host.
	Memory *int64 `json:"memory" validate:"required"`

	// The name for this dedicated host. The name is unique across all dedicated hosts in the region.
	Name *string `json:"name" validate:"required"`

	// The dedicated host NUMA configuration.
	Numa *DedicatedHostNuma `json:"numa" validate:"required"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-dh-profiles) for this
	// dedicated host.
	Profile *DedicatedHostProfileReference `json:"profile" validate:"required"`

	// Indicates whether this dedicated host is available for instance creation.
	Provisionable *bool `json:"provisionable" validate:"required"`

	// The resource group for this dedicated host.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The total number of sockets for this host.
	SocketCount *int64 `json:"socket_count" validate:"required"`

	// The administrative state of the dedicated host.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	State *string `json:"state" validate:"required"`

	// The instance profiles usable by instances placed on this dedicated host.
	SupportedInstanceProfiles []InstanceProfileReference `json:"supported_instance_profiles" validate:"required"`

	// The total VCPU of the dedicated host.
	Vcpu *Vcpu `json:"vcpu" validate:"required"`

	// The zone this dedicated host resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the DedicatedHost.LifecycleState property.
// The lifecycle state of the dedicated host.
const (
	DedicatedHostLifecycleStateDeletingConst  = "deleting"
	DedicatedHostLifecycleStateFailedConst    = "failed"
	DedicatedHostLifecycleStatePendingConst   = "pending"
	DedicatedHostLifecycleStateStableConst    = "stable"
	DedicatedHostLifecycleStateSuspendedConst = "suspended"
	DedicatedHostLifecycleStateUpdatingConst  = "updating"
	DedicatedHostLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the DedicatedHost.ResourceType property.
// The resource type.
const (
	DedicatedHostResourceTypeDedicatedHostConst = "dedicated_host"
)

// Constants associated with the DedicatedHost.State property.
// The administrative state of the dedicated host.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	DedicatedHostStateAvailableConst   = "available"
	DedicatedHostStateDegradedConst    = "degraded"
	DedicatedHostStateMigratingConst   = "migrating"
	DedicatedHostStateUnavailableConst = "unavailable"
)

// UnmarshalDedicatedHost unmarshals an instance of DedicatedHost from the specified map of raw messages.
func UnmarshalDedicatedHost(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHost)
	err = core.UnmarshalPrimitive(m, "available_memory", &obj.AvailableMemory)
	if err != nil {
		err = core.SDKErrorf(err, "", "available_memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "available_vcpu", &obj.AvailableVcpu, UnmarshalVcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "available_vcpu-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalDedicatedHostDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "group", &obj.Group, UnmarshalDedicatedHostGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance_placement_enabled", &obj.InstancePlacementEnabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_placement_enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instances", &obj.Instances, UnmarshalInstanceReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instances-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "memory", &obj.Memory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "numa", &obj.Numa, UnmarshalDedicatedHostNuma)
	if err != nil {
		err = core.SDKErrorf(err, "", "numa-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalDedicatedHostProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisionable", &obj.Provisionable)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisionable-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "socket_count", &obj.SocketCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "socket_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "state", &obj.State)
	if err != nil {
		err = core.SDKErrorf(err, "", "state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_instance_profiles", &obj.SupportedInstanceProfiles, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_instance_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu", &obj.Vcpu, UnmarshalVcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostCollection : DedicatedHostCollection struct
type DedicatedHostCollection struct {
	// A page of dedicated hosts.
	DedicatedHosts []DedicatedHost `json:"dedicated_hosts" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalDedicatedHostCollection unmarshals an instance of DedicatedHostCollection from the specified map of raw messages.
func UnmarshalDedicatedHostCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostCollection)
	err = core.UnmarshalModel(m, "dedicated_hosts", &obj.DedicatedHosts, UnmarshalDedicatedHost)
	if err != nil {
		err = core.SDKErrorf(err, "", "dedicated_hosts-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *DedicatedHostCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// DedicatedHostDisk : DedicatedHostDisk struct
type DedicatedHostDisk struct {
	// The remaining space left for instance placement in GB (gigabytes).
	Available *int64 `json:"available" validate:"required"`

	// The date and time that the disk was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this disk.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this disk.
	ID *string `json:"id" validate:"required"`

	// The instance disks that are on this dedicated host disk.
	InstanceDisks []InstanceDiskReference `json:"instance_disks" validate:"required"`

	// The disk interface used for attaching the disk.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The lifecycle state of this dedicated host disk.
	LifecycleState *string `json:"lifecycle_state,omitempty"`

	// The name for this dedicated host disk. The name is unique across all disks on the dedicated host.
	Name *string `json:"name" validate:"required"`

	// Indicates whether this dedicated host disk is available for instance disk creation.
	Provisionable *bool `json:"provisionable" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The size of the disk in GB (gigabytes).
	Size *int64 `json:"size" validate:"required"`

	// The instance disk interfaces supported for this dedicated host disk.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	SupportedInstanceInterfaceTypes []string `json:"supported_instance_interface_types" validate:"required"`
}

// Constants associated with the DedicatedHostDisk.InterfaceType property.
// The disk interface used for attaching the disk.
const (
	DedicatedHostDiskInterfaceTypeNvmeConst = "nvme"
)

// Constants associated with the DedicatedHostDisk.LifecycleState property.
// The lifecycle state of this dedicated host disk.
const (
	DedicatedHostDiskLifecycleStateDeletingConst  = "deleting"
	DedicatedHostDiskLifecycleStateFailedConst    = "failed"
	DedicatedHostDiskLifecycleStatePendingConst   = "pending"
	DedicatedHostDiskLifecycleStateStableConst    = "stable"
	DedicatedHostDiskLifecycleStateSuspendedConst = "suspended"
	DedicatedHostDiskLifecycleStateUpdatingConst  = "updating"
	DedicatedHostDiskLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the DedicatedHostDisk.ResourceType property.
// The resource type.
const (
	DedicatedHostDiskResourceTypeDedicatedHostDiskConst = "dedicated_host_disk"
)

// Constants associated with the DedicatedHostDisk.SupportedInstanceInterfaceTypes property.
// The disk interface used for attaching the disk.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	DedicatedHostDiskSupportedInstanceInterfaceTypesNvmeConst      = "nvme"
	DedicatedHostDiskSupportedInstanceInterfaceTypesVirtioBlkConst = "virtio_blk"
)

// UnmarshalDedicatedHostDisk unmarshals an instance of DedicatedHostDisk from the specified map of raw messages.
func UnmarshalDedicatedHostDisk(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostDisk)
	err = core.UnmarshalPrimitive(m, "available", &obj.Available)
	if err != nil {
		err = core.SDKErrorf(err, "", "available-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_disks", &obj.InstanceDisks, UnmarshalInstanceDiskReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisionable", &obj.Provisionable)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisionable-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "supported_instance_interface_types", &obj.SupportedInstanceInterfaceTypes)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_instance_interface_types-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostDiskCollection : DedicatedHostDiskCollection struct
type DedicatedHostDiskCollection struct {
	// The disks for the dedicated host.
	Disks []DedicatedHostDisk `json:"disks" validate:"required"`
}

// UnmarshalDedicatedHostDiskCollection unmarshals an instance of DedicatedHostDiskCollection from the specified map of raw messages.
func UnmarshalDedicatedHostDiskCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostDiskCollection)
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalDedicatedHostDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostDiskPatch : DedicatedHostDiskPatch struct
type DedicatedHostDiskPatch struct {
	// The name for this dedicated host disk. The name must not be used by another disk on the dedicated host.
	Name *string `json:"name,omitempty"`
}

// UnmarshalDedicatedHostDiskPatch unmarshals an instance of DedicatedHostDiskPatch from the specified map of raw messages.
func UnmarshalDedicatedHostDiskPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostDiskPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the DedicatedHostDiskPatch
func (dedicatedHostDiskPatch *DedicatedHostDiskPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(dedicatedHostDiskPatch.Name) {
		_patch["name"] = dedicatedHostDiskPatch.Name
	}

	return
}

// DedicatedHostGroup : DedicatedHostGroup struct
type DedicatedHostGroup struct {
	// The dedicated host profile class for hosts in this group.
	Class *string `json:"class" validate:"required"`

	// The date and time that the dedicated host group was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this dedicated host group.
	CRN *string `json:"crn" validate:"required"`

	// The dedicated hosts that are in this dedicated host group.
	DedicatedHosts []DedicatedHostReference `json:"dedicated_hosts" validate:"required"`

	// The dedicated host profile family for hosts in this group.
	Family *string `json:"family" validate:"required"`

	// The URL for this dedicated host group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this dedicated host group.
	ID *string `json:"id" validate:"required"`

	// The name for this dedicated host group. The name is unique across all dedicated host groups in the region.
	Name *string `json:"name" validate:"required"`

	// The resource group for this dedicated host group.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The instance profiles usable by instances placed on this dedicated host group.
	SupportedInstanceProfiles []InstanceProfileReference `json:"supported_instance_profiles" validate:"required"`

	// The zone this dedicated host group resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the DedicatedHostGroup.Family property.
// The dedicated host profile family for hosts in this group.
const (
	DedicatedHostGroupFamilyBalancedConst = "balanced"
	DedicatedHostGroupFamilyComputeConst  = "compute"
	DedicatedHostGroupFamilyMemoryConst   = "memory"
)

// Constants associated with the DedicatedHostGroup.ResourceType property.
// The resource type.
const (
	DedicatedHostGroupResourceTypeDedicatedHostGroupConst = "dedicated_host_group"
)

// UnmarshalDedicatedHostGroup unmarshals an instance of DedicatedHostGroup from the specified map of raw messages.
func UnmarshalDedicatedHostGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostGroup)
	err = core.UnmarshalPrimitive(m, "class", &obj.Class)
	if err != nil {
		err = core.SDKErrorf(err, "", "class-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "dedicated_hosts", &obj.DedicatedHosts, UnmarshalDedicatedHostReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "dedicated_hosts-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_instance_profiles", &obj.SupportedInstanceProfiles, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_instance_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostGroupCollection : DedicatedHostGroupCollection struct
type DedicatedHostGroupCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of dedicated host groups.
	Groups []DedicatedHostGroup `json:"groups" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalDedicatedHostGroupCollection unmarshals an instance of DedicatedHostGroupCollection from the specified map of raw messages.
func UnmarshalDedicatedHostGroupCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostGroupCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "groups", &obj.Groups, UnmarshalDedicatedHostGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *DedicatedHostGroupCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// DedicatedHostGroupIdentity : Identifies a dedicated host group by a unique property.
// Models which "extend" this model:
// - DedicatedHostGroupIdentityByID
// - DedicatedHostGroupIdentityByCRN
// - DedicatedHostGroupIdentityByHref
type DedicatedHostGroupIdentity struct {
	// The unique identifier for this dedicated host group.
	ID *string `json:"id,omitempty"`

	// The CRN for this dedicated host group.
	CRN *string `json:"crn,omitempty"`

	// The URL for this dedicated host group.
	Href *string `json:"href,omitempty"`
}

func (*DedicatedHostGroupIdentity) isaDedicatedHostGroupIdentity() bool {
	return true
}

type DedicatedHostGroupIdentityIntf interface {
	isaDedicatedHostGroupIdentity() bool
}

// UnmarshalDedicatedHostGroupIdentity unmarshals an instance of DedicatedHostGroupIdentity from the specified map of raw messages.
func UnmarshalDedicatedHostGroupIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostGroupIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostGroupPatch : DedicatedHostGroupPatch struct
type DedicatedHostGroupPatch struct {
	// The name for this dedicated host group. The name must not be used by another dedicated host group in the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalDedicatedHostGroupPatch unmarshals an instance of DedicatedHostGroupPatch from the specified map of raw messages.
func UnmarshalDedicatedHostGroupPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostGroupPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the DedicatedHostGroupPatch
func (dedicatedHostGroupPatch *DedicatedHostGroupPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(dedicatedHostGroupPatch.Name) {
		_patch["name"] = dedicatedHostGroupPatch.Name
	}

	return
}

// DedicatedHostGroupPrototypeDedicatedHostByZoneContext : DedicatedHostGroupPrototypeDedicatedHostByZoneContext struct
type DedicatedHostGroupPrototypeDedicatedHostByZoneContext struct {
	// The name for this dedicated host group. The name must not be used by another dedicated host group in the region. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the host's resource group is used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`
}

// UnmarshalDedicatedHostGroupPrototypeDedicatedHostByZoneContext unmarshals an instance of DedicatedHostGroupPrototypeDedicatedHostByZoneContext from the specified map of raw messages.
func UnmarshalDedicatedHostGroupPrototypeDedicatedHostByZoneContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostGroupPrototypeDedicatedHostByZoneContext)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostGroupReference : DedicatedHostGroupReference struct
type DedicatedHostGroupReference struct {
	// The CRN for this dedicated host group.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this dedicated host group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this dedicated host group.
	ID *string `json:"id" validate:"required"`

	// The name for this dedicated host group. The name is unique across all dedicated host groups in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the DedicatedHostGroupReference.ResourceType property.
// The resource type.
const (
	DedicatedHostGroupReferenceResourceTypeDedicatedHostGroupConst = "dedicated_host_group"
)

// UnmarshalDedicatedHostGroupReference unmarshals an instance of DedicatedHostGroupReference from the specified map of raw messages.
func UnmarshalDedicatedHostGroupReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostGroupReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostNuma : The dedicated host NUMA configuration.
type DedicatedHostNuma struct {
	// The total number of NUMA nodes for this dedicated host.
	Count *int64 `json:"count" validate:"required"`

	// The NUMA nodes for this dedicated host.
	Nodes []DedicatedHostNumaNode `json:"nodes" validate:"required"`
}

// UnmarshalDedicatedHostNuma unmarshals an instance of DedicatedHostNuma from the specified map of raw messages.
func UnmarshalDedicatedHostNuma(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostNuma)
	err = core.UnmarshalPrimitive(m, "count", &obj.Count)
	if err != nil {
		err = core.SDKErrorf(err, "", "count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "nodes", &obj.Nodes, UnmarshalDedicatedHostNumaNode)
	if err != nil {
		err = core.SDKErrorf(err, "", "nodes-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostNumaNode : The dedicated host NUMA node configuration.
type DedicatedHostNumaNode struct {
	// The available VCPU for this NUMA node.
	AvailableVcpu *int64 `json:"available_vcpu" validate:"required"`

	// The total VCPU capacity for this NUMA node.
	Vcpu *int64 `json:"vcpu" validate:"required"`
}

// UnmarshalDedicatedHostNumaNode unmarshals an instance of DedicatedHostNumaNode from the specified map of raw messages.
func UnmarshalDedicatedHostNumaNode(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostNumaNode)
	err = core.UnmarshalPrimitive(m, "available_vcpu", &obj.AvailableVcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "available_vcpu-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "vcpu", &obj.Vcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostPatch : DedicatedHostPatch struct
type DedicatedHostPatch struct {
	// If set to true, instances can be placed on this dedicated host.
	InstancePlacementEnabled *bool `json:"instance_placement_enabled,omitempty"`

	// The name for this dedicated host. The name must not be used by another dedicated host in the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalDedicatedHostPatch unmarshals an instance of DedicatedHostPatch from the specified map of raw messages.
func UnmarshalDedicatedHostPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostPatch)
	err = core.UnmarshalPrimitive(m, "instance_placement_enabled", &obj.InstancePlacementEnabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_placement_enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the DedicatedHostPatch
func (dedicatedHostPatch *DedicatedHostPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(dedicatedHostPatch.InstancePlacementEnabled) {
		_patch["instance_placement_enabled"] = dedicatedHostPatch.InstancePlacementEnabled
	}
	if !core.IsNil(dedicatedHostPatch.Name) {
		_patch["name"] = dedicatedHostPatch.Name
	}

	return
}

// DedicatedHostProfile : DedicatedHostProfile struct
type DedicatedHostProfile struct {
	// The product class this dedicated host profile belongs to.
	Class *string `json:"class" validate:"required"`

	// The disks for a dedicated host with this profile.
	Disks []DedicatedHostProfileDisk `json:"disks" validate:"required"`

	// The product family this dedicated host profile belongs to
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Family *string `json:"family" validate:"required"`

	// The URL for this dedicated host.
	Href *string `json:"href" validate:"required"`

	Memory DedicatedHostProfileMemoryIntf `json:"memory" validate:"required"`

	// The globally unique name for this dedicated host profile.
	Name *string `json:"name" validate:"required"`

	SocketCount DedicatedHostProfileSocketIntf `json:"socket_count" validate:"required"`

	// The status of the dedicated host profile:
	// - `previous`: This dedicated host profile is an older revision, but remains provisionable
	//   and usable.
	// - `current`: This dedicated host profile is the latest revision.
	//
	// Revisions are indicated by the generation of a dedicated host profile. Refer to the [profile naming
	// conventions](https://cloud.ibm.com/docs/vpc?topic=vpc-dh-profiles&interface=ui#profiles-naming-rule) for information
	// on how generations are defined within a dedicated host profile.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The instance profiles usable by instances placed on dedicated hosts with this profile.
	SupportedInstanceProfiles []InstanceProfileReference `json:"supported_instance_profiles" validate:"required"`

	VcpuArchitecture *DedicatedHostProfileVcpuArchitecture `json:"vcpu_architecture" validate:"required"`

	VcpuCount DedicatedHostProfileVcpuIntf `json:"vcpu_count" validate:"required"`

	VcpuManufacturer *DedicatedHostProfileVcpuManufacturer `json:"vcpu_manufacturer" validate:"required"`
}

// Constants associated with the DedicatedHostProfile.Family property.
// The product family this dedicated host profile belongs to
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	DedicatedHostProfileFamilyBalancedConst = "balanced"
	DedicatedHostProfileFamilyComputeConst  = "compute"
	DedicatedHostProfileFamilyMemoryConst   = "memory"
)

// Constants associated with the DedicatedHostProfile.Status property.
// The status of the dedicated host profile:
//   - `previous`: This dedicated host profile is an older revision, but remains provisionable
//     and usable.
//   - `current`: This dedicated host profile is the latest revision.
//
// Revisions are indicated by the generation of a dedicated host profile. Refer to the [profile naming
// conventions](https://cloud.ibm.com/docs/vpc?topic=vpc-dh-profiles&interface=ui#profiles-naming-rule) for information
// on how generations are defined within a dedicated host profile.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	DedicatedHostProfileStatusCurrentConst  = "current"
	DedicatedHostProfileStatusPreviousConst = "previous"
)

// UnmarshalDedicatedHostProfile unmarshals an instance of DedicatedHostProfile from the specified map of raw messages.
func UnmarshalDedicatedHostProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfile)
	err = core.UnmarshalPrimitive(m, "class", &obj.Class)
	if err != nil {
		err = core.SDKErrorf(err, "", "class-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalDedicatedHostProfileDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "memory", &obj.Memory, UnmarshalDedicatedHostProfileMemory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "socket_count", &obj.SocketCount, UnmarshalDedicatedHostProfileSocket)
	if err != nil {
		err = core.SDKErrorf(err, "", "socket_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_instance_profiles", &obj.SupportedInstanceProfiles, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_instance_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu_architecture", &obj.VcpuArchitecture, UnmarshalDedicatedHostProfileVcpuArchitecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu_architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu_count", &obj.VcpuCount, UnmarshalDedicatedHostProfileVcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu_manufacturer", &obj.VcpuManufacturer, UnmarshalDedicatedHostProfileVcpuManufacturer)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu_manufacturer-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileCollection : DedicatedHostProfileCollection struct
type DedicatedHostProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of dedicated host profiles.
	Profiles []DedicatedHostProfile `json:"profiles" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalDedicatedHostProfileCollection unmarshals an instance of DedicatedHostProfileCollection from the specified map of raw messages.
func UnmarshalDedicatedHostProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profiles", &obj.Profiles, UnmarshalDedicatedHostProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *DedicatedHostProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// DedicatedHostProfileDisk : Disks provided by this profile.
type DedicatedHostProfileDisk struct {
	InterfaceType *DedicatedHostProfileDiskInterface `json:"interface_type" validate:"required"`

	// The number of disks of this type for a dedicated host with this profile.
	Quantity *DedicatedHostProfileDiskQuantity `json:"quantity" validate:"required"`

	// The size of the disk in GB (gigabytes).
	Size *DedicatedHostProfileDiskSize `json:"size" validate:"required"`

	SupportedInstanceInterfaceTypes *DedicatedHostProfileDiskSupportedInterfaces `json:"supported_instance_interface_types" validate:"required"`
}

// UnmarshalDedicatedHostProfileDisk unmarshals an instance of DedicatedHostProfileDisk from the specified map of raw messages.
func UnmarshalDedicatedHostProfileDisk(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileDisk)
	err = core.UnmarshalModel(m, "interface_type", &obj.InterfaceType, UnmarshalDedicatedHostProfileDiskInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "quantity", &obj.Quantity, UnmarshalDedicatedHostProfileDiskQuantity)
	if err != nil {
		err = core.SDKErrorf(err, "", "quantity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "size", &obj.Size, UnmarshalDedicatedHostProfileDiskSize)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_instance_interface_types", &obj.SupportedInstanceInterfaceTypes, UnmarshalDedicatedHostProfileDiskSupportedInterfaces)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_instance_interface_types-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileDiskInterface : DedicatedHostProfileDiskInterface struct
type DedicatedHostProfileDiskInterface struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The interface of the disk for a dedicated host with this profile
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the DedicatedHostProfileDiskInterface.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileDiskInterfaceTypeFixedConst = "fixed"
)

// Constants associated with the DedicatedHostProfileDiskInterface.Value property.
// The interface of the disk for a dedicated host with this profile
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	DedicatedHostProfileDiskInterfaceValueNvmeConst = "nvme"
)

// UnmarshalDedicatedHostProfileDiskInterface unmarshals an instance of DedicatedHostProfileDiskInterface from the specified map of raw messages.
func UnmarshalDedicatedHostProfileDiskInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileDiskInterface)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileDiskQuantity : The number of disks of this type for a dedicated host with this profile.
type DedicatedHostProfileDiskQuantity struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The value for this profile field.
	Value *int64 `json:"value" validate:"required"`
}

// Constants associated with the DedicatedHostProfileDiskQuantity.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileDiskQuantityTypeFixedConst = "fixed"
)

// UnmarshalDedicatedHostProfileDiskQuantity unmarshals an instance of DedicatedHostProfileDiskQuantity from the specified map of raw messages.
func UnmarshalDedicatedHostProfileDiskQuantity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileDiskQuantity)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileDiskSize : The size of the disk in GB (gigabytes).
type DedicatedHostProfileDiskSize struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The size of the disk in GB (gigabytes).
	Value *int64 `json:"value" validate:"required"`
}

// Constants associated with the DedicatedHostProfileDiskSize.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileDiskSizeTypeFixedConst = "fixed"
)

// UnmarshalDedicatedHostProfileDiskSize unmarshals an instance of DedicatedHostProfileDiskSize from the specified map of raw messages.
func UnmarshalDedicatedHostProfileDiskSize(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileDiskSize)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileDiskSupportedInterfaces : DedicatedHostProfileDiskSupportedInterfaces struct
type DedicatedHostProfileDiskSupportedInterfaces struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The instance disk interfaces supported for a dedicated host with this profile.
	Value []string `json:"value" validate:"required"`
}

// Constants associated with the DedicatedHostProfileDiskSupportedInterfaces.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileDiskSupportedInterfacesTypeFixedConst = "fixed"
)

// Constants associated with the DedicatedHostProfileDiskSupportedInterfaces.Value property.
// The disk interface used for attaching the disk.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	DedicatedHostProfileDiskSupportedInterfacesValueNvmeConst      = "nvme"
	DedicatedHostProfileDiskSupportedInterfacesValueVirtioBlkConst = "virtio_blk"
)

// UnmarshalDedicatedHostProfileDiskSupportedInterfaces unmarshals an instance of DedicatedHostProfileDiskSupportedInterfaces from the specified map of raw messages.
func UnmarshalDedicatedHostProfileDiskSupportedInterfaces(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileDiskSupportedInterfaces)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileIdentity : Identifies a dedicated host profile by a unique property.
// Models which "extend" this model:
// - DedicatedHostProfileIdentityByName
// - DedicatedHostProfileIdentityByHref
type DedicatedHostProfileIdentity struct {
	// The globally unique name for this dedicated host profile.
	Name *string `json:"name,omitempty"`

	// The URL for this dedicated host profile.
	Href *string `json:"href,omitempty"`
}

func (*DedicatedHostProfileIdentity) isaDedicatedHostProfileIdentity() bool {
	return true
}

type DedicatedHostProfileIdentityIntf interface {
	isaDedicatedHostProfileIdentity() bool
}

// UnmarshalDedicatedHostProfileIdentity unmarshals an instance of DedicatedHostProfileIdentity from the specified map of raw messages.
func UnmarshalDedicatedHostProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileMemory : DedicatedHostProfileMemory struct
// Models which "extend" this model:
// - DedicatedHostProfileMemoryFixed
// - DedicatedHostProfileMemoryRange
// - DedicatedHostProfileMemoryEnum
// - DedicatedHostProfileMemoryDependent
type DedicatedHostProfileMemory struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the DedicatedHostProfileMemory.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileMemoryTypeFixedConst = "fixed"
)

func (*DedicatedHostProfileMemory) isaDedicatedHostProfileMemory() bool {
	return true
}

type DedicatedHostProfileMemoryIntf interface {
	isaDedicatedHostProfileMemory() bool
}

// UnmarshalDedicatedHostProfileMemory unmarshals an instance of DedicatedHostProfileMemory from the specified map of raw messages.
func UnmarshalDedicatedHostProfileMemory(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileMemory)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileReference : DedicatedHostProfileReference struct
type DedicatedHostProfileReference struct {
	// The URL for this dedicated host.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this dedicated host profile.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalDedicatedHostProfileReference unmarshals an instance of DedicatedHostProfileReference from the specified map of raw messages.
func UnmarshalDedicatedHostProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileSocket : DedicatedHostProfileSocket struct
// Models which "extend" this model:
// - DedicatedHostProfileSocketFixed
// - DedicatedHostProfileSocketRange
// - DedicatedHostProfileSocketEnum
// - DedicatedHostProfileSocketDependent
type DedicatedHostProfileSocket struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the DedicatedHostProfileSocket.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileSocketTypeFixedConst = "fixed"
)

func (*DedicatedHostProfileSocket) isaDedicatedHostProfileSocket() bool {
	return true
}

type DedicatedHostProfileSocketIntf interface {
	isaDedicatedHostProfileSocket() bool
}

// UnmarshalDedicatedHostProfileSocket unmarshals an instance of DedicatedHostProfileSocket from the specified map of raw messages.
func UnmarshalDedicatedHostProfileSocket(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileSocket)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileVcpu : DedicatedHostProfileVcpu struct
// Models which "extend" this model:
// - DedicatedHostProfileVcpuFixed
// - DedicatedHostProfileVcpuRange
// - DedicatedHostProfileVcpuEnum
// - DedicatedHostProfileVcpuDependent
type DedicatedHostProfileVcpu struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the DedicatedHostProfileVcpu.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileVcpuTypeFixedConst = "fixed"
)

func (*DedicatedHostProfileVcpu) isaDedicatedHostProfileVcpu() bool {
	return true
}

type DedicatedHostProfileVcpuIntf interface {
	isaDedicatedHostProfileVcpu() bool
}

// UnmarshalDedicatedHostProfileVcpu unmarshals an instance of DedicatedHostProfileVcpu from the specified map of raw messages.
func UnmarshalDedicatedHostProfileVcpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileVcpu)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileVcpuArchitecture : DedicatedHostProfileVcpuArchitecture struct
type DedicatedHostProfileVcpuArchitecture struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The VCPU architecture for a dedicated host with this profile.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the DedicatedHostProfileVcpuArchitecture.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileVcpuArchitectureTypeFixedConst = "fixed"
)

// Constants associated with the DedicatedHostProfileVcpuArchitecture.Value property.
// The VCPU architecture for a dedicated host with this profile.
const (
	DedicatedHostProfileVcpuArchitectureValueAmd64Const = "amd64"
	DedicatedHostProfileVcpuArchitectureValueS390xConst = "s390x"
)

// UnmarshalDedicatedHostProfileVcpuArchitecture unmarshals an instance of DedicatedHostProfileVcpuArchitecture from the specified map of raw messages.
func UnmarshalDedicatedHostProfileVcpuArchitecture(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileVcpuArchitecture)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostProfileVcpuManufacturer : DedicatedHostProfileVcpuManufacturer struct
type DedicatedHostProfileVcpuManufacturer struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The VCPU manufacturer for a dedicated host with this profile.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the DedicatedHostProfileVcpuManufacturer.Type property.
// The type for this profile field.
const (
	DedicatedHostProfileVcpuManufacturerTypeFixedConst = "fixed"
)

// Constants associated with the DedicatedHostProfileVcpuManufacturer.Value property.
// The VCPU manufacturer for a dedicated host with this profile.
const (
	DedicatedHostProfileVcpuManufacturerValueAmdConst   = "amd"
	DedicatedHostProfileVcpuManufacturerValueIBMConst   = "ibm"
	DedicatedHostProfileVcpuManufacturerValueIntelConst = "intel"
)

// UnmarshalDedicatedHostProfileVcpuManufacturer unmarshals an instance of DedicatedHostProfileVcpuManufacturer from the specified map of raw messages.
func UnmarshalDedicatedHostProfileVcpuManufacturer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostProfileVcpuManufacturer)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostPrototype : DedicatedHostPrototype struct
// Models which "extend" this model:
// - DedicatedHostPrototypeDedicatedHostByGroup
// - DedicatedHostPrototypeDedicatedHostByZone
type DedicatedHostPrototype struct {
	// If set to true, instances can be placed on this dedicated host.
	InstancePlacementEnabled *bool `json:"instance_placement_enabled,omitempty"`

	// The name for this dedicated host. The name must not be used by another dedicated host in the region. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-dh-profiles) to use for this
	// dedicated host.
	Profile DedicatedHostProfileIdentityIntf `json:"profile" validate:"required"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The dedicated host group for this dedicated host.
	Group DedicatedHostGroupIdentityIntf `json:"group,omitempty"`

	// The zone this dedicated host will reside in.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`
}

func (*DedicatedHostPrototype) isaDedicatedHostPrototype() bool {
	return true
}

type DedicatedHostPrototypeIntf interface {
	isaDedicatedHostPrototype() bool
}

// UnmarshalDedicatedHostPrototype unmarshals an instance of DedicatedHostPrototype from the specified map of raw messages.
func UnmarshalDedicatedHostPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostPrototype)
	err = core.UnmarshalPrimitive(m, "instance_placement_enabled", &obj.InstancePlacementEnabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_placement_enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalDedicatedHostProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "group", &obj.Group, UnmarshalDedicatedHostGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DedicatedHostReference : DedicatedHostReference struct
type DedicatedHostReference struct {
	// The CRN for this dedicated host.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this dedicated host.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this dedicated host.
	ID *string `json:"id" validate:"required"`

	// The name for this dedicated host. The name is unique across all dedicated hosts in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the DedicatedHostReference.ResourceType property.
// The resource type.
const (
	DedicatedHostReferenceResourceTypeDedicatedHostConst = "dedicated_host"
)

// UnmarshalDedicatedHostReference unmarshals an instance of DedicatedHostReference from the specified map of raw messages.
func UnmarshalDedicatedHostReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DedicatedHostReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DefaultNetworkACL : DefaultNetworkACL struct
type DefaultNetworkACL struct {
	// The date and time that the network ACL was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this network ACL.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this network ACL.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this network ACL.
	ID *string `json:"id" validate:"required"`

	// The name of the default network ACL created for a VPC. The name will be a hyphenated list of randomly-selected words
	// at creation, but may be changed.
	Name *string `json:"name" validate:"required"`

	// The resource group for the default network ACL for a VPC. Set to the VPC's
	// resource group at creation.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The ordered rules for the default network ACL for a VPC. Created with:
	// - The first rule, named `allow-inbound`, allowing ICMP, TCP and UDP inbound traffic.
	// - The second rule, named `allow-outbound`, allowing ICMP, TCP, and UDP outbound
	//   traffic.
	//
	//  Rules for the default network ACL may be changed, added, or removed.
	Rules []NetworkACLRuleItemIntf `json:"rules" validate:"required"`

	// The subnets to which this network ACL is attached.
	Subnets []SubnetReference `json:"subnets" validate:"required"`

	// The VPC this network ACL resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// UnmarshalDefaultNetworkACL unmarshals an instance of DefaultNetworkACL from the specified map of raw messages.
func UnmarshalDefaultNetworkACL(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DefaultNetworkACL)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalNetworkACLRuleItem)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DefaultRoutingTable : DefaultRoutingTable struct
type DefaultRoutingTable struct {
	// The filters specifying the resources that may create routes in this routing table.
	//
	// Created with filters allowing `vpn_gateway` and `vpn_server` resources to create routes, but filters may be added or
	// removed with subsequent requests.
	//
	// The resources and types of filters supported by this property is expected to
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AcceptRoutesFrom []ResourceFilter `json:"accept_routes_from" validate:"required"`

	// The ingress sources to advertise routes to. Routes in the table with `advertise` enabled will be advertised to these
	// sources.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AdvertiseRoutesTo []string `json:"advertise_routes_to" validate:"required"`

	// The date and time that this routing table was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this VPC routing table.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this routing table.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this routing table.
	ID *string `json:"id" validate:"required"`

	// Indicates whether this is the default routing table for this VPC.
	IsDefault *bool `json:"is_default" validate:"required"`

	// The lifecycle state of the routing table.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name of the default routing table created for this VPC. The name will be a hyphenated list of randomly-selected
	// words at creation, but may be changed.
	Name *string `json:"name" validate:"required"`

	// The resource group for this routing table.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from
	// [Direct Link](https://cloud.ibm.com/docs/dl) to this VPC.
	//
	// Set to `false` at VPC creation, but may be updated with subsequent requests.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteDirectLinkIngress *bool `json:"route_direct_link_ingress" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from the internet.
	//
	// Set to `false` at VPC creation, but may be updated with subsequent requests.
	//
	// Incoming traffic will be routed according to the routing table with two exceptions:
	// - Traffic destined for IP addresses associated with public gateways will not be
	//   subject to routes in this routing table.
	// - Routes with an `action` of `deliver` are treated as `drop` unless the `next_hop`
	//   is an IP address in a subnet in the route's `zone` that is able to accept traffic.
	//   Therefore, if an incoming packet matches a route with a `next_hop` of a VPN
	//   gateway connection, the packet will be dropped.
	RouteInternetIngress *bool `json:"route_internet_ingress" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from from [Transit
	// Gateway](https://cloud.ibm.com/docs/transit-gateway) to this VPC.
	//
	// Set to `false` at VPC creation, but may be updated with subsequent requests.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteTransitGatewayIngress *bool `json:"route_transit_gateway_ingress" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from subnets in other zones in this
	// VPC.
	//
	// Set to `false` at VPC creation, but may be updated with subsequent requests.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteVPCZoneIngress *bool `json:"route_vpc_zone_ingress" validate:"required"`

	// The routes for the default routing table for this VPC. The table is created with no routes, but routes may be added,
	// changed, or removed with a subsequent request.
	Routes []RouteReference `json:"routes" validate:"required"`

	// The subnets to which this routing table is attached.
	Subnets []SubnetReference `json:"subnets" validate:"required"`
}

// Constants associated with the DefaultRoutingTable.AdvertiseRoutesTo property.
// An ingress source that routes can be advertised to:
//
// - `direct_link` (requires `route_direct_link_ingress` be set to `true`)
// - `transit_gateway` (requires `route_transit_gateway_ingress` be set to `true`).
const (
	DefaultRoutingTableAdvertiseRoutesToDirectLinkConst     = "direct_link"
	DefaultRoutingTableAdvertiseRoutesToTransitGatewayConst = "transit_gateway"
)

// Constants associated with the DefaultRoutingTable.LifecycleState property.
// The lifecycle state of the routing table.
const (
	DefaultRoutingTableLifecycleStateDeletingConst  = "deleting"
	DefaultRoutingTableLifecycleStateFailedConst    = "failed"
	DefaultRoutingTableLifecycleStatePendingConst   = "pending"
	DefaultRoutingTableLifecycleStateStableConst    = "stable"
	DefaultRoutingTableLifecycleStateSuspendedConst = "suspended"
	DefaultRoutingTableLifecycleStateUpdatingConst  = "updating"
	DefaultRoutingTableLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the DefaultRoutingTable.ResourceType property.
// The resource type.
const (
	DefaultRoutingTableResourceTypeRoutingTableConst = "routing_table"
)

// UnmarshalDefaultRoutingTable unmarshals an instance of DefaultRoutingTable from the specified map of raw messages.
func UnmarshalDefaultRoutingTable(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DefaultRoutingTable)
	err = core.UnmarshalModel(m, "accept_routes_from", &obj.AcceptRoutesFrom, UnmarshalResourceFilter)
	if err != nil {
		err = core.SDKErrorf(err, "", "accept_routes_from-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "advertise_routes_to", &obj.AdvertiseRoutesTo)
	if err != nil {
		err = core.SDKErrorf(err, "", "advertise_routes_to-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "is_default", &obj.IsDefault)
	if err != nil {
		err = core.SDKErrorf(err, "", "is_default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_direct_link_ingress", &obj.RouteDirectLinkIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_direct_link_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_internet_ingress", &obj.RouteInternetIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_internet_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_transit_gateway_ingress", &obj.RouteTransitGatewayIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_transit_gateway_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_vpc_zone_ingress", &obj.RouteVPCZoneIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_vpc_zone_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routes", &obj.Routes, UnmarshalRouteReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "routes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DefaultSecurityGroup : DefaultSecurityGroup struct
type DefaultSecurityGroup struct {
	// The date and time that this security group was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this security group.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this security group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this security group.
	ID *string `json:"id" validate:"required"`

	// The name for the default security group for a VPC. The name will be a hyphenated list of randomly-selected words at
	// creation, but may changed.
	Name *string `json:"name" validate:"required"`

	// The resource group for this security group.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The rules for the default security group for a VPC. Created with:
	// - A rule allowing inbound ICMP, TCP and UDP traffic from other interfaces in the
	//   VPC's default security group
	// - A rule allowing outbound ICMP, TCP and UDP traffic to any destination
	//
	// Rules for the default security group may be changed, added or removed.
	Rules []SecurityGroupRuleIntf `json:"rules" validate:"required"`

	// The targets for this security group.
	Targets []SecurityGroupTargetReferenceIntf `json:"targets" validate:"required"`

	// The VPC this security group resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// UnmarshalDefaultSecurityGroup unmarshals an instance of DefaultSecurityGroup from the specified map of raw messages.
func UnmarshalDefaultSecurityGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(DefaultSecurityGroup)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalSecurityGroupRule)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "targets", &obj.Targets, UnmarshalSecurityGroupTargetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DeleteBackupPolicyOptions : The DeleteBackupPolicy options.
type DeleteBackupPolicyOptions struct {
	// The backup policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteBackupPolicyOptions : Instantiate DeleteBackupPolicyOptions
func (*VpcV1) NewDeleteBackupPolicyOptions(id string) *DeleteBackupPolicyOptions {
	return &DeleteBackupPolicyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteBackupPolicyOptions) SetID(id string) *DeleteBackupPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteBackupPolicyOptions) SetIfMatch(ifMatch string) *DeleteBackupPolicyOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteBackupPolicyOptions) SetHeaders(param map[string]string) *DeleteBackupPolicyOptions {
	options.Headers = param
	return options
}

// DeleteBackupPolicyPlanOptions : The DeleteBackupPolicyPlan options.
type DeleteBackupPolicyPlanOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// The backup policy plan identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteBackupPolicyPlanOptions : Instantiate DeleteBackupPolicyPlanOptions
func (*VpcV1) NewDeleteBackupPolicyPlanOptions(backupPolicyID string, id string) *DeleteBackupPolicyPlanOptions {
	return &DeleteBackupPolicyPlanOptions{
		BackupPolicyID: core.StringPtr(backupPolicyID),
		ID:             core.StringPtr(id),
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *DeleteBackupPolicyPlanOptions) SetBackupPolicyID(backupPolicyID string) *DeleteBackupPolicyPlanOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteBackupPolicyPlanOptions) SetID(id string) *DeleteBackupPolicyPlanOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteBackupPolicyPlanOptions) SetIfMatch(ifMatch string) *DeleteBackupPolicyPlanOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteBackupPolicyPlanOptions) SetHeaders(param map[string]string) *DeleteBackupPolicyPlanOptions {
	options.Headers = param
	return options
}

// DeleteBareMetalServerNetworkAttachmentOptions : The DeleteBareMetalServerNetworkAttachment options.
type DeleteBareMetalServerNetworkAttachmentOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteBareMetalServerNetworkAttachmentOptions : Instantiate DeleteBareMetalServerNetworkAttachmentOptions
func (*VpcV1) NewDeleteBareMetalServerNetworkAttachmentOptions(bareMetalServerID string, id string) *DeleteBareMetalServerNetworkAttachmentOptions {
	return &DeleteBareMetalServerNetworkAttachmentOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
		ID:                core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *DeleteBareMetalServerNetworkAttachmentOptions) SetBareMetalServerID(bareMetalServerID string) *DeleteBareMetalServerNetworkAttachmentOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteBareMetalServerNetworkAttachmentOptions) SetID(id string) *DeleteBareMetalServerNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteBareMetalServerNetworkAttachmentOptions) SetHeaders(param map[string]string) *DeleteBareMetalServerNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// DeleteBareMetalServerNetworkInterfaceOptions : The DeleteBareMetalServerNetworkInterface options.
type DeleteBareMetalServerNetworkInterfaceOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteBareMetalServerNetworkInterfaceOptions : Instantiate DeleteBareMetalServerNetworkInterfaceOptions
func (*VpcV1) NewDeleteBareMetalServerNetworkInterfaceOptions(bareMetalServerID string, id string) *DeleteBareMetalServerNetworkInterfaceOptions {
	return &DeleteBareMetalServerNetworkInterfaceOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
		ID:                core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *DeleteBareMetalServerNetworkInterfaceOptions) SetBareMetalServerID(bareMetalServerID string) *DeleteBareMetalServerNetworkInterfaceOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteBareMetalServerNetworkInterfaceOptions) SetID(id string) *DeleteBareMetalServerNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteBareMetalServerNetworkInterfaceOptions) SetHeaders(param map[string]string) *DeleteBareMetalServerNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// DeleteBareMetalServerOptions : The DeleteBareMetalServer options.
type DeleteBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteBareMetalServerOptions : Instantiate DeleteBareMetalServerOptions
func (*VpcV1) NewDeleteBareMetalServerOptions(id string) *DeleteBareMetalServerOptions {
	return &DeleteBareMetalServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteBareMetalServerOptions) SetID(id string) *DeleteBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteBareMetalServerOptions) SetHeaders(param map[string]string) *DeleteBareMetalServerOptions {
	options.Headers = param
	return options
}

// DeleteClusterNetworkInterfaceOptions : The DeleteClusterNetworkInterface options.
type DeleteClusterNetworkInterfaceOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteClusterNetworkInterfaceOptions : Instantiate DeleteClusterNetworkInterfaceOptions
func (*VpcV1) NewDeleteClusterNetworkInterfaceOptions(clusterNetworkID string, id string) *DeleteClusterNetworkInterfaceOptions {
	return &DeleteClusterNetworkInterfaceOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
		ID:               core.StringPtr(id),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *DeleteClusterNetworkInterfaceOptions) SetClusterNetworkID(clusterNetworkID string) *DeleteClusterNetworkInterfaceOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteClusterNetworkInterfaceOptions) SetID(id string) *DeleteClusterNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteClusterNetworkInterfaceOptions) SetIfMatch(ifMatch string) *DeleteClusterNetworkInterfaceOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteClusterNetworkInterfaceOptions) SetHeaders(param map[string]string) *DeleteClusterNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// DeleteClusterNetworkOptions : The DeleteClusterNetwork options.
type DeleteClusterNetworkOptions struct {
	// The cluster network identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteClusterNetworkOptions : Instantiate DeleteClusterNetworkOptions
func (*VpcV1) NewDeleteClusterNetworkOptions(id string) *DeleteClusterNetworkOptions {
	return &DeleteClusterNetworkOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteClusterNetworkOptions) SetID(id string) *DeleteClusterNetworkOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteClusterNetworkOptions) SetIfMatch(ifMatch string) *DeleteClusterNetworkOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteClusterNetworkOptions) SetHeaders(param map[string]string) *DeleteClusterNetworkOptions {
	options.Headers = param
	return options
}

// DeleteClusterNetworkSubnetOptions : The DeleteClusterNetworkSubnet options.
type DeleteClusterNetworkSubnetOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteClusterNetworkSubnetOptions : Instantiate DeleteClusterNetworkSubnetOptions
func (*VpcV1) NewDeleteClusterNetworkSubnetOptions(clusterNetworkID string, id string) *DeleteClusterNetworkSubnetOptions {
	return &DeleteClusterNetworkSubnetOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
		ID:               core.StringPtr(id),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *DeleteClusterNetworkSubnetOptions) SetClusterNetworkID(clusterNetworkID string) *DeleteClusterNetworkSubnetOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteClusterNetworkSubnetOptions) SetID(id string) *DeleteClusterNetworkSubnetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteClusterNetworkSubnetOptions) SetIfMatch(ifMatch string) *DeleteClusterNetworkSubnetOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteClusterNetworkSubnetOptions) SetHeaders(param map[string]string) *DeleteClusterNetworkSubnetOptions {
	options.Headers = param
	return options
}

// DeleteClusterNetworkSubnetReservedIPOptions : The DeleteClusterNetworkSubnetReservedIP options.
type DeleteClusterNetworkSubnetReservedIPOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ClusterNetworkSubnetID *string `json:"cluster_network_subnet_id" validate:"required,ne="`

	// The cluster network subnet reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteClusterNetworkSubnetReservedIPOptions : Instantiate DeleteClusterNetworkSubnetReservedIPOptions
func (*VpcV1) NewDeleteClusterNetworkSubnetReservedIPOptions(clusterNetworkID string, clusterNetworkSubnetID string, id string) *DeleteClusterNetworkSubnetReservedIPOptions {
	return &DeleteClusterNetworkSubnetReservedIPOptions{
		ClusterNetworkID:       core.StringPtr(clusterNetworkID),
		ClusterNetworkSubnetID: core.StringPtr(clusterNetworkSubnetID),
		ID:                     core.StringPtr(id),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *DeleteClusterNetworkSubnetReservedIPOptions) SetClusterNetworkID(clusterNetworkID string) *DeleteClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkSubnetID : Allow user to set ClusterNetworkSubnetID
func (_options *DeleteClusterNetworkSubnetReservedIPOptions) SetClusterNetworkSubnetID(clusterNetworkSubnetID string) *DeleteClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkSubnetID = core.StringPtr(clusterNetworkSubnetID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteClusterNetworkSubnetReservedIPOptions) SetID(id string) *DeleteClusterNetworkSubnetReservedIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteClusterNetworkSubnetReservedIPOptions) SetIfMatch(ifMatch string) *DeleteClusterNetworkSubnetReservedIPOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteClusterNetworkSubnetReservedIPOptions) SetHeaders(param map[string]string) *DeleteClusterNetworkSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// DeleteDedicatedHostGroupOptions : The DeleteDedicatedHostGroup options.
type DeleteDedicatedHostGroupOptions struct {
	// The dedicated host group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteDedicatedHostGroupOptions : Instantiate DeleteDedicatedHostGroupOptions
func (*VpcV1) NewDeleteDedicatedHostGroupOptions(id string) *DeleteDedicatedHostGroupOptions {
	return &DeleteDedicatedHostGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteDedicatedHostGroupOptions) SetID(id string) *DeleteDedicatedHostGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteDedicatedHostGroupOptions) SetHeaders(param map[string]string) *DeleteDedicatedHostGroupOptions {
	options.Headers = param
	return options
}

// DeleteDedicatedHostOptions : The DeleteDedicatedHost options.
type DeleteDedicatedHostOptions struct {
	// The dedicated host identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteDedicatedHostOptions : Instantiate DeleteDedicatedHostOptions
func (*VpcV1) NewDeleteDedicatedHostOptions(id string) *DeleteDedicatedHostOptions {
	return &DeleteDedicatedHostOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteDedicatedHostOptions) SetID(id string) *DeleteDedicatedHostOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteDedicatedHostOptions) SetHeaders(param map[string]string) *DeleteDedicatedHostOptions {
	options.Headers = param
	return options
}

// DeleteEndpointGatewayOptions : The DeleteEndpointGateway options.
type DeleteEndpointGatewayOptions struct {
	// The endpoint gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteEndpointGatewayOptions : Instantiate DeleteEndpointGatewayOptions
func (*VpcV1) NewDeleteEndpointGatewayOptions(id string) *DeleteEndpointGatewayOptions {
	return &DeleteEndpointGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteEndpointGatewayOptions) SetID(id string) *DeleteEndpointGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteEndpointGatewayOptions) SetHeaders(param map[string]string) *DeleteEndpointGatewayOptions {
	options.Headers = param
	return options
}

// DeleteFloatingIPOptions : The DeleteFloatingIP options.
type DeleteFloatingIPOptions struct {
	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteFloatingIPOptions : Instantiate DeleteFloatingIPOptions
func (*VpcV1) NewDeleteFloatingIPOptions(id string) *DeleteFloatingIPOptions {
	return &DeleteFloatingIPOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteFloatingIPOptions) SetID(id string) *DeleteFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteFloatingIPOptions) SetHeaders(param map[string]string) *DeleteFloatingIPOptions {
	options.Headers = param
	return options
}

// DeleteFlowLogCollectorOptions : The DeleteFlowLogCollector options.
type DeleteFlowLogCollectorOptions struct {
	// The flow log collector identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteFlowLogCollectorOptions : Instantiate DeleteFlowLogCollectorOptions
func (*VpcV1) NewDeleteFlowLogCollectorOptions(id string) *DeleteFlowLogCollectorOptions {
	return &DeleteFlowLogCollectorOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteFlowLogCollectorOptions) SetID(id string) *DeleteFlowLogCollectorOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteFlowLogCollectorOptions) SetHeaders(param map[string]string) *DeleteFlowLogCollectorOptions {
	options.Headers = param
	return options
}

// DeleteIkePolicyOptions : The DeleteIkePolicy options.
type DeleteIkePolicyOptions struct {
	// The IKE policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteIkePolicyOptions : Instantiate DeleteIkePolicyOptions
func (*VpcV1) NewDeleteIkePolicyOptions(id string) *DeleteIkePolicyOptions {
	return &DeleteIkePolicyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteIkePolicyOptions) SetID(id string) *DeleteIkePolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteIkePolicyOptions) SetHeaders(param map[string]string) *DeleteIkePolicyOptions {
	options.Headers = param
	return options
}

// DeleteImageExportJobOptions : The DeleteImageExportJob options.
type DeleteImageExportJobOptions struct {
	// The image identifier.
	ImageID *string `json:"image_id" validate:"required,ne="`

	// The image export job identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteImageExportJobOptions : Instantiate DeleteImageExportJobOptions
func (*VpcV1) NewDeleteImageExportJobOptions(imageID string, id string) *DeleteImageExportJobOptions {
	return &DeleteImageExportJobOptions{
		ImageID: core.StringPtr(imageID),
		ID:      core.StringPtr(id),
	}
}

// SetImageID : Allow user to set ImageID
func (_options *DeleteImageExportJobOptions) SetImageID(imageID string) *DeleteImageExportJobOptions {
	_options.ImageID = core.StringPtr(imageID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteImageExportJobOptions) SetID(id string) *DeleteImageExportJobOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteImageExportJobOptions) SetHeaders(param map[string]string) *DeleteImageExportJobOptions {
	options.Headers = param
	return options
}

// DeleteImageOptions : The DeleteImage options.
type DeleteImageOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteImageOptions : Instantiate DeleteImageOptions
func (*VpcV1) NewDeleteImageOptions(id string) *DeleteImageOptions {
	return &DeleteImageOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteImageOptions) SetID(id string) *DeleteImageOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteImageOptions) SetHeaders(param map[string]string) *DeleteImageOptions {
	options.Headers = param
	return options
}

// DeleteInstanceClusterNetworkAttachmentOptions : The DeleteInstanceClusterNetworkAttachment options.
type DeleteInstanceClusterNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance cluster network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceClusterNetworkAttachmentOptions : Instantiate DeleteInstanceClusterNetworkAttachmentOptions
func (*VpcV1) NewDeleteInstanceClusterNetworkAttachmentOptions(instanceID string, id string) *DeleteInstanceClusterNetworkAttachmentOptions {
	return &DeleteInstanceClusterNetworkAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *DeleteInstanceClusterNetworkAttachmentOptions) SetInstanceID(instanceID string) *DeleteInstanceClusterNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceClusterNetworkAttachmentOptions) SetID(id string) *DeleteInstanceClusterNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceClusterNetworkAttachmentOptions) SetHeaders(param map[string]string) *DeleteInstanceClusterNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupLoadBalancerOptions : The DeleteInstanceGroupLoadBalancer options.
type DeleteInstanceGroupLoadBalancerOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupLoadBalancerOptions : Instantiate DeleteInstanceGroupLoadBalancerOptions
func (*VpcV1) NewDeleteInstanceGroupLoadBalancerOptions(instanceGroupID string) *DeleteInstanceGroupLoadBalancerOptions {
	return &DeleteInstanceGroupLoadBalancerOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *DeleteInstanceGroupLoadBalancerOptions) SetInstanceGroupID(instanceGroupID string) *DeleteInstanceGroupLoadBalancerOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupLoadBalancerOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupLoadBalancerOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupManagerActionOptions : The DeleteInstanceGroupManagerAction options.
type DeleteInstanceGroupManagerActionOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager action identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupManagerActionOptions : Instantiate DeleteInstanceGroupManagerActionOptions
func (*VpcV1) NewDeleteInstanceGroupManagerActionOptions(instanceGroupID string, instanceGroupManagerID string, id string) *DeleteInstanceGroupManagerActionOptions {
	return &DeleteInstanceGroupManagerActionOptions{
		InstanceGroupID:        core.StringPtr(instanceGroupID),
		InstanceGroupManagerID: core.StringPtr(instanceGroupManagerID),
		ID:                     core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *DeleteInstanceGroupManagerActionOptions) SetInstanceGroupID(instanceGroupID string) *DeleteInstanceGroupManagerActionOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *DeleteInstanceGroupManagerActionOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *DeleteInstanceGroupManagerActionOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceGroupManagerActionOptions) SetID(id string) *DeleteInstanceGroupManagerActionOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupManagerActionOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupManagerActionOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupManagerOptions : The DeleteInstanceGroupManager options.
type DeleteInstanceGroupManagerOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupManagerOptions : Instantiate DeleteInstanceGroupManagerOptions
func (*VpcV1) NewDeleteInstanceGroupManagerOptions(instanceGroupID string, id string) *DeleteInstanceGroupManagerOptions {
	return &DeleteInstanceGroupManagerOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *DeleteInstanceGroupManagerOptions) SetInstanceGroupID(instanceGroupID string) *DeleteInstanceGroupManagerOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceGroupManagerOptions) SetID(id string) *DeleteInstanceGroupManagerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupManagerOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupManagerOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupManagerPolicyOptions : The DeleteInstanceGroupManagerPolicy options.
type DeleteInstanceGroupManagerPolicyOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupManagerPolicyOptions : Instantiate DeleteInstanceGroupManagerPolicyOptions
func (*VpcV1) NewDeleteInstanceGroupManagerPolicyOptions(instanceGroupID string, instanceGroupManagerID string, id string) *DeleteInstanceGroupManagerPolicyOptions {
	return &DeleteInstanceGroupManagerPolicyOptions{
		InstanceGroupID:        core.StringPtr(instanceGroupID),
		InstanceGroupManagerID: core.StringPtr(instanceGroupManagerID),
		ID:                     core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *DeleteInstanceGroupManagerPolicyOptions) SetInstanceGroupID(instanceGroupID string) *DeleteInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *DeleteInstanceGroupManagerPolicyOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *DeleteInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceGroupManagerPolicyOptions) SetID(id string) *DeleteInstanceGroupManagerPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupManagerPolicyOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupManagerPolicyOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupMembershipOptions : The DeleteInstanceGroupMembership options.
type DeleteInstanceGroupMembershipOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group membership identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupMembershipOptions : Instantiate DeleteInstanceGroupMembershipOptions
func (*VpcV1) NewDeleteInstanceGroupMembershipOptions(instanceGroupID string, id string) *DeleteInstanceGroupMembershipOptions {
	return &DeleteInstanceGroupMembershipOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *DeleteInstanceGroupMembershipOptions) SetInstanceGroupID(instanceGroupID string) *DeleteInstanceGroupMembershipOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceGroupMembershipOptions) SetID(id string) *DeleteInstanceGroupMembershipOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupMembershipOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupMembershipOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupMembershipsOptions : The DeleteInstanceGroupMemberships options.
type DeleteInstanceGroupMembershipsOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupMembershipsOptions : Instantiate DeleteInstanceGroupMembershipsOptions
func (*VpcV1) NewDeleteInstanceGroupMembershipsOptions(instanceGroupID string) *DeleteInstanceGroupMembershipsOptions {
	return &DeleteInstanceGroupMembershipsOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *DeleteInstanceGroupMembershipsOptions) SetInstanceGroupID(instanceGroupID string) *DeleteInstanceGroupMembershipsOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupMembershipsOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupMembershipsOptions {
	options.Headers = param
	return options
}

// DeleteInstanceGroupOptions : The DeleteInstanceGroup options.
type DeleteInstanceGroupOptions struct {
	// The instance group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceGroupOptions : Instantiate DeleteInstanceGroupOptions
func (*VpcV1) NewDeleteInstanceGroupOptions(id string) *DeleteInstanceGroupOptions {
	return &DeleteInstanceGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceGroupOptions) SetID(id string) *DeleteInstanceGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceGroupOptions) SetHeaders(param map[string]string) *DeleteInstanceGroupOptions {
	options.Headers = param
	return options
}

// DeleteInstanceNetworkAttachmentOptions : The DeleteInstanceNetworkAttachment options.
type DeleteInstanceNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceNetworkAttachmentOptions : Instantiate DeleteInstanceNetworkAttachmentOptions
func (*VpcV1) NewDeleteInstanceNetworkAttachmentOptions(instanceID string, id string) *DeleteInstanceNetworkAttachmentOptions {
	return &DeleteInstanceNetworkAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *DeleteInstanceNetworkAttachmentOptions) SetInstanceID(instanceID string) *DeleteInstanceNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceNetworkAttachmentOptions) SetID(id string) *DeleteInstanceNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceNetworkAttachmentOptions) SetHeaders(param map[string]string) *DeleteInstanceNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// DeleteInstanceNetworkInterfaceOptions : The DeleteInstanceNetworkInterface options.
type DeleteInstanceNetworkInterfaceOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceNetworkInterfaceOptions : Instantiate DeleteInstanceNetworkInterfaceOptions
func (*VpcV1) NewDeleteInstanceNetworkInterfaceOptions(instanceID string, id string) *DeleteInstanceNetworkInterfaceOptions {
	return &DeleteInstanceNetworkInterfaceOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *DeleteInstanceNetworkInterfaceOptions) SetInstanceID(instanceID string) *DeleteInstanceNetworkInterfaceOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceNetworkInterfaceOptions) SetID(id string) *DeleteInstanceNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceNetworkInterfaceOptions) SetHeaders(param map[string]string) *DeleteInstanceNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// DeleteInstanceOptions : The DeleteInstance options.
type DeleteInstanceOptions struct {
	// The virtual server instance identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceOptions : Instantiate DeleteInstanceOptions
func (*VpcV1) NewDeleteInstanceOptions(id string) *DeleteInstanceOptions {
	return &DeleteInstanceOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceOptions) SetID(id string) *DeleteInstanceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteInstanceOptions) SetIfMatch(ifMatch string) *DeleteInstanceOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceOptions) SetHeaders(param map[string]string) *DeleteInstanceOptions {
	options.Headers = param
	return options
}

// DeleteInstanceTemplateOptions : The DeleteInstanceTemplate options.
type DeleteInstanceTemplateOptions struct {
	// The instance template identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceTemplateOptions : Instantiate DeleteInstanceTemplateOptions
func (*VpcV1) NewDeleteInstanceTemplateOptions(id string) *DeleteInstanceTemplateOptions {
	return &DeleteInstanceTemplateOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceTemplateOptions) SetID(id string) *DeleteInstanceTemplateOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceTemplateOptions) SetHeaders(param map[string]string) *DeleteInstanceTemplateOptions {
	options.Headers = param
	return options
}

// DeleteInstanceVolumeAttachmentOptions : The DeleteInstanceVolumeAttachment options.
type DeleteInstanceVolumeAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The volume attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteInstanceVolumeAttachmentOptions : Instantiate DeleteInstanceVolumeAttachmentOptions
func (*VpcV1) NewDeleteInstanceVolumeAttachmentOptions(instanceID string, id string) *DeleteInstanceVolumeAttachmentOptions {
	return &DeleteInstanceVolumeAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *DeleteInstanceVolumeAttachmentOptions) SetInstanceID(instanceID string) *DeleteInstanceVolumeAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteInstanceVolumeAttachmentOptions) SetID(id string) *DeleteInstanceVolumeAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteInstanceVolumeAttachmentOptions) SetHeaders(param map[string]string) *DeleteInstanceVolumeAttachmentOptions {
	options.Headers = param
	return options
}

// DeleteIpsecPolicyOptions : The DeleteIpsecPolicy options.
type DeleteIpsecPolicyOptions struct {
	// The IPsec policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteIpsecPolicyOptions : Instantiate DeleteIpsecPolicyOptions
func (*VpcV1) NewDeleteIpsecPolicyOptions(id string) *DeleteIpsecPolicyOptions {
	return &DeleteIpsecPolicyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteIpsecPolicyOptions) SetID(id string) *DeleteIpsecPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteIpsecPolicyOptions) SetHeaders(param map[string]string) *DeleteIpsecPolicyOptions {
	options.Headers = param
	return options
}

// DeleteKeyOptions : The DeleteKey options.
type DeleteKeyOptions struct {
	// The key identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteKeyOptions : Instantiate DeleteKeyOptions
func (*VpcV1) NewDeleteKeyOptions(id string) *DeleteKeyOptions {
	return &DeleteKeyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteKeyOptions) SetID(id string) *DeleteKeyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteKeyOptions) SetHeaders(param map[string]string) *DeleteKeyOptions {
	options.Headers = param
	return options
}

// DeleteLoadBalancerListenerOptions : The DeleteLoadBalancerListener options.
type DeleteLoadBalancerListenerOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteLoadBalancerListenerOptions : Instantiate DeleteLoadBalancerListenerOptions
func (*VpcV1) NewDeleteLoadBalancerListenerOptions(loadBalancerID string, id string) *DeleteLoadBalancerListenerOptions {
	return &DeleteLoadBalancerListenerOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *DeleteLoadBalancerListenerOptions) SetLoadBalancerID(loadBalancerID string) *DeleteLoadBalancerListenerOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteLoadBalancerListenerOptions) SetID(id string) *DeleteLoadBalancerListenerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteLoadBalancerListenerOptions) SetHeaders(param map[string]string) *DeleteLoadBalancerListenerOptions {
	options.Headers = param
	return options
}

// DeleteLoadBalancerListenerPolicyOptions : The DeleteLoadBalancerListenerPolicy options.
type DeleteLoadBalancerListenerPolicyOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteLoadBalancerListenerPolicyOptions : Instantiate DeleteLoadBalancerListenerPolicyOptions
func (*VpcV1) NewDeleteLoadBalancerListenerPolicyOptions(loadBalancerID string, listenerID string, id string) *DeleteLoadBalancerListenerPolicyOptions {
	return &DeleteLoadBalancerListenerPolicyOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *DeleteLoadBalancerListenerPolicyOptions) SetLoadBalancerID(loadBalancerID string) *DeleteLoadBalancerListenerPolicyOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *DeleteLoadBalancerListenerPolicyOptions) SetListenerID(listenerID string) *DeleteLoadBalancerListenerPolicyOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteLoadBalancerListenerPolicyOptions) SetID(id string) *DeleteLoadBalancerListenerPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteLoadBalancerListenerPolicyOptions) SetHeaders(param map[string]string) *DeleteLoadBalancerListenerPolicyOptions {
	options.Headers = param
	return options
}

// DeleteLoadBalancerListenerPolicyRuleOptions : The DeleteLoadBalancerListenerPolicyRule options.
type DeleteLoadBalancerListenerPolicyRuleOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	PolicyID *string `json:"policy_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteLoadBalancerListenerPolicyRuleOptions : Instantiate DeleteLoadBalancerListenerPolicyRuleOptions
func (*VpcV1) NewDeleteLoadBalancerListenerPolicyRuleOptions(loadBalancerID string, listenerID string, policyID string, id string) *DeleteLoadBalancerListenerPolicyRuleOptions {
	return &DeleteLoadBalancerListenerPolicyRuleOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		PolicyID:       core.StringPtr(policyID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *DeleteLoadBalancerListenerPolicyRuleOptions) SetLoadBalancerID(loadBalancerID string) *DeleteLoadBalancerListenerPolicyRuleOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *DeleteLoadBalancerListenerPolicyRuleOptions) SetListenerID(listenerID string) *DeleteLoadBalancerListenerPolicyRuleOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetPolicyID : Allow user to set PolicyID
func (_options *DeleteLoadBalancerListenerPolicyRuleOptions) SetPolicyID(policyID string) *DeleteLoadBalancerListenerPolicyRuleOptions {
	_options.PolicyID = core.StringPtr(policyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteLoadBalancerListenerPolicyRuleOptions) SetID(id string) *DeleteLoadBalancerListenerPolicyRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteLoadBalancerListenerPolicyRuleOptions) SetHeaders(param map[string]string) *DeleteLoadBalancerListenerPolicyRuleOptions {
	options.Headers = param
	return options
}

// DeleteLoadBalancerOptions : The DeleteLoadBalancer options.
type DeleteLoadBalancerOptions struct {
	// The load balancer identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteLoadBalancerOptions : Instantiate DeleteLoadBalancerOptions
func (*VpcV1) NewDeleteLoadBalancerOptions(id string) *DeleteLoadBalancerOptions {
	return &DeleteLoadBalancerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteLoadBalancerOptions) SetID(id string) *DeleteLoadBalancerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteLoadBalancerOptions) SetIfMatch(ifMatch string) *DeleteLoadBalancerOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteLoadBalancerOptions) SetHeaders(param map[string]string) *DeleteLoadBalancerOptions {
	options.Headers = param
	return options
}

// DeleteLoadBalancerPoolMemberOptions : The DeleteLoadBalancerPoolMember options.
type DeleteLoadBalancerPoolMemberOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	PoolID *string `json:"pool_id" validate:"required,ne="`

	// The member identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteLoadBalancerPoolMemberOptions : Instantiate DeleteLoadBalancerPoolMemberOptions
func (*VpcV1) NewDeleteLoadBalancerPoolMemberOptions(loadBalancerID string, poolID string, id string) *DeleteLoadBalancerPoolMemberOptions {
	return &DeleteLoadBalancerPoolMemberOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		PoolID:         core.StringPtr(poolID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *DeleteLoadBalancerPoolMemberOptions) SetLoadBalancerID(loadBalancerID string) *DeleteLoadBalancerPoolMemberOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetPoolID : Allow user to set PoolID
func (_options *DeleteLoadBalancerPoolMemberOptions) SetPoolID(poolID string) *DeleteLoadBalancerPoolMemberOptions {
	_options.PoolID = core.StringPtr(poolID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteLoadBalancerPoolMemberOptions) SetID(id string) *DeleteLoadBalancerPoolMemberOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteLoadBalancerPoolMemberOptions) SetHeaders(param map[string]string) *DeleteLoadBalancerPoolMemberOptions {
	options.Headers = param
	return options
}

// DeleteLoadBalancerPoolOptions : The DeleteLoadBalancerPool options.
type DeleteLoadBalancerPoolOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteLoadBalancerPoolOptions : Instantiate DeleteLoadBalancerPoolOptions
func (*VpcV1) NewDeleteLoadBalancerPoolOptions(loadBalancerID string, id string) *DeleteLoadBalancerPoolOptions {
	return &DeleteLoadBalancerPoolOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *DeleteLoadBalancerPoolOptions) SetLoadBalancerID(loadBalancerID string) *DeleteLoadBalancerPoolOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteLoadBalancerPoolOptions) SetID(id string) *DeleteLoadBalancerPoolOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteLoadBalancerPoolOptions) SetHeaders(param map[string]string) *DeleteLoadBalancerPoolOptions {
	options.Headers = param
	return options
}

// DeleteNetworkACLOptions : The DeleteNetworkACL options.
type DeleteNetworkACLOptions struct {
	// The network ACL identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteNetworkACLOptions : Instantiate DeleteNetworkACLOptions
func (*VpcV1) NewDeleteNetworkACLOptions(id string) *DeleteNetworkACLOptions {
	return &DeleteNetworkACLOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteNetworkACLOptions) SetID(id string) *DeleteNetworkACLOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteNetworkACLOptions) SetHeaders(param map[string]string) *DeleteNetworkACLOptions {
	options.Headers = param
	return options
}

// DeleteNetworkACLRuleOptions : The DeleteNetworkACLRule options.
type DeleteNetworkACLRuleOptions struct {
	// The network ACL identifier.
	NetworkACLID *string `json:"network_acl_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteNetworkACLRuleOptions : Instantiate DeleteNetworkACLRuleOptions
func (*VpcV1) NewDeleteNetworkACLRuleOptions(networkACLID string, id string) *DeleteNetworkACLRuleOptions {
	return &DeleteNetworkACLRuleOptions{
		NetworkACLID: core.StringPtr(networkACLID),
		ID:           core.StringPtr(id),
	}
}

// SetNetworkACLID : Allow user to set NetworkACLID
func (_options *DeleteNetworkACLRuleOptions) SetNetworkACLID(networkACLID string) *DeleteNetworkACLRuleOptions {
	_options.NetworkACLID = core.StringPtr(networkACLID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteNetworkACLRuleOptions) SetID(id string) *DeleteNetworkACLRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteNetworkACLRuleOptions) SetHeaders(param map[string]string) *DeleteNetworkACLRuleOptions {
	options.Headers = param
	return options
}

// DeletePlacementGroupOptions : The DeletePlacementGroup options.
type DeletePlacementGroupOptions struct {
	// The placement group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeletePlacementGroupOptions : Instantiate DeletePlacementGroupOptions
func (*VpcV1) NewDeletePlacementGroupOptions(id string) *DeletePlacementGroupOptions {
	return &DeletePlacementGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeletePlacementGroupOptions) SetID(id string) *DeletePlacementGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeletePlacementGroupOptions) SetHeaders(param map[string]string) *DeletePlacementGroupOptions {
	options.Headers = param
	return options
}

// DeletePrivatePathServiceGatewayAccountPolicyOptions : The DeletePrivatePathServiceGatewayAccountPolicy options.
type DeletePrivatePathServiceGatewayAccountPolicyOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The account policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeletePrivatePathServiceGatewayAccountPolicyOptions : Instantiate DeletePrivatePathServiceGatewayAccountPolicyOptions
func (*VpcV1) NewDeletePrivatePathServiceGatewayAccountPolicyOptions(privatePathServiceGatewayID string, id string) *DeletePrivatePathServiceGatewayAccountPolicyOptions {
	return &DeletePrivatePathServiceGatewayAccountPolicyOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		ID:                          core.StringPtr(id),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *DeletePrivatePathServiceGatewayAccountPolicyOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *DeletePrivatePathServiceGatewayAccountPolicyOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeletePrivatePathServiceGatewayAccountPolicyOptions) SetID(id string) *DeletePrivatePathServiceGatewayAccountPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeletePrivatePathServiceGatewayAccountPolicyOptions) SetHeaders(param map[string]string) *DeletePrivatePathServiceGatewayAccountPolicyOptions {
	options.Headers = param
	return options
}

// DeletePrivatePathServiceGatewayOptions : The DeletePrivatePathServiceGateway options.
type DeletePrivatePathServiceGatewayOptions struct {
	// The private path service gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeletePrivatePathServiceGatewayOptions : Instantiate DeletePrivatePathServiceGatewayOptions
func (*VpcV1) NewDeletePrivatePathServiceGatewayOptions(id string) *DeletePrivatePathServiceGatewayOptions {
	return &DeletePrivatePathServiceGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeletePrivatePathServiceGatewayOptions) SetID(id string) *DeletePrivatePathServiceGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeletePrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *DeletePrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// DeletePublicAddressRangeOptions : The DeletePublicAddressRange options.
type DeletePublicAddressRangeOptions struct {
	// The public address range identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeletePublicAddressRangeOptions : Instantiate DeletePublicAddressRangeOptions
func (*VpcV1) NewDeletePublicAddressRangeOptions(id string) *DeletePublicAddressRangeOptions {
	return &DeletePublicAddressRangeOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeletePublicAddressRangeOptions) SetID(id string) *DeletePublicAddressRangeOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeletePublicAddressRangeOptions) SetHeaders(param map[string]string) *DeletePublicAddressRangeOptions {
	options.Headers = param
	return options
}

// DeletePublicGatewayOptions : The DeletePublicGateway options.
type DeletePublicGatewayOptions struct {
	// The public gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeletePublicGatewayOptions : Instantiate DeletePublicGatewayOptions
func (*VpcV1) NewDeletePublicGatewayOptions(id string) *DeletePublicGatewayOptions {
	return &DeletePublicGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeletePublicGatewayOptions) SetID(id string) *DeletePublicGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeletePublicGatewayOptions) SetHeaders(param map[string]string) *DeletePublicGatewayOptions {
	options.Headers = param
	return options
}

// DeleteReservationOptions : The DeleteReservation options.
type DeleteReservationOptions struct {
	// The reservation identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteReservationOptions : Instantiate DeleteReservationOptions
func (*VpcV1) NewDeleteReservationOptions(id string) *DeleteReservationOptions {
	return &DeleteReservationOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteReservationOptions) SetID(id string) *DeleteReservationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteReservationOptions) SetHeaders(param map[string]string) *DeleteReservationOptions {
	options.Headers = param
	return options
}

// DeleteSecurityGroupOptions : The DeleteSecurityGroup options.
type DeleteSecurityGroupOptions struct {
	// The security group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSecurityGroupOptions : Instantiate DeleteSecurityGroupOptions
func (*VpcV1) NewDeleteSecurityGroupOptions(id string) *DeleteSecurityGroupOptions {
	return &DeleteSecurityGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteSecurityGroupOptions) SetID(id string) *DeleteSecurityGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSecurityGroupOptions) SetHeaders(param map[string]string) *DeleteSecurityGroupOptions {
	options.Headers = param
	return options
}

// DeleteSecurityGroupRuleOptions : The DeleteSecurityGroupRule options.
type DeleteSecurityGroupRuleOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSecurityGroupRuleOptions : Instantiate DeleteSecurityGroupRuleOptions
func (*VpcV1) NewDeleteSecurityGroupRuleOptions(securityGroupID string, id string) *DeleteSecurityGroupRuleOptions {
	return &DeleteSecurityGroupRuleOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *DeleteSecurityGroupRuleOptions) SetSecurityGroupID(securityGroupID string) *DeleteSecurityGroupRuleOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteSecurityGroupRuleOptions) SetID(id string) *DeleteSecurityGroupRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSecurityGroupRuleOptions) SetHeaders(param map[string]string) *DeleteSecurityGroupRuleOptions {
	options.Headers = param
	return options
}

// DeleteSecurityGroupTargetBindingOptions : The DeleteSecurityGroupTargetBinding options.
type DeleteSecurityGroupTargetBindingOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The security group target identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSecurityGroupTargetBindingOptions : Instantiate DeleteSecurityGroupTargetBindingOptions
func (*VpcV1) NewDeleteSecurityGroupTargetBindingOptions(securityGroupID string, id string) *DeleteSecurityGroupTargetBindingOptions {
	return &DeleteSecurityGroupTargetBindingOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *DeleteSecurityGroupTargetBindingOptions) SetSecurityGroupID(securityGroupID string) *DeleteSecurityGroupTargetBindingOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteSecurityGroupTargetBindingOptions) SetID(id string) *DeleteSecurityGroupTargetBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSecurityGroupTargetBindingOptions) SetHeaders(param map[string]string) *DeleteSecurityGroupTargetBindingOptions {
	options.Headers = param
	return options
}

// DeleteShareAccessorBindingOptions : The DeleteShareAccessorBinding options.
type DeleteShareAccessorBindingOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The file share accessor binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteShareAccessorBindingOptions : Instantiate DeleteShareAccessorBindingOptions
func (*VpcV1) NewDeleteShareAccessorBindingOptions(shareID string, id string) *DeleteShareAccessorBindingOptions {
	return &DeleteShareAccessorBindingOptions{
		ShareID: core.StringPtr(shareID),
		ID:      core.StringPtr(id),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *DeleteShareAccessorBindingOptions) SetShareID(shareID string) *DeleteShareAccessorBindingOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteShareAccessorBindingOptions) SetID(id string) *DeleteShareAccessorBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteShareAccessorBindingOptions) SetHeaders(param map[string]string) *DeleteShareAccessorBindingOptions {
	options.Headers = param
	return options
}

// DeleteShareMountTargetOptions : The DeleteShareMountTarget options.
type DeleteShareMountTargetOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The file share mount target identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteShareMountTargetOptions : Instantiate DeleteShareMountTargetOptions
func (*VpcV1) NewDeleteShareMountTargetOptions(shareID string, id string) *DeleteShareMountTargetOptions {
	return &DeleteShareMountTargetOptions{
		ShareID: core.StringPtr(shareID),
		ID:      core.StringPtr(id),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *DeleteShareMountTargetOptions) SetShareID(shareID string) *DeleteShareMountTargetOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteShareMountTargetOptions) SetID(id string) *DeleteShareMountTargetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteShareMountTargetOptions) SetHeaders(param map[string]string) *DeleteShareMountTargetOptions {
	options.Headers = param
	return options
}

// DeleteShareOptions : The DeleteShare options.
type DeleteShareOptions struct {
	// The file share identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteShareOptions : Instantiate DeleteShareOptions
func (*VpcV1) NewDeleteShareOptions(id string) *DeleteShareOptions {
	return &DeleteShareOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteShareOptions) SetID(id string) *DeleteShareOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteShareOptions) SetIfMatch(ifMatch string) *DeleteShareOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteShareOptions) SetHeaders(param map[string]string) *DeleteShareOptions {
	options.Headers = param
	return options
}

// DeleteShareSnapshotOptions : The DeleteShareSnapshot options.
type DeleteShareSnapshotOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The share snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteShareSnapshotOptions : Instantiate DeleteShareSnapshotOptions
func (*VpcV1) NewDeleteShareSnapshotOptions(shareID string, id string) *DeleteShareSnapshotOptions {
	return &DeleteShareSnapshotOptions{
		ShareID: core.StringPtr(shareID),
		ID:      core.StringPtr(id),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *DeleteShareSnapshotOptions) SetShareID(shareID string) *DeleteShareSnapshotOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteShareSnapshotOptions) SetID(id string) *DeleteShareSnapshotOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteShareSnapshotOptions) SetHeaders(param map[string]string) *DeleteShareSnapshotOptions {
	options.Headers = param
	return options
}

// DeleteShareSourceOptions : The DeleteShareSource options.
type DeleteShareSourceOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteShareSourceOptions : Instantiate DeleteShareSourceOptions
func (*VpcV1) NewDeleteShareSourceOptions(shareID string) *DeleteShareSourceOptions {
	return &DeleteShareSourceOptions{
		ShareID: core.StringPtr(shareID),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *DeleteShareSourceOptions) SetShareID(shareID string) *DeleteShareSourceOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteShareSourceOptions) SetHeaders(param map[string]string) *DeleteShareSourceOptions {
	options.Headers = param
	return options
}

// DeleteSnapshotCloneOptions : The DeleteSnapshotClone options.
type DeleteSnapshotCloneOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The zone name.
	ZoneName *string `json:"zone_name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSnapshotCloneOptions : Instantiate DeleteSnapshotCloneOptions
func (*VpcV1) NewDeleteSnapshotCloneOptions(id string, zoneName string) *DeleteSnapshotCloneOptions {
	return &DeleteSnapshotCloneOptions{
		ID:       core.StringPtr(id),
		ZoneName: core.StringPtr(zoneName),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteSnapshotCloneOptions) SetID(id string) *DeleteSnapshotCloneOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *DeleteSnapshotCloneOptions) SetZoneName(zoneName string) *DeleteSnapshotCloneOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSnapshotCloneOptions) SetHeaders(param map[string]string) *DeleteSnapshotCloneOptions {
	options.Headers = param
	return options
}

// DeleteSnapshotConsistencyGroupOptions : The DeleteSnapshotConsistencyGroup options.
type DeleteSnapshotConsistencyGroupOptions struct {
	// The snapshot consistency group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSnapshotConsistencyGroupOptions : Instantiate DeleteSnapshotConsistencyGroupOptions
func (*VpcV1) NewDeleteSnapshotConsistencyGroupOptions(id string) *DeleteSnapshotConsistencyGroupOptions {
	return &DeleteSnapshotConsistencyGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteSnapshotConsistencyGroupOptions) SetID(id string) *DeleteSnapshotConsistencyGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSnapshotConsistencyGroupOptions) SetHeaders(param map[string]string) *DeleteSnapshotConsistencyGroupOptions {
	options.Headers = param
	return options
}

// DeleteSnapshotOptions : The DeleteSnapshot options.
type DeleteSnapshotOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSnapshotOptions : Instantiate DeleteSnapshotOptions
func (*VpcV1) NewDeleteSnapshotOptions(id string) *DeleteSnapshotOptions {
	return &DeleteSnapshotOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteSnapshotOptions) SetID(id string) *DeleteSnapshotOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteSnapshotOptions) SetIfMatch(ifMatch string) *DeleteSnapshotOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSnapshotOptions) SetHeaders(param map[string]string) *DeleteSnapshotOptions {
	options.Headers = param
	return options
}

// DeleteSnapshotsOptions : The DeleteSnapshots options.
type DeleteSnapshotsOptions struct {
	// Filters the collection to resources with a `source_volume.id` property matching the specified identifier.
	SourceVolumeID *string `json:"source_volume.id" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSnapshotsOptions : Instantiate DeleteSnapshotsOptions
func (*VpcV1) NewDeleteSnapshotsOptions(sourceVolumeID string) *DeleteSnapshotsOptions {
	return &DeleteSnapshotsOptions{
		SourceVolumeID: core.StringPtr(sourceVolumeID),
	}
}

// SetSourceVolumeID : Allow user to set SourceVolumeID
func (_options *DeleteSnapshotsOptions) SetSourceVolumeID(sourceVolumeID string) *DeleteSnapshotsOptions {
	_options.SourceVolumeID = core.StringPtr(sourceVolumeID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSnapshotsOptions) SetHeaders(param map[string]string) *DeleteSnapshotsOptions {
	options.Headers = param
	return options
}

// DeleteSubnetOptions : The DeleteSubnet options.
type DeleteSubnetOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSubnetOptions : Instantiate DeleteSubnetOptions
func (*VpcV1) NewDeleteSubnetOptions(id string) *DeleteSubnetOptions {
	return &DeleteSubnetOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteSubnetOptions) SetID(id string) *DeleteSubnetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSubnetOptions) SetHeaders(param map[string]string) *DeleteSubnetOptions {
	options.Headers = param
	return options
}

// DeleteSubnetReservedIPOptions : The DeleteSubnetReservedIP options.
type DeleteSubnetReservedIPOptions struct {
	// The subnet identifier.
	SubnetID *string `json:"subnet_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteSubnetReservedIPOptions : Instantiate DeleteSubnetReservedIPOptions
func (*VpcV1) NewDeleteSubnetReservedIPOptions(subnetID string, id string) *DeleteSubnetReservedIPOptions {
	return &DeleteSubnetReservedIPOptions{
		SubnetID: core.StringPtr(subnetID),
		ID:       core.StringPtr(id),
	}
}

// SetSubnetID : Allow user to set SubnetID
func (_options *DeleteSubnetReservedIPOptions) SetSubnetID(subnetID string) *DeleteSubnetReservedIPOptions {
	_options.SubnetID = core.StringPtr(subnetID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteSubnetReservedIPOptions) SetID(id string) *DeleteSubnetReservedIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteSubnetReservedIPOptions) SetHeaders(param map[string]string) *DeleteSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// DeleteVirtualNetworkInterfacesOptions : The DeleteVirtualNetworkInterfaces options.
type DeleteVirtualNetworkInterfacesOptions struct {
	// The virtual network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVirtualNetworkInterfacesOptions : Instantiate DeleteVirtualNetworkInterfacesOptions
func (*VpcV1) NewDeleteVirtualNetworkInterfacesOptions(id string) *DeleteVirtualNetworkInterfacesOptions {
	return &DeleteVirtualNetworkInterfacesOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteVirtualNetworkInterfacesOptions) SetID(id string) *DeleteVirtualNetworkInterfacesOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVirtualNetworkInterfacesOptions) SetHeaders(param map[string]string) *DeleteVirtualNetworkInterfacesOptions {
	options.Headers = param
	return options
}

// DeleteVolumeOptions : The DeleteVolume options.
type DeleteVolumeOptions struct {
	// The volume identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVolumeOptions : Instantiate DeleteVolumeOptions
func (*VpcV1) NewDeleteVolumeOptions(id string) *DeleteVolumeOptions {
	return &DeleteVolumeOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteVolumeOptions) SetID(id string) *DeleteVolumeOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteVolumeOptions) SetIfMatch(ifMatch string) *DeleteVolumeOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVolumeOptions) SetHeaders(param map[string]string) *DeleteVolumeOptions {
	options.Headers = param
	return options
}

// DeleteVPCAddressPrefixOptions : The DeleteVPCAddressPrefix options.
type DeleteVPCAddressPrefixOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The prefix identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPCAddressPrefixOptions : Instantiate DeleteVPCAddressPrefixOptions
func (*VpcV1) NewDeleteVPCAddressPrefixOptions(vpcID string, id string) *DeleteVPCAddressPrefixOptions {
	return &DeleteVPCAddressPrefixOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *DeleteVPCAddressPrefixOptions) SetVPCID(vpcID string) *DeleteVPCAddressPrefixOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPCAddressPrefixOptions) SetID(id string) *DeleteVPCAddressPrefixOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPCAddressPrefixOptions) SetHeaders(param map[string]string) *DeleteVPCAddressPrefixOptions {
	options.Headers = param
	return options
}

// DeleteVPCDnsResolutionBindingOptions : The DeleteVPCDnsResolutionBinding options.
type DeleteVPCDnsResolutionBindingOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The DNS resolution binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPCDnsResolutionBindingOptions : Instantiate DeleteVPCDnsResolutionBindingOptions
func (*VpcV1) NewDeleteVPCDnsResolutionBindingOptions(vpcID string, id string) *DeleteVPCDnsResolutionBindingOptions {
	return &DeleteVPCDnsResolutionBindingOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *DeleteVPCDnsResolutionBindingOptions) SetVPCID(vpcID string) *DeleteVPCDnsResolutionBindingOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPCDnsResolutionBindingOptions) SetID(id string) *DeleteVPCDnsResolutionBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPCDnsResolutionBindingOptions) SetHeaders(param map[string]string) *DeleteVPCDnsResolutionBindingOptions {
	options.Headers = param
	return options
}

// DeleteVPCOptions : The DeleteVPC options.
type DeleteVPCOptions struct {
	// The VPC identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPCOptions : Instantiate DeleteVPCOptions
func (*VpcV1) NewDeleteVPCOptions(id string) *DeleteVPCOptions {
	return &DeleteVPCOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteVPCOptions) SetID(id string) *DeleteVPCOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteVPCOptions) SetIfMatch(ifMatch string) *DeleteVPCOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPCOptions) SetHeaders(param map[string]string) *DeleteVPCOptions {
	options.Headers = param
	return options
}

// DeleteVPCRouteOptions : The DeleteVPCRoute options.
type DeleteVPCRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPCRouteOptions : Instantiate DeleteVPCRouteOptions
func (*VpcV1) NewDeleteVPCRouteOptions(vpcID string, id string) *DeleteVPCRouteOptions {
	return &DeleteVPCRouteOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *DeleteVPCRouteOptions) SetVPCID(vpcID string) *DeleteVPCRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPCRouteOptions) SetID(id string) *DeleteVPCRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPCRouteOptions) SetHeaders(param map[string]string) *DeleteVPCRouteOptions {
	options.Headers = param
	return options
}

// DeleteVPCRoutingTableOptions : The DeleteVPCRoutingTable options.
type DeleteVPCRoutingTableOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPCRoutingTableOptions : Instantiate DeleteVPCRoutingTableOptions
func (*VpcV1) NewDeleteVPCRoutingTableOptions(vpcID string, id string) *DeleteVPCRoutingTableOptions {
	return &DeleteVPCRoutingTableOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *DeleteVPCRoutingTableOptions) SetVPCID(vpcID string) *DeleteVPCRoutingTableOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPCRoutingTableOptions) SetID(id string) *DeleteVPCRoutingTableOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteVPCRoutingTableOptions) SetIfMatch(ifMatch string) *DeleteVPCRoutingTableOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPCRoutingTableOptions) SetHeaders(param map[string]string) *DeleteVPCRoutingTableOptions {
	options.Headers = param
	return options
}

// DeleteVPCRoutingTableRouteOptions : The DeleteVPCRoutingTableRoute options.
type DeleteVPCRoutingTableRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	RoutingTableID *string `json:"routing_table_id" validate:"required,ne="`

	// The VPC routing table route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPCRoutingTableRouteOptions : Instantiate DeleteVPCRoutingTableRouteOptions
func (*VpcV1) NewDeleteVPCRoutingTableRouteOptions(vpcID string, routingTableID string, id string) *DeleteVPCRoutingTableRouteOptions {
	return &DeleteVPCRoutingTableRouteOptions{
		VPCID:          core.StringPtr(vpcID),
		RoutingTableID: core.StringPtr(routingTableID),
		ID:             core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *DeleteVPCRoutingTableRouteOptions) SetVPCID(vpcID string) *DeleteVPCRoutingTableRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetRoutingTableID : Allow user to set RoutingTableID
func (_options *DeleteVPCRoutingTableRouteOptions) SetRoutingTableID(routingTableID string) *DeleteVPCRoutingTableRouteOptions {
	_options.RoutingTableID = core.StringPtr(routingTableID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPCRoutingTableRouteOptions) SetID(id string) *DeleteVPCRoutingTableRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPCRoutingTableRouteOptions) SetHeaders(param map[string]string) *DeleteVPCRoutingTableRouteOptions {
	options.Headers = param
	return options
}

// DeleteVPNGatewayConnectionOptions : The DeleteVPNGatewayConnection options.
type DeleteVPNGatewayConnectionOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPNGatewayConnectionOptions : Instantiate DeleteVPNGatewayConnectionOptions
func (*VpcV1) NewDeleteVPNGatewayConnectionOptions(vpnGatewayID string, id string) *DeleteVPNGatewayConnectionOptions {
	return &DeleteVPNGatewayConnectionOptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *DeleteVPNGatewayConnectionOptions) SetVPNGatewayID(vpnGatewayID string) *DeleteVPNGatewayConnectionOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPNGatewayConnectionOptions) SetID(id string) *DeleteVPNGatewayConnectionOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPNGatewayConnectionOptions) SetHeaders(param map[string]string) *DeleteVPNGatewayConnectionOptions {
	options.Headers = param
	return options
}

// DeleteVPNGatewayOptions : The DeleteVPNGateway options.
type DeleteVPNGatewayOptions struct {
	// The VPN gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPNGatewayOptions : Instantiate DeleteVPNGatewayOptions
func (*VpcV1) NewDeleteVPNGatewayOptions(id string) *DeleteVPNGatewayOptions {
	return &DeleteVPNGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteVPNGatewayOptions) SetID(id string) *DeleteVPNGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPNGatewayOptions) SetHeaders(param map[string]string) *DeleteVPNGatewayOptions {
	options.Headers = param
	return options
}

// DeleteVPNServerClientOptions : The DeleteVPNServerClient options.
type DeleteVPNServerClientOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The VPN client identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPNServerClientOptions : Instantiate DeleteVPNServerClientOptions
func (*VpcV1) NewDeleteVPNServerClientOptions(vpnServerID string, id string) *DeleteVPNServerClientOptions {
	return &DeleteVPNServerClientOptions{
		VPNServerID: core.StringPtr(vpnServerID),
		ID:          core.StringPtr(id),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *DeleteVPNServerClientOptions) SetVPNServerID(vpnServerID string) *DeleteVPNServerClientOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPNServerClientOptions) SetID(id string) *DeleteVPNServerClientOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPNServerClientOptions) SetHeaders(param map[string]string) *DeleteVPNServerClientOptions {
	options.Headers = param
	return options
}

// DeleteVPNServerOptions : The DeleteVPNServer options.
type DeleteVPNServerOptions struct {
	// The VPN server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPNServerOptions : Instantiate DeleteVPNServerOptions
func (*VpcV1) NewDeleteVPNServerOptions(id string) *DeleteVPNServerOptions {
	return &DeleteVPNServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeleteVPNServerOptions) SetID(id string) *DeleteVPNServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *DeleteVPNServerOptions) SetIfMatch(ifMatch string) *DeleteVPNServerOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPNServerOptions) SetHeaders(param map[string]string) *DeleteVPNServerOptions {
	options.Headers = param
	return options
}

// DeleteVPNServerRouteOptions : The DeleteVPNServerRoute options.
type DeleteVPNServerRouteOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The VPN route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeleteVPNServerRouteOptions : Instantiate DeleteVPNServerRouteOptions
func (*VpcV1) NewDeleteVPNServerRouteOptions(vpnServerID string, id string) *DeleteVPNServerRouteOptions {
	return &DeleteVPNServerRouteOptions{
		VPNServerID: core.StringPtr(vpnServerID),
		ID:          core.StringPtr(id),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *DeleteVPNServerRouteOptions) SetVPNServerID(vpnServerID string) *DeleteVPNServerRouteOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DeleteVPNServerRouteOptions) SetID(id string) *DeleteVPNServerRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeleteVPNServerRouteOptions) SetHeaders(param map[string]string) *DeleteVPNServerRouteOptions {
	options.Headers = param
	return options
}

// Deleted : If present, this property indicates the referenced resource has been deleted, and provides some supplementary
// information.
type Deleted struct {
	// A link to documentation about deleted resources.
	MoreInfo *string `json:"more_info" validate:"required"`
}

// UnmarshalDeleted unmarshals an instance of Deleted from the specified map of raw messages.
func UnmarshalDeleted(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Deleted)
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions : The DenyPrivatePathServiceGatewayEndpointGatewayBinding options.
type DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The endpoint gateway binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Indicates whether this will become the access policy for any `pending` and future endpoint gateway bindings from the
	// same account.
	//
	// If set to `true`:
	// - If the account has an existing access policy, that policy will be updated to `deny`.
	//   Otherwise, a new `deny` access policy will be created for the account.
	// - All `pending` endpoint gateway bindings for the account will be denied.
	//
	// If set to `false`:
	// - No access policies will be created or updated
	// - All `pending` endpoint gateway bindings for the account will remain `pending`.
	SetAccountPolicy *bool `json:"set_account_policy,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDenyPrivatePathServiceGatewayEndpointGatewayBindingOptions : Instantiate DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions
func (*VpcV1) NewDenyPrivatePathServiceGatewayEndpointGatewayBindingOptions(privatePathServiceGatewayID string, id string) *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	return &DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		ID:                          core.StringPtr(id),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetID(id string) *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSetAccountPolicy : Allow user to set SetAccountPolicy
func (_options *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetSetAccountPolicy(setAccountPolicy bool) *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.SetAccountPolicy = core.BoolPtr(setAccountPolicy)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetHeaders(param map[string]string) *DenyPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	options.Headers = param
	return options
}

// DeprecateImageOptions : The DeprecateImage options.
type DeprecateImageOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDeprecateImageOptions : Instantiate DeprecateImageOptions
func (*VpcV1) NewDeprecateImageOptions(id string) *DeprecateImageOptions {
	return &DeprecateImageOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *DeprecateImageOptions) SetID(id string) *DeprecateImageOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DeprecateImageOptions) SetHeaders(param map[string]string) *DeprecateImageOptions {
	options.Headers = param
	return options
}

// DisconnectVPNClientOptions : The DisconnectVPNClient options.
type DisconnectVPNClientOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The VPN client identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewDisconnectVPNClientOptions : Instantiate DisconnectVPNClientOptions
func (*VpcV1) NewDisconnectVPNClientOptions(vpnServerID string, id string) *DisconnectVPNClientOptions {
	return &DisconnectVPNClientOptions{
		VPNServerID: core.StringPtr(vpnServerID),
		ID:          core.StringPtr(id),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *DisconnectVPNClientOptions) SetVPNServerID(vpnServerID string) *DisconnectVPNClientOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *DisconnectVPNClientOptions) SetID(id string) *DisconnectVPNClientOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *DisconnectVPNClientOptions) SetHeaders(param map[string]string) *DisconnectVPNClientOptions {
	options.Headers = param
	return options
}

// EncryptionKeyIdentity : Identifies an encryption key by a unique property.
// Models which "extend" this model:
// - EncryptionKeyIdentityByCRN
type EncryptionKeyIdentity struct {
	// The CRN of the [Key Protect Root
	// Key](https://cloud.ibm.com/docs/key-protect?topic=key-protect-getting-started-tutorial) or [Hyper Protect Crypto
	// Services Root Key](https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-get-started) for this resource.
	CRN *string `json:"crn,omitempty"`
}

func (*EncryptionKeyIdentity) isaEncryptionKeyIdentity() bool {
	return true
}

type EncryptionKeyIdentityIntf interface {
	isaEncryptionKeyIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalEncryptionKeyIdentity unmarshals an instance of EncryptionKeyIdentity from the specified map of raw messages.
func UnmarshalEncryptionKeyIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EncryptionKeyIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the EncryptionKeyIdentity
func (encryptionKeyIdentity *EncryptionKeyIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(encryptionKeyIdentity.CRN) {
		_patch["crn"] = encryptionKeyIdentity.CRN
	}

	return
}

// EncryptionKeyReference : EncryptionKeyReference struct
type EncryptionKeyReference struct {
	// The CRN of the [Key Protect Root
	// Key](https://cloud.ibm.com/docs/key-protect?topic=key-protect-getting-started-tutorial) or [Hyper Protect Crypto
	// Services Root Key](https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-get-started) for this resource.
	CRN *string `json:"crn" validate:"required"`
}

// UnmarshalEncryptionKeyReference unmarshals an instance of EncryptionKeyReference from the specified map of raw messages.
func UnmarshalEncryptionKeyReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EncryptionKeyReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGateway : EndpointGateway struct
type EndpointGateway struct {
	// Indicates whether to allow DNS resolution for this endpoint gateway when the VPC this endpoint gateway resides in
	// has a DNS resolution binding to a VPC with `dns.enable_hub` set to `true`.
	AllowDnsResolutionBinding *bool `json:"allow_dns_resolution_binding" validate:"required"`

	// The date and time that the endpoint gateway was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this endpoint gateway.
	CRN *string `json:"crn" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this endpoint gateway.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this endpoint gateway.
	ID *string `json:"id" validate:"required"`

	// The reserved IPs bound to this endpoint gateway.
	Ips []ReservedIPReference `json:"ips" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []EndpointGatewayLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the endpoint gateway.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this endpoint gateway. The name is unique across all endpoint gateways in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this endpoint gateway.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The security groups targeting this endpoint gateway.
	SecurityGroups []SecurityGroupReference `json:"security_groups" validate:"required"`

	// The fully qualified domain name for the target service. The domain name may have a wildcard prefix.
	// Deprecated: this field is deprecated and may be removed in a future release.
	ServiceEndpoint *string `json:"service_endpoint,omitempty"`

	// The fully qualified domain names for the target service. A domain name may have a wildcard prefix.
	ServiceEndpoints []string `json:"service_endpoints" validate:"required"`

	// The target for this endpoint gateway.
	Target EndpointGatewayTargetIntf `json:"target" validate:"required"`

	// The VPC this endpoint gateway resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// Constants associated with the EndpointGateway.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	EndpointGatewayHealthStateDegradedConst     = "degraded"
	EndpointGatewayHealthStateFaultedConst      = "faulted"
	EndpointGatewayHealthStateInapplicableConst = "inapplicable"
	EndpointGatewayHealthStateOkConst           = "ok"
)

// Constants associated with the EndpointGateway.LifecycleState property.
// The lifecycle state of the endpoint gateway.
const (
	EndpointGatewayLifecycleStateDeletingConst  = "deleting"
	EndpointGatewayLifecycleStateFailedConst    = "failed"
	EndpointGatewayLifecycleStatePendingConst   = "pending"
	EndpointGatewayLifecycleStateStableConst    = "stable"
	EndpointGatewayLifecycleStateSuspendedConst = "suspended"
	EndpointGatewayLifecycleStateUpdatingConst  = "updating"
	EndpointGatewayLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the EndpointGateway.ResourceType property.
// The resource type.
const (
	EndpointGatewayResourceTypeEndpointGatewayConst = "endpoint_gateway"
)

// UnmarshalEndpointGateway unmarshals an instance of EndpointGateway from the specified map of raw messages.
func UnmarshalEndpointGateway(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGateway)
	err = core.UnmarshalPrimitive(m, "allow_dns_resolution_binding", &obj.AllowDnsResolutionBinding)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_dns_resolution_binding-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalEndpointGatewayLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "service_endpoint", &obj.ServiceEndpoint)
	if err != nil {
		err = core.SDKErrorf(err, "", "service_endpoint-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "service_endpoints", &obj.ServiceEndpoints)
	if err != nil {
		err = core.SDKErrorf(err, "", "service_endpoints-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalEndpointGatewayTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGatewayCollection : EndpointGatewayCollection struct
type EndpointGatewayCollection struct {
	// A page of endpoint gateways.
	EndpointGateways []EndpointGateway `json:"endpoint_gateways" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalEndpointGatewayCollection unmarshals an instance of EndpointGatewayCollection from the specified map of raw messages.
func UnmarshalEndpointGatewayCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayCollection)
	err = core.UnmarshalModel(m, "endpoint_gateways", &obj.EndpointGateways, UnmarshalEndpointGateway)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint_gateways-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *EndpointGatewayCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// EndpointGatewayLifecycleReason : EndpointGatewayLifecycleReason struct
type EndpointGatewayLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `access_denied`: endpoint gateway access was denied
	// - `access_expired`: endpoint gateway access has expired
	// - `access_pending`: endpoint gateway access is pending
	// - `dns_resolution_binding_pending`: the DNS resolution binding is being set up
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the EndpointGatewayLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `access_denied`: endpoint gateway access was denied
//   - `access_expired`: endpoint gateway access has expired
//   - `access_pending`: endpoint gateway access is pending
//   - `dns_resolution_binding_pending`: the DNS resolution binding is being set up
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	EndpointGatewayLifecycleReasonCodeAccessDeniedConst                = "access_denied"
	EndpointGatewayLifecycleReasonCodeAccessExpiredConst               = "access_expired"
	EndpointGatewayLifecycleReasonCodeAccessPendingConst               = "access_pending"
	EndpointGatewayLifecycleReasonCodeDnsResolutionBindingPendingConst = "dns_resolution_binding_pending"
	EndpointGatewayLifecycleReasonCodeInternalErrorConst               = "internal_error"
	EndpointGatewayLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalEndpointGatewayLifecycleReason unmarshals an instance of EndpointGatewayLifecycleReason from the specified map of raw messages.
func UnmarshalEndpointGatewayLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGatewayPatch : EndpointGatewayPatch struct
type EndpointGatewayPatch struct {
	// Indicates whether to allow DNS resolution for this endpoint gateway when the VPC this endpoint gateway resides in
	// has a DNS resolution binding to a VPC with `dns.enable_hub` set to `true`.
	//
	// If `true`, then there must not be another endpoint gateway with
	// `allow_dns_resolution_binding` set to `true` in the [DNS sharing](/docs/vpc?topic=vpc-vpe-dns-sharing) connected
	// topology that:
	// - Has the same `target` as this endpoint gateway
	// - Has `service_endpoints` that overlap with the `service_endpoints` for this endpoint
	//   gateway.
	//
	// Must be `true` if the VPC this endpoint gateway resides in has `dns.enable_hub` set to
	// `true`.
	AllowDnsResolutionBinding *bool `json:"allow_dns_resolution_binding,omitempty"`

	// The name for this endpoint gateway. The name must not be used by another endpoint gateway in the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalEndpointGatewayPatch unmarshals an instance of EndpointGatewayPatch from the specified map of raw messages.
func UnmarshalEndpointGatewayPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayPatch)
	err = core.UnmarshalPrimitive(m, "allow_dns_resolution_binding", &obj.AllowDnsResolutionBinding)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_dns_resolution_binding-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the EndpointGatewayPatch
func (endpointGatewayPatch *EndpointGatewayPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(endpointGatewayPatch.AllowDnsResolutionBinding) {
		_patch["allow_dns_resolution_binding"] = endpointGatewayPatch.AllowDnsResolutionBinding
	}
	if !core.IsNil(endpointGatewayPatch.Name) {
		_patch["name"] = endpointGatewayPatch.Name
	}

	return
}

// EndpointGatewayReferenceRemote : EndpointGatewayReferenceRemote struct
type EndpointGatewayReferenceRemote struct {
	// The CRN for this endpoint gateway.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this endpoint gateway.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this endpoint gateway.
	ID *string `json:"id" validate:"required"`

	// The name for this endpoint gateway. The name is unique across all endpoint gateways in the VPC.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *EndpointGatewayRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the EndpointGatewayReferenceRemote.ResourceType property.
// The resource type.
const (
	EndpointGatewayReferenceRemoteResourceTypeEndpointGatewayConst = "endpoint_gateway"
)

// UnmarshalEndpointGatewayReferenceRemote unmarshals an instance of EndpointGatewayReferenceRemote from the specified map of raw messages.
func UnmarshalEndpointGatewayReferenceRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayReferenceRemote)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalEndpointGatewayRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGatewayRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type EndpointGatewayRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`

	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalEndpointGatewayRemote unmarshals an instance of EndpointGatewayRemote from the specified map of raw messages.
func UnmarshalEndpointGatewayRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayRemote)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGatewayReservedIP : A reserved IP to bind to the endpoint gateway. This can be specified using an existing reserved IP, or a prototype
// object for a new reserved IP. The reserved IP will be bound to the endpoint gateway to function as a virtual private
// endpoint for the service.
// Models which "extend" this model:
// - EndpointGatewayReservedIPReservedIPIdentity
// - EndpointGatewayReservedIPReservedIPPrototypeTargetContext
type EndpointGatewayReservedIP struct {
	// The unique identifier for this reserved IP.
	ID *string `json:"id,omitempty"`

	// The URL for this reserved IP.
	Href *string `json:"href,omitempty"`

	// The IP address to reserve, which must not already be reserved on the subnet.
	//
	// If unspecified, an available address on the subnet will automatically be selected.
	Address *string `json:"address,omitempty"`

	// Indicates whether this reserved IP member will be automatically deleted when either
	// `target` is deleted, or the reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this reserved IP. The name must not be used by another reserved IP in the subnet. Names starting with
	// `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified, the name will be a hyphenated
	// list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The subnet in which to create this reserved IP.
	Subnet SubnetIdentityIntf `json:"subnet,omitempty"`
}

func (*EndpointGatewayReservedIP) isaEndpointGatewayReservedIP() bool {
	return true
}

type EndpointGatewayReservedIPIntf interface {
	isaEndpointGatewayReservedIP() bool
}

// UnmarshalEndpointGatewayReservedIP unmarshals an instance of EndpointGatewayReservedIP from the specified map of raw messages.
func UnmarshalEndpointGatewayReservedIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayReservedIP)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGatewayTarget : The target for this endpoint gateway.
// Models which "extend" this model:
// - EndpointGatewayTargetPrivatePathServiceGatewayReference
// - EndpointGatewayTargetProviderCloudServiceReference
// - EndpointGatewayTargetProviderInfrastructureServiceReference
type EndpointGatewayTarget struct {
	// The target resource type for this endpoint gateway.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The CRN for this private path service gateway.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this private path service gateway.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this private path service gateway.
	ID *string `json:"id,omitempty"`

	// The name for this private path service gateway. The name is unique across all private path service gateways in the
	// VPC.
	Name *string `json:"name,omitempty"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *PrivatePathServiceGatewayRemote `json:"remote,omitempty"`
}

// Constants associated with the EndpointGatewayTarget.ResourceType property.
// The target resource type for this endpoint gateway.
const (
	EndpointGatewayTargetResourceTypePrivatePathServiceGatewayConst     = "private_path_service_gateway"
	EndpointGatewayTargetResourceTypeProviderCloudServiceConst          = "provider_cloud_service"
	EndpointGatewayTargetResourceTypeProviderInfrastructureServiceConst = "provider_infrastructure_service"
)

func (*EndpointGatewayTarget) isaEndpointGatewayTarget() bool {
	return true
}

type EndpointGatewayTargetIntf interface {
	isaEndpointGatewayTarget() bool
}

// UnmarshalEndpointGatewayTarget unmarshals an instance of EndpointGatewayTarget from the specified map of raw messages.
func UnmarshalEndpointGatewayTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayTarget)
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalPrivatePathServiceGatewayRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// EndpointGatewayTargetPrototype : The target to use for this endpoint gateway. The target:
//   - Must not already be the target of another endpoint gateway in the VPC
//   - Must not have a service endpoint that overlaps with any `service_endpoints` of
//     another endpoint gateway in the VPC.
//
// If `allow_dns_resolution_binding` is `true`, then there must not be another endpoint gateway with
// `allow_dns_resolution_binding` set to `true` in the [DNS sharing](/docs/vpc?topic=vpc-vpe-dns-sharing) connected
// topology that:
//   - Has the same `target` as this endpoint gateway
//   - Has `service_endpoints` that overlap with the `service_endpoints` for this endpoint
//     gateway.
//
// Models which "extend" this model:
// - EndpointGatewayTargetPrototypeEndpointGatewayTargetResourceTypePrivatePathServiceGatewayPrototype
// - EndpointGatewayTargetPrototypeEndpointGatewayTargetResourceTypeProviderInfrastructureServicePrototype
// - EndpointGatewayTargetPrototypeEndpointGatewayTargetResourceTypeProviderCloudServicePrototype
type EndpointGatewayTargetPrototype struct {
	// The target resource type for this endpoint gateway.
	ResourceType *string `json:"resource_type,omitempty"`

	// The CRN for this private path service gateway.
	CRN *string `json:"crn,omitempty"`

	// The name of a provider infrastructure service. Must be:
	// - `ibm-ntp-server`: An NTP (Network Time Protocol) server provided by IBM.
	Name *string `json:"name,omitempty"`
}

// Constants associated with the EndpointGatewayTargetPrototype.ResourceType property.
// The target resource type for this endpoint gateway.
const (
	EndpointGatewayTargetPrototypeResourceTypePrivatePathServiceGatewayConst     = "private_path_service_gateway"
	EndpointGatewayTargetPrototypeResourceTypeProviderCloudServiceConst          = "provider_cloud_service"
	EndpointGatewayTargetPrototypeResourceTypeProviderInfrastructureServiceConst = "provider_infrastructure_service"
)

func (*EndpointGatewayTargetPrototype) isaEndpointGatewayTargetPrototype() bool {
	return true
}

type EndpointGatewayTargetPrototypeIntf interface {
	isaEndpointGatewayTargetPrototype() bool
}

// UnmarshalEndpointGatewayTargetPrototype unmarshals an instance of EndpointGatewayTargetPrototype from the specified map of raw messages.
func UnmarshalEndpointGatewayTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(EndpointGatewayTargetPrototype)
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FailoverShareOptions : The FailoverShare options.
type FailoverShareOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The action to take if the failover request is accepted but cannot be performed or times out:
	// - `fail`: Fail the operation, resulting in the replication relationship being unchanged.
	// - `split`: Split the replica from its source, resulting in two individual read-write
	//     file shares. Because the final sync was not completed, the replica may be
	//     out-of-date. This occurs in disaster recovery scenarios where the source is known to
	//     be unreachable.
	FallbackPolicy *string `json:"fallback_policy,omitempty"`

	// The failover timeout in seconds.
	//
	// If the timeout is reached, the `fallback_policy` will be triggered.
	Timeout *int64 `json:"timeout,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the FailoverShareOptions.FallbackPolicy property.
// The action to take if the failover request is accepted but cannot be performed or times out:
//   - `fail`: Fail the operation, resulting in the replication relationship being unchanged.
//   - `split`: Split the replica from its source, resulting in two individual read-write
//     file shares. Because the final sync was not completed, the replica may be
//     out-of-date. This occurs in disaster recovery scenarios where the source is known to
//     be unreachable.
const (
	FailoverShareOptionsFallbackPolicyFailConst  = "fail"
	FailoverShareOptionsFallbackPolicySplitConst = "split"
)

// NewFailoverShareOptions : Instantiate FailoverShareOptions
func (*VpcV1) NewFailoverShareOptions(shareID string) *FailoverShareOptions {
	return &FailoverShareOptions{
		ShareID: core.StringPtr(shareID),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *FailoverShareOptions) SetShareID(shareID string) *FailoverShareOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetFallbackPolicy : Allow user to set FallbackPolicy
func (_options *FailoverShareOptions) SetFallbackPolicy(fallbackPolicy string) *FailoverShareOptions {
	_options.FallbackPolicy = core.StringPtr(fallbackPolicy)
	return _options
}

// SetTimeout : Allow user to set Timeout
func (_options *FailoverShareOptions) SetTimeout(timeout int64) *FailoverShareOptions {
	_options.Timeout = core.Int64Ptr(timeout)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *FailoverShareOptions) SetHeaders(param map[string]string) *FailoverShareOptions {
	options.Headers = param
	return options
}

// FloatingIP : FloatingIP struct
type FloatingIP struct {
	// The globally unique IP address.
	Address *string `json:"address" validate:"required"`

	// The date and time that the floating IP was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this floating IP.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this floating IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this floating IP.
	ID *string `json:"id" validate:"required"`

	// The name for this floating IP. The name is unique across all floating IPs in the region.
	Name *string `json:"name" validate:"required"`

	// The resource group for this floating IP.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The status of the floating IP.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The target of this floating IP.
	Target FloatingIPTargetIntf `json:"target,omitempty"`

	// The zone this floating IP resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the FloatingIP.Status property.
// The status of the floating IP.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	FloatingIPStatusAvailableConst = "available"
	FloatingIPStatusDeletingConst  = "deleting"
	FloatingIPStatusFailedConst    = "failed"
	FloatingIPStatusPendingConst   = "pending"
)

// UnmarshalFloatingIP unmarshals an instance of FloatingIP from the specified map of raw messages.
func UnmarshalFloatingIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIP)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalFloatingIPTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FloatingIPCollection : FloatingIPCollection struct
type FloatingIPCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of floating IPs.
	FloatingIps []FloatingIP `json:"floating_ips" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalFloatingIPCollection unmarshals an instance of FloatingIPCollection from the specified map of raw messages.
func UnmarshalFloatingIPCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "floating_ips", &obj.FloatingIps, UnmarshalFloatingIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "floating_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *FloatingIPCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// FloatingIPCollectionVirtualNetworkInterfaceContext : FloatingIPCollectionVirtualNetworkInterfaceContext struct
type FloatingIPCollectionVirtualNetworkInterfaceContext struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of floating IPs bound to the virtual network interface specified by the identifier in the URL.
	FloatingIps []FloatingIPReference `json:"floating_ips" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalFloatingIPCollectionVirtualNetworkInterfaceContext unmarshals an instance of FloatingIPCollectionVirtualNetworkInterfaceContext from the specified map of raw messages.
func UnmarshalFloatingIPCollectionVirtualNetworkInterfaceContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPCollectionVirtualNetworkInterfaceContext)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "floating_ips", &obj.FloatingIps, UnmarshalFloatingIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "floating_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *FloatingIPCollectionVirtualNetworkInterfaceContext) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// FloatingIPPatch : FloatingIPPatch struct
type FloatingIPPatch struct {
	// The name for this floating IP. The name must not be used by another floating IP in the region.
	Name *string `json:"name,omitempty"`

	// The target resource to bind this floating IP to, replacing any existing binding.
	// The floating IP must not be required by another resource, such as a public gateway.
	//
	// The target resource must not already have a floating IP bound to it if the target
	// resource is:
	//
	// - an instance network interface
	// - a bare metal server network interface with `enable_infrastructure_nat` set to `true`
	// - a virtual network interface with `enable_infrastructure_nat` set to `true`
	//
	// Specify `null` to remove an existing binding.
	Target FloatingIPTargetPatchIntf `json:"target,omitempty"`
}

// UnmarshalFloatingIPPatch unmarshals an instance of FloatingIPPatch from the specified map of raw messages.
func UnmarshalFloatingIPPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalFloatingIPTargetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the FloatingIPPatch
func (floatingIPPatch *FloatingIPPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(floatingIPPatch.Name) {
		_patch["name"] = floatingIPPatch.Name
	}
	if !core.IsNil(floatingIPPatch.Target) {
		_patch["target"] = floatingIPPatch.Target.asPatch()
	}

	return
}

// FloatingIPPrototype : FloatingIPPrototype struct
// Models which "extend" this model:
// - FloatingIPPrototypeFloatingIPByZone
// - FloatingIPPrototypeFloatingIPByTarget
type FloatingIPPrototype struct {
	// The name for this floating IP. The name must not be used by another floating IP in the region. If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The zone this floating IP will reside in.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`

	// The target resource to bind this floating IP to.
	//
	// The target resource must not already have a floating IP bound to it if the target
	// resource is:
	//
	// - an instance network interface
	// - a bare metal server network interface with `enable_infrastructure_nat` set to `true`
	// - a virtual network interface with `enable_infrastructure_nat` set to `true`.
	Target FloatingIPTargetPrototypeIntf `json:"target,omitempty"`
}

func (*FloatingIPPrototype) isaFloatingIPPrototype() bool {
	return true
}

type FloatingIPPrototypeIntf interface {
	isaFloatingIPPrototype() bool
}

// UnmarshalFloatingIPPrototype unmarshals an instance of FloatingIPPrototype from the specified map of raw messages.
func UnmarshalFloatingIPPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPPrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalFloatingIPTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FloatingIPReference : FloatingIPReference struct
type FloatingIPReference struct {
	// The globally unique IP address.
	Address *string `json:"address" validate:"required"`

	// The CRN for this floating IP.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this floating IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this floating IP.
	ID *string `json:"id" validate:"required"`

	// The name for this floating IP. The name is unique across all floating IPs in the region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalFloatingIPReference unmarshals an instance of FloatingIPReference from the specified map of raw messages.
func UnmarshalFloatingIPReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPReference)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FloatingIPTarget : The target of this floating IP.
// Models which "extend" this model:
// - FloatingIPTargetNetworkInterfaceReference
// - FloatingIPTargetBareMetalServerNetworkInterfaceReference
// - FloatingIPTargetPublicGatewayReference
// - FloatingIPTargetVirtualNetworkInterfaceReference
type FloatingIPTarget struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id,omitempty"`

	// The name for this instance network interface.
	Name *string `json:"name,omitempty"`

	// The primary IP address of this instance network interface.
	PrimaryIP *ReservedIPReference `json:"primary_ip,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`

	// The CRN for this public gateway.
	CRN *string `json:"crn,omitempty"`

	// The associated subnet.
	Subnet *SubnetReference `json:"subnet,omitempty"`
}

// Constants associated with the FloatingIPTarget.ResourceType property.
// The resource type.
const (
	FloatingIPTargetResourceTypeNetworkInterfaceConst = "network_interface"
)

func (*FloatingIPTarget) isaFloatingIPTarget() bool {
	return true
}

type FloatingIPTargetIntf interface {
	isaFloatingIPTarget() bool
}

// UnmarshalFloatingIPTarget unmarshals an instance of FloatingIPTarget from the specified map of raw messages.
func UnmarshalFloatingIPTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPTarget)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FloatingIPTargetPatch : The target resource to bind this floating IP to, replacing any existing binding. The floating IP must not be required
// by another resource, such as a public gateway.
//
// The target resource must not already have a floating IP bound to it if the target resource is:
//
// - an instance network interface
// - a bare metal server network interface with `enable_infrastructure_nat` set to `true`
// - a virtual network interface with `enable_infrastructure_nat` set to `true`
//
// Specify `null` to remove an existing binding.
// Models which "extend" this model:
// - FloatingIPTargetPatchBareMetalServerNetworkInterfaceIdentity
// - FloatingIPTargetPatchNetworkInterfaceIdentity
// - FloatingIPTargetPatchVirtualNetworkInterfaceIdentity
type FloatingIPTargetPatch struct {
	// The unique identifier for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id,omitempty"`

	// The URL for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href,omitempty"`

	// The CRN for this virtual network interface.
	CRN *string `json:"crn,omitempty"`
}

func (*FloatingIPTargetPatch) isaFloatingIPTargetPatch() bool {
	return true
}

type FloatingIPTargetPatchIntf interface {
	isaFloatingIPTargetPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalFloatingIPTargetPatch unmarshals an instance of FloatingIPTargetPatch from the specified map of raw messages.
func UnmarshalFloatingIPTargetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPTargetPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the FloatingIPTargetPatch
func (floatingIPTargetPatch *FloatingIPTargetPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(floatingIPTargetPatch.ID) {
		_patch["id"] = floatingIPTargetPatch.ID
	}
	if !core.IsNil(floatingIPTargetPatch.Href) {
		_patch["href"] = floatingIPTargetPatch.Href
	}
	if !core.IsNil(floatingIPTargetPatch.CRN) {
		_patch["crn"] = floatingIPTargetPatch.CRN
	}

	return
}

// FloatingIPTargetPrototype : The target resource to bind this floating IP to.
//
// The target resource must not already have a floating IP bound to it if the target resource is:
//
// - an instance network interface
// - a bare metal server network interface with `enable_infrastructure_nat` set to `true`
// - a virtual network interface with `enable_infrastructure_nat` set to `true`.
// Models which "extend" this model:
// - FloatingIPTargetPrototypeBareMetalServerNetworkInterfaceIdentity
// - FloatingIPTargetPrototypeNetworkInterfaceIdentity
// - FloatingIPTargetPrototypeVirtualNetworkInterfaceIdentity
type FloatingIPTargetPrototype struct {
	// The unique identifier for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id,omitempty"`

	// The URL for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href,omitempty"`

	// The CRN for this virtual network interface.
	CRN *string `json:"crn,omitempty"`
}

func (*FloatingIPTargetPrototype) isaFloatingIPTargetPrototype() bool {
	return true
}

type FloatingIPTargetPrototypeIntf interface {
	isaFloatingIPTargetPrototype() bool
}

// UnmarshalFloatingIPTargetPrototype unmarshals an instance of FloatingIPTargetPrototype from the specified map of raw messages.
func UnmarshalFloatingIPTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPTargetPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FloatingIPUnpaginatedCollection : FloatingIPUnpaginatedCollection struct
type FloatingIPUnpaginatedCollection struct {
	// The floating IPs.
	FloatingIps []FloatingIP `json:"floating_ips" validate:"required"`
}

// UnmarshalFloatingIPUnpaginatedCollection unmarshals an instance of FloatingIPUnpaginatedCollection from the specified map of raw messages.
func UnmarshalFloatingIPUnpaginatedCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FloatingIPUnpaginatedCollection)
	err = core.UnmarshalModel(m, "floating_ips", &obj.FloatingIps, UnmarshalFloatingIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "floating_ips-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FlowLogCollector : FlowLogCollector struct
type FlowLogCollector struct {
	// Indicates whether this collector is active.
	Active *bool `json:"active" validate:"required"`

	// Indicates whether this flow log collector will be automatically deleted when `target` is deleted. At present, this
	// is always `true`, but may be modifiable in the future.
	AutoDelete *bool `json:"auto_delete" validate:"required"`

	// The date and time that the flow log collector was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this flow log collector.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this flow log collector.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this flow log collector.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the flow log collector.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this flow log collector. The name is unique across all flow log collectors in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this flow log collector.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The Cloud Object Storage bucket where the collected flows are logged. For more
	// information, see [Viewing flow log
	// objects](https://cloud.ibm.com/docs/vpc?topic=vpc-fl-analyze).
	StorageBucket *LegacyCloudObjectStorageBucketReference `json:"storage_bucket" validate:"required"`

	// The target this collector is collecting flow logs for.
	//
	// - If the target is an instance network attachment, flow logs will be collected
	//   for that instance network attachment.
	// - If the target is an instance network interface, flow logs will be collected
	//   for that instance network interface.
	// - If the target is a virtual network interface, flow logs will be collected for the
	//   virtual network interface's `target` resource if the resource is an instance network
	//   attachment, unless the target resource is itself the target of a flow log collector.
	// - If the target is a virtual server instance, flow logs will be collected
	//   for all network attachments or network interfaces on that instance.
	// - If the target is a subnet, flow logs will be collected
	//   for all instance network interfaces and virtual network interfaces
	//   attached to that subnet.
	// - If the target is a VPC, flow logs will be collected for all instance network
	//   interfaces and virtual network interfaces  attached to all subnets within that VPC.
	//
	// If the target is an instance, subnet, or VPC, flow logs will not be collected
	// for any instance network attachments or instance network interfaces within the target
	// that are themselves the target of a more specific flow log collector.
	Target FlowLogCollectorTargetIntf `json:"target" validate:"required"`

	// The VPC this flow log collector resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// Constants associated with the FlowLogCollector.LifecycleState property.
// The lifecycle state of the flow log collector.
const (
	FlowLogCollectorLifecycleStateDeletingConst  = "deleting"
	FlowLogCollectorLifecycleStateFailedConst    = "failed"
	FlowLogCollectorLifecycleStatePendingConst   = "pending"
	FlowLogCollectorLifecycleStateStableConst    = "stable"
	FlowLogCollectorLifecycleStateSuspendedConst = "suspended"
	FlowLogCollectorLifecycleStateUpdatingConst  = "updating"
	FlowLogCollectorLifecycleStateWaitingConst   = "waiting"
)

// UnmarshalFlowLogCollector unmarshals an instance of FlowLogCollector from the specified map of raw messages.
func UnmarshalFlowLogCollector(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FlowLogCollector)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "storage_bucket", &obj.StorageBucket, UnmarshalLegacyCloudObjectStorageBucketReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "storage_bucket-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalFlowLogCollectorTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FlowLogCollectorCollection : FlowLogCollectorCollection struct
type FlowLogCollectorCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of flow log collectors.
	FlowLogCollectors []FlowLogCollector `json:"flow_log_collectors" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalFlowLogCollectorCollection unmarshals an instance of FlowLogCollectorCollection from the specified map of raw messages.
func UnmarshalFlowLogCollectorCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FlowLogCollectorCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "flow_log_collectors", &obj.FlowLogCollectors, UnmarshalFlowLogCollector)
	if err != nil {
		err = core.SDKErrorf(err, "", "flow_log_collectors-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *FlowLogCollectorCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// FlowLogCollectorPatch : FlowLogCollectorPatch struct
type FlowLogCollectorPatch struct {
	// Indicates whether this collector is active. Updating to false deactivates the collector and updating to true
	// activates the collector.
	Active *bool `json:"active,omitempty"`

	// The name for this flow log collector. The name must not be used by another flow log collector in the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalFlowLogCollectorPatch unmarshals an instance of FlowLogCollectorPatch from the specified map of raw messages.
func UnmarshalFlowLogCollectorPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FlowLogCollectorPatch)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the FlowLogCollectorPatch
func (flowLogCollectorPatch *FlowLogCollectorPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(flowLogCollectorPatch.Active) {
		_patch["active"] = flowLogCollectorPatch.Active
	}
	if !core.IsNil(flowLogCollectorPatch.Name) {
		_patch["name"] = flowLogCollectorPatch.Name
	}

	return
}

// FlowLogCollectorTarget : The target this collector is collecting flow logs for.
//
//   - If the target is an instance network attachment, flow logs will be collected
//     for that instance network attachment.
//   - If the target is an instance network interface, flow logs will be collected
//     for that instance network interface.
//   - If the target is a virtual network interface, flow logs will be collected for the
//     virtual network interface's `target` resource if the resource is an instance network
//     attachment, unless the target resource is itself the target of a flow log collector.
//   - If the target is a virtual server instance, flow logs will be collected
//     for all network attachments or network interfaces on that instance.
//   - If the target is a subnet, flow logs will be collected
//     for all instance network interfaces and virtual network interfaces
//     attached to that subnet.
//   - If the target is a VPC, flow logs will be collected for all instance network
//     interfaces and virtual network interfaces  attached to all subnets within that VPC.
//
// If the target is an instance, subnet, or VPC, flow logs will not be collected for any instance network attachments or
// instance network interfaces within the target that are themselves the target of a more specific flow log collector.
// Models which "extend" this model:
// - FlowLogCollectorTargetNetworkInterfaceReferenceTargetContext
// - FlowLogCollectorTargetInstanceReference
// - FlowLogCollectorTargetSubnetReference
// - FlowLogCollectorTargetVPCReference
// - FlowLogCollectorTargetInstanceNetworkAttachmentReference
// - FlowLogCollectorTargetVirtualNetworkInterfaceReferenceAttachmentContext
type FlowLogCollectorTarget struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id,omitempty"`

	// The name for this instance network interface.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`

	// The CRN for this virtual server instance.
	CRN *string `json:"crn,omitempty"`

	// The primary IP address of the virtual network interface for the instance network
	// attachment.
	PrimaryIP *ReservedIPReference `json:"primary_ip,omitempty"`

	// The subnet of the virtual network interface for the instance network attachment.
	Subnet *SubnetReference `json:"subnet,omitempty"`

	// The virtual network interface for this instance network attachment.
	VirtualNetworkInterface *VirtualNetworkInterfaceReferenceAttachmentContext `json:"virtual_network_interface,omitempty"`
}

// Constants associated with the FlowLogCollectorTarget.ResourceType property.
// The resource type.
const (
	FlowLogCollectorTargetResourceTypeNetworkInterfaceConst = "network_interface"
)

func (*FlowLogCollectorTarget) isaFlowLogCollectorTarget() bool {
	return true
}

type FlowLogCollectorTargetIntf interface {
	isaFlowLogCollectorTarget() bool
}

// UnmarshalFlowLogCollectorTarget unmarshals an instance of FlowLogCollectorTarget from the specified map of raw messages.
func UnmarshalFlowLogCollectorTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FlowLogCollectorTarget)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalVirtualNetworkInterfaceReferenceAttachmentContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// FlowLogCollectorTargetPrototype : The target this collector will collect flow logs for.
//
// If the target is an instance, subnet, or VPC, flow logs will not be collected for any instance network attachments,
// virtual network interfaces or instance network interfaces within the target that are themselves the target of a more
// specific flow log collector.
//
// The target must not be a virtual network interface that is attached to a bare metal server network attachment or to a
// file share mount target.
// Models which "extend" this model:
// - FlowLogCollectorTargetPrototypeNetworkInterfaceIdentity
// - FlowLogCollectorTargetPrototypeInstanceIdentity
// - FlowLogCollectorTargetPrototypeSubnetIdentity
// - FlowLogCollectorTargetPrototypeVPCIdentity
// - FlowLogCollectorTargetPrototypeVirtualNetworkInterfaceIdentity
// - FlowLogCollectorTargetPrototypeInstanceNetworkAttachmentIdentity
type FlowLogCollectorTargetPrototype struct {
	// The unique identifier for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id,omitempty"`

	// The URL for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href,omitempty"`

	// The CRN for this virtual server instance.
	CRN *string `json:"crn,omitempty"`
}

func (*FlowLogCollectorTargetPrototype) isaFlowLogCollectorTargetPrototype() bool {
	return true
}

type FlowLogCollectorTargetPrototypeIntf interface {
	isaFlowLogCollectorTargetPrototype() bool
}

// UnmarshalFlowLogCollectorTargetPrototype unmarshals an instance of FlowLogCollectorTargetPrototype from the specified map of raw messages.
func UnmarshalFlowLogCollectorTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(FlowLogCollectorTargetPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// GetBackupPolicyJobOptions : The GetBackupPolicyJob options.
type GetBackupPolicyJobOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// The backup policy job identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBackupPolicyJobOptions : Instantiate GetBackupPolicyJobOptions
func (*VpcV1) NewGetBackupPolicyJobOptions(backupPolicyID string, id string) *GetBackupPolicyJobOptions {
	return &GetBackupPolicyJobOptions{
		BackupPolicyID: core.StringPtr(backupPolicyID),
		ID:             core.StringPtr(id),
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *GetBackupPolicyJobOptions) SetBackupPolicyID(backupPolicyID string) *GetBackupPolicyJobOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBackupPolicyJobOptions) SetID(id string) *GetBackupPolicyJobOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBackupPolicyJobOptions) SetHeaders(param map[string]string) *GetBackupPolicyJobOptions {
	options.Headers = param
	return options
}

// GetBackupPolicyOptions : The GetBackupPolicy options.
type GetBackupPolicyOptions struct {
	// The backup policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBackupPolicyOptions : Instantiate GetBackupPolicyOptions
func (*VpcV1) NewGetBackupPolicyOptions(id string) *GetBackupPolicyOptions {
	return &GetBackupPolicyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetBackupPolicyOptions) SetID(id string) *GetBackupPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBackupPolicyOptions) SetHeaders(param map[string]string) *GetBackupPolicyOptions {
	options.Headers = param
	return options
}

// GetBackupPolicyPlanOptions : The GetBackupPolicyPlan options.
type GetBackupPolicyPlanOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// The backup policy plan identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBackupPolicyPlanOptions : Instantiate GetBackupPolicyPlanOptions
func (*VpcV1) NewGetBackupPolicyPlanOptions(backupPolicyID string, id string) *GetBackupPolicyPlanOptions {
	return &GetBackupPolicyPlanOptions{
		BackupPolicyID: core.StringPtr(backupPolicyID),
		ID:             core.StringPtr(id),
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *GetBackupPolicyPlanOptions) SetBackupPolicyID(backupPolicyID string) *GetBackupPolicyPlanOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBackupPolicyPlanOptions) SetID(id string) *GetBackupPolicyPlanOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBackupPolicyPlanOptions) SetHeaders(param map[string]string) *GetBackupPolicyPlanOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerDiskOptions : The GetBareMetalServerDisk options.
type GetBareMetalServerDiskOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server disk identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerDiskOptions : Instantiate GetBareMetalServerDiskOptions
func (*VpcV1) NewGetBareMetalServerDiskOptions(bareMetalServerID string, id string) *GetBareMetalServerDiskOptions {
	return &GetBareMetalServerDiskOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
		ID:                core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *GetBareMetalServerDiskOptions) SetBareMetalServerID(bareMetalServerID string) *GetBareMetalServerDiskOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerDiskOptions) SetID(id string) *GetBareMetalServerDiskOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerDiskOptions) SetHeaders(param map[string]string) *GetBareMetalServerDiskOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerInitializationOptions : The GetBareMetalServerInitialization options.
type GetBareMetalServerInitializationOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerInitializationOptions : Instantiate GetBareMetalServerInitializationOptions
func (*VpcV1) NewGetBareMetalServerInitializationOptions(id string) *GetBareMetalServerInitializationOptions {
	return &GetBareMetalServerInitializationOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerInitializationOptions) SetID(id string) *GetBareMetalServerInitializationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerInitializationOptions) SetHeaders(param map[string]string) *GetBareMetalServerInitializationOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerNetworkAttachmentOptions : The GetBareMetalServerNetworkAttachment options.
type GetBareMetalServerNetworkAttachmentOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerNetworkAttachmentOptions : Instantiate GetBareMetalServerNetworkAttachmentOptions
func (*VpcV1) NewGetBareMetalServerNetworkAttachmentOptions(bareMetalServerID string, id string) *GetBareMetalServerNetworkAttachmentOptions {
	return &GetBareMetalServerNetworkAttachmentOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
		ID:                core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *GetBareMetalServerNetworkAttachmentOptions) SetBareMetalServerID(bareMetalServerID string) *GetBareMetalServerNetworkAttachmentOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerNetworkAttachmentOptions) SetID(id string) *GetBareMetalServerNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerNetworkAttachmentOptions) SetHeaders(param map[string]string) *GetBareMetalServerNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerNetworkInterfaceFloatingIPOptions : The GetBareMetalServerNetworkInterfaceFloatingIP options.
type GetBareMetalServerNetworkInterfaceFloatingIPOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerNetworkInterfaceFloatingIPOptions : Instantiate GetBareMetalServerNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewGetBareMetalServerNetworkInterfaceFloatingIPOptions(bareMetalServerID string, networkInterfaceID string, id string) *GetBareMetalServerNetworkInterfaceFloatingIPOptions {
	return &GetBareMetalServerNetworkInterfaceFloatingIPOptions{
		BareMetalServerID:  core.StringPtr(bareMetalServerID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *GetBareMetalServerNetworkInterfaceFloatingIPOptions) SetBareMetalServerID(bareMetalServerID string) *GetBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *GetBareMetalServerNetworkInterfaceFloatingIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *GetBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerNetworkInterfaceFloatingIPOptions) SetID(id string) *GetBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *GetBareMetalServerNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerNetworkInterfaceIPOptions : The GetBareMetalServerNetworkInterfaceIP options.
type GetBareMetalServerNetworkInterfaceIPOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerNetworkInterfaceIPOptions : Instantiate GetBareMetalServerNetworkInterfaceIPOptions
func (*VpcV1) NewGetBareMetalServerNetworkInterfaceIPOptions(bareMetalServerID string, networkInterfaceID string, id string) *GetBareMetalServerNetworkInterfaceIPOptions {
	return &GetBareMetalServerNetworkInterfaceIPOptions{
		BareMetalServerID:  core.StringPtr(bareMetalServerID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *GetBareMetalServerNetworkInterfaceIPOptions) SetBareMetalServerID(bareMetalServerID string) *GetBareMetalServerNetworkInterfaceIPOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *GetBareMetalServerNetworkInterfaceIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *GetBareMetalServerNetworkInterfaceIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerNetworkInterfaceIPOptions) SetID(id string) *GetBareMetalServerNetworkInterfaceIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerNetworkInterfaceIPOptions) SetHeaders(param map[string]string) *GetBareMetalServerNetworkInterfaceIPOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerNetworkInterfaceOptions : The GetBareMetalServerNetworkInterface options.
type GetBareMetalServerNetworkInterfaceOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerNetworkInterfaceOptions : Instantiate GetBareMetalServerNetworkInterfaceOptions
func (*VpcV1) NewGetBareMetalServerNetworkInterfaceOptions(bareMetalServerID string, id string) *GetBareMetalServerNetworkInterfaceOptions {
	return &GetBareMetalServerNetworkInterfaceOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
		ID:                core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *GetBareMetalServerNetworkInterfaceOptions) SetBareMetalServerID(bareMetalServerID string) *GetBareMetalServerNetworkInterfaceOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerNetworkInterfaceOptions) SetID(id string) *GetBareMetalServerNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerNetworkInterfaceOptions) SetHeaders(param map[string]string) *GetBareMetalServerNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerOptions : The GetBareMetalServer options.
type GetBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerOptions : Instantiate GetBareMetalServerOptions
func (*VpcV1) NewGetBareMetalServerOptions(id string) *GetBareMetalServerOptions {
	return &GetBareMetalServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetBareMetalServerOptions) SetID(id string) *GetBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerOptions) SetHeaders(param map[string]string) *GetBareMetalServerOptions {
	options.Headers = param
	return options
}

// GetBareMetalServerProfileOptions : The GetBareMetalServerProfile options.
type GetBareMetalServerProfileOptions struct {
	// The bare metal server profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetBareMetalServerProfileOptions : Instantiate GetBareMetalServerProfileOptions
func (*VpcV1) NewGetBareMetalServerProfileOptions(name string) *GetBareMetalServerProfileOptions {
	return &GetBareMetalServerProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetBareMetalServerProfileOptions) SetName(name string) *GetBareMetalServerProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetBareMetalServerProfileOptions) SetHeaders(param map[string]string) *GetBareMetalServerProfileOptions {
	options.Headers = param
	return options
}

// GetClusterNetworkInterfaceOptions : The GetClusterNetworkInterface options.
type GetClusterNetworkInterfaceOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetClusterNetworkInterfaceOptions : Instantiate GetClusterNetworkInterfaceOptions
func (*VpcV1) NewGetClusterNetworkInterfaceOptions(clusterNetworkID string, id string) *GetClusterNetworkInterfaceOptions {
	return &GetClusterNetworkInterfaceOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
		ID:               core.StringPtr(id),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *GetClusterNetworkInterfaceOptions) SetClusterNetworkID(clusterNetworkID string) *GetClusterNetworkInterfaceOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetClusterNetworkInterfaceOptions) SetID(id string) *GetClusterNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetClusterNetworkInterfaceOptions) SetHeaders(param map[string]string) *GetClusterNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// GetClusterNetworkOptions : The GetClusterNetwork options.
type GetClusterNetworkOptions struct {
	// The cluster network identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetClusterNetworkOptions : Instantiate GetClusterNetworkOptions
func (*VpcV1) NewGetClusterNetworkOptions(id string) *GetClusterNetworkOptions {
	return &GetClusterNetworkOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetClusterNetworkOptions) SetID(id string) *GetClusterNetworkOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetClusterNetworkOptions) SetHeaders(param map[string]string) *GetClusterNetworkOptions {
	options.Headers = param
	return options
}

// GetClusterNetworkProfileOptions : The GetClusterNetworkProfile options.
type GetClusterNetworkProfileOptions struct {
	// The cluster network profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetClusterNetworkProfileOptions : Instantiate GetClusterNetworkProfileOptions
func (*VpcV1) NewGetClusterNetworkProfileOptions(name string) *GetClusterNetworkProfileOptions {
	return &GetClusterNetworkProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetClusterNetworkProfileOptions) SetName(name string) *GetClusterNetworkProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetClusterNetworkProfileOptions) SetHeaders(param map[string]string) *GetClusterNetworkProfileOptions {
	options.Headers = param
	return options
}

// GetClusterNetworkSubnetOptions : The GetClusterNetworkSubnet options.
type GetClusterNetworkSubnetOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetClusterNetworkSubnetOptions : Instantiate GetClusterNetworkSubnetOptions
func (*VpcV1) NewGetClusterNetworkSubnetOptions(clusterNetworkID string, id string) *GetClusterNetworkSubnetOptions {
	return &GetClusterNetworkSubnetOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
		ID:               core.StringPtr(id),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *GetClusterNetworkSubnetOptions) SetClusterNetworkID(clusterNetworkID string) *GetClusterNetworkSubnetOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetClusterNetworkSubnetOptions) SetID(id string) *GetClusterNetworkSubnetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetClusterNetworkSubnetOptions) SetHeaders(param map[string]string) *GetClusterNetworkSubnetOptions {
	options.Headers = param
	return options
}

// GetClusterNetworkSubnetReservedIPOptions : The GetClusterNetworkSubnetReservedIP options.
type GetClusterNetworkSubnetReservedIPOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ClusterNetworkSubnetID *string `json:"cluster_network_subnet_id" validate:"required,ne="`

	// The cluster network subnet reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetClusterNetworkSubnetReservedIPOptions : Instantiate GetClusterNetworkSubnetReservedIPOptions
func (*VpcV1) NewGetClusterNetworkSubnetReservedIPOptions(clusterNetworkID string, clusterNetworkSubnetID string, id string) *GetClusterNetworkSubnetReservedIPOptions {
	return &GetClusterNetworkSubnetReservedIPOptions{
		ClusterNetworkID:       core.StringPtr(clusterNetworkID),
		ClusterNetworkSubnetID: core.StringPtr(clusterNetworkSubnetID),
		ID:                     core.StringPtr(id),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *GetClusterNetworkSubnetReservedIPOptions) SetClusterNetworkID(clusterNetworkID string) *GetClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkSubnetID : Allow user to set ClusterNetworkSubnetID
func (_options *GetClusterNetworkSubnetReservedIPOptions) SetClusterNetworkSubnetID(clusterNetworkSubnetID string) *GetClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkSubnetID = core.StringPtr(clusterNetworkSubnetID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetClusterNetworkSubnetReservedIPOptions) SetID(id string) *GetClusterNetworkSubnetReservedIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetClusterNetworkSubnetReservedIPOptions) SetHeaders(param map[string]string) *GetClusterNetworkSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// GetDedicatedHostDiskOptions : The GetDedicatedHostDisk options.
type GetDedicatedHostDiskOptions struct {
	// The dedicated host identifier.
	DedicatedHostID *string `json:"dedicated_host_id" validate:"required,ne="`

	// The dedicated host disk identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetDedicatedHostDiskOptions : Instantiate GetDedicatedHostDiskOptions
func (*VpcV1) NewGetDedicatedHostDiskOptions(dedicatedHostID string, id string) *GetDedicatedHostDiskOptions {
	return &GetDedicatedHostDiskOptions{
		DedicatedHostID: core.StringPtr(dedicatedHostID),
		ID:              core.StringPtr(id),
	}
}

// SetDedicatedHostID : Allow user to set DedicatedHostID
func (_options *GetDedicatedHostDiskOptions) SetDedicatedHostID(dedicatedHostID string) *GetDedicatedHostDiskOptions {
	_options.DedicatedHostID = core.StringPtr(dedicatedHostID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetDedicatedHostDiskOptions) SetID(id string) *GetDedicatedHostDiskOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetDedicatedHostDiskOptions) SetHeaders(param map[string]string) *GetDedicatedHostDiskOptions {
	options.Headers = param
	return options
}

// GetDedicatedHostGroupOptions : The GetDedicatedHostGroup options.
type GetDedicatedHostGroupOptions struct {
	// The dedicated host group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetDedicatedHostGroupOptions : Instantiate GetDedicatedHostGroupOptions
func (*VpcV1) NewGetDedicatedHostGroupOptions(id string) *GetDedicatedHostGroupOptions {
	return &GetDedicatedHostGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetDedicatedHostGroupOptions) SetID(id string) *GetDedicatedHostGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetDedicatedHostGroupOptions) SetHeaders(param map[string]string) *GetDedicatedHostGroupOptions {
	options.Headers = param
	return options
}

// GetDedicatedHostOptions : The GetDedicatedHost options.
type GetDedicatedHostOptions struct {
	// The dedicated host identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetDedicatedHostOptions : Instantiate GetDedicatedHostOptions
func (*VpcV1) NewGetDedicatedHostOptions(id string) *GetDedicatedHostOptions {
	return &GetDedicatedHostOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetDedicatedHostOptions) SetID(id string) *GetDedicatedHostOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetDedicatedHostOptions) SetHeaders(param map[string]string) *GetDedicatedHostOptions {
	options.Headers = param
	return options
}

// GetDedicatedHostProfileOptions : The GetDedicatedHostProfile options.
type GetDedicatedHostProfileOptions struct {
	// The dedicated host profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetDedicatedHostProfileOptions : Instantiate GetDedicatedHostProfileOptions
func (*VpcV1) NewGetDedicatedHostProfileOptions(name string) *GetDedicatedHostProfileOptions {
	return &GetDedicatedHostProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetDedicatedHostProfileOptions) SetName(name string) *GetDedicatedHostProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetDedicatedHostProfileOptions) SetHeaders(param map[string]string) *GetDedicatedHostProfileOptions {
	options.Headers = param
	return options
}

// GetEndpointGatewayIPOptions : The GetEndpointGatewayIP options.
type GetEndpointGatewayIPOptions struct {
	// The endpoint gateway identifier.
	EndpointGatewayID *string `json:"endpoint_gateway_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetEndpointGatewayIPOptions : Instantiate GetEndpointGatewayIPOptions
func (*VpcV1) NewGetEndpointGatewayIPOptions(endpointGatewayID string, id string) *GetEndpointGatewayIPOptions {
	return &GetEndpointGatewayIPOptions{
		EndpointGatewayID: core.StringPtr(endpointGatewayID),
		ID:                core.StringPtr(id),
	}
}

// SetEndpointGatewayID : Allow user to set EndpointGatewayID
func (_options *GetEndpointGatewayIPOptions) SetEndpointGatewayID(endpointGatewayID string) *GetEndpointGatewayIPOptions {
	_options.EndpointGatewayID = core.StringPtr(endpointGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetEndpointGatewayIPOptions) SetID(id string) *GetEndpointGatewayIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetEndpointGatewayIPOptions) SetHeaders(param map[string]string) *GetEndpointGatewayIPOptions {
	options.Headers = param
	return options
}

// GetEndpointGatewayOptions : The GetEndpointGateway options.
type GetEndpointGatewayOptions struct {
	// The endpoint gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetEndpointGatewayOptions : Instantiate GetEndpointGatewayOptions
func (*VpcV1) NewGetEndpointGatewayOptions(id string) *GetEndpointGatewayOptions {
	return &GetEndpointGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetEndpointGatewayOptions) SetID(id string) *GetEndpointGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetEndpointGatewayOptions) SetHeaders(param map[string]string) *GetEndpointGatewayOptions {
	options.Headers = param
	return options
}

// GetFloatingIPOptions : The GetFloatingIP options.
type GetFloatingIPOptions struct {
	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetFloatingIPOptions : Instantiate GetFloatingIPOptions
func (*VpcV1) NewGetFloatingIPOptions(id string) *GetFloatingIPOptions {
	return &GetFloatingIPOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetFloatingIPOptions) SetID(id string) *GetFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetFloatingIPOptions) SetHeaders(param map[string]string) *GetFloatingIPOptions {
	options.Headers = param
	return options
}

// GetFlowLogCollectorOptions : The GetFlowLogCollector options.
type GetFlowLogCollectorOptions struct {
	// The flow log collector identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetFlowLogCollectorOptions : Instantiate GetFlowLogCollectorOptions
func (*VpcV1) NewGetFlowLogCollectorOptions(id string) *GetFlowLogCollectorOptions {
	return &GetFlowLogCollectorOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetFlowLogCollectorOptions) SetID(id string) *GetFlowLogCollectorOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetFlowLogCollectorOptions) SetHeaders(param map[string]string) *GetFlowLogCollectorOptions {
	options.Headers = param
	return options
}

// GetIkePolicyOptions : The GetIkePolicy options.
type GetIkePolicyOptions struct {
	// The IKE policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetIkePolicyOptions : Instantiate GetIkePolicyOptions
func (*VpcV1) NewGetIkePolicyOptions(id string) *GetIkePolicyOptions {
	return &GetIkePolicyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetIkePolicyOptions) SetID(id string) *GetIkePolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetIkePolicyOptions) SetHeaders(param map[string]string) *GetIkePolicyOptions {
	options.Headers = param
	return options
}

// GetImageExportJobOptions : The GetImageExportJob options.
type GetImageExportJobOptions struct {
	// The image identifier.
	ImageID *string `json:"image_id" validate:"required,ne="`

	// The image export job identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetImageExportJobOptions : Instantiate GetImageExportJobOptions
func (*VpcV1) NewGetImageExportJobOptions(imageID string, id string) *GetImageExportJobOptions {
	return &GetImageExportJobOptions{
		ImageID: core.StringPtr(imageID),
		ID:      core.StringPtr(id),
	}
}

// SetImageID : Allow user to set ImageID
func (_options *GetImageExportJobOptions) SetImageID(imageID string) *GetImageExportJobOptions {
	_options.ImageID = core.StringPtr(imageID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetImageExportJobOptions) SetID(id string) *GetImageExportJobOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetImageExportJobOptions) SetHeaders(param map[string]string) *GetImageExportJobOptions {
	options.Headers = param
	return options
}

// GetImageOptions : The GetImage options.
type GetImageOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetImageOptions : Instantiate GetImageOptions
func (*VpcV1) NewGetImageOptions(id string) *GetImageOptions {
	return &GetImageOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetImageOptions) SetID(id string) *GetImageOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetImageOptions) SetHeaders(param map[string]string) *GetImageOptions {
	options.Headers = param
	return options
}

// GetInstanceClusterNetworkAttachmentOptions : The GetInstanceClusterNetworkAttachment options.
type GetInstanceClusterNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance cluster network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceClusterNetworkAttachmentOptions : Instantiate GetInstanceClusterNetworkAttachmentOptions
func (*VpcV1) NewGetInstanceClusterNetworkAttachmentOptions(instanceID string, id string) *GetInstanceClusterNetworkAttachmentOptions {
	return &GetInstanceClusterNetworkAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceClusterNetworkAttachmentOptions) SetInstanceID(instanceID string) *GetInstanceClusterNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceClusterNetworkAttachmentOptions) SetID(id string) *GetInstanceClusterNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceClusterNetworkAttachmentOptions) SetHeaders(param map[string]string) *GetInstanceClusterNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// GetInstanceDiskOptions : The GetInstanceDisk options.
type GetInstanceDiskOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance disk identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceDiskOptions : Instantiate GetInstanceDiskOptions
func (*VpcV1) NewGetInstanceDiskOptions(instanceID string, id string) *GetInstanceDiskOptions {
	return &GetInstanceDiskOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceDiskOptions) SetInstanceID(instanceID string) *GetInstanceDiskOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceDiskOptions) SetID(id string) *GetInstanceDiskOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceDiskOptions) SetHeaders(param map[string]string) *GetInstanceDiskOptions {
	options.Headers = param
	return options
}

// GetInstanceGroupManagerActionOptions : The GetInstanceGroupManagerAction options.
type GetInstanceGroupManagerActionOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager action identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceGroupManagerActionOptions : Instantiate GetInstanceGroupManagerActionOptions
func (*VpcV1) NewGetInstanceGroupManagerActionOptions(instanceGroupID string, instanceGroupManagerID string, id string) *GetInstanceGroupManagerActionOptions {
	return &GetInstanceGroupManagerActionOptions{
		InstanceGroupID:        core.StringPtr(instanceGroupID),
		InstanceGroupManagerID: core.StringPtr(instanceGroupManagerID),
		ID:                     core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *GetInstanceGroupManagerActionOptions) SetInstanceGroupID(instanceGroupID string) *GetInstanceGroupManagerActionOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *GetInstanceGroupManagerActionOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *GetInstanceGroupManagerActionOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceGroupManagerActionOptions) SetID(id string) *GetInstanceGroupManagerActionOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceGroupManagerActionOptions) SetHeaders(param map[string]string) *GetInstanceGroupManagerActionOptions {
	options.Headers = param
	return options
}

// GetInstanceGroupManagerOptions : The GetInstanceGroupManager options.
type GetInstanceGroupManagerOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceGroupManagerOptions : Instantiate GetInstanceGroupManagerOptions
func (*VpcV1) NewGetInstanceGroupManagerOptions(instanceGroupID string, id string) *GetInstanceGroupManagerOptions {
	return &GetInstanceGroupManagerOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *GetInstanceGroupManagerOptions) SetInstanceGroupID(instanceGroupID string) *GetInstanceGroupManagerOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceGroupManagerOptions) SetID(id string) *GetInstanceGroupManagerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceGroupManagerOptions) SetHeaders(param map[string]string) *GetInstanceGroupManagerOptions {
	options.Headers = param
	return options
}

// GetInstanceGroupManagerPolicyOptions : The GetInstanceGroupManagerPolicy options.
type GetInstanceGroupManagerPolicyOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceGroupManagerPolicyOptions : Instantiate GetInstanceGroupManagerPolicyOptions
func (*VpcV1) NewGetInstanceGroupManagerPolicyOptions(instanceGroupID string, instanceGroupManagerID string, id string) *GetInstanceGroupManagerPolicyOptions {
	return &GetInstanceGroupManagerPolicyOptions{
		InstanceGroupID:        core.StringPtr(instanceGroupID),
		InstanceGroupManagerID: core.StringPtr(instanceGroupManagerID),
		ID:                     core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *GetInstanceGroupManagerPolicyOptions) SetInstanceGroupID(instanceGroupID string) *GetInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *GetInstanceGroupManagerPolicyOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *GetInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceGroupManagerPolicyOptions) SetID(id string) *GetInstanceGroupManagerPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceGroupManagerPolicyOptions) SetHeaders(param map[string]string) *GetInstanceGroupManagerPolicyOptions {
	options.Headers = param
	return options
}

// GetInstanceGroupMembershipOptions : The GetInstanceGroupMembership options.
type GetInstanceGroupMembershipOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group membership identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceGroupMembershipOptions : Instantiate GetInstanceGroupMembershipOptions
func (*VpcV1) NewGetInstanceGroupMembershipOptions(instanceGroupID string, id string) *GetInstanceGroupMembershipOptions {
	return &GetInstanceGroupMembershipOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *GetInstanceGroupMembershipOptions) SetInstanceGroupID(instanceGroupID string) *GetInstanceGroupMembershipOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceGroupMembershipOptions) SetID(id string) *GetInstanceGroupMembershipOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceGroupMembershipOptions) SetHeaders(param map[string]string) *GetInstanceGroupMembershipOptions {
	options.Headers = param
	return options
}

// GetInstanceGroupOptions : The GetInstanceGroup options.
type GetInstanceGroupOptions struct {
	// The instance group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceGroupOptions : Instantiate GetInstanceGroupOptions
func (*VpcV1) NewGetInstanceGroupOptions(id string) *GetInstanceGroupOptions {
	return &GetInstanceGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetInstanceGroupOptions) SetID(id string) *GetInstanceGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceGroupOptions) SetHeaders(param map[string]string) *GetInstanceGroupOptions {
	options.Headers = param
	return options
}

// GetInstanceInitializationOptions : The GetInstanceInitialization options.
type GetInstanceInitializationOptions struct {
	// The instance identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceInitializationOptions : Instantiate GetInstanceInitializationOptions
func (*VpcV1) NewGetInstanceInitializationOptions(id string) *GetInstanceInitializationOptions {
	return &GetInstanceInitializationOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetInstanceInitializationOptions) SetID(id string) *GetInstanceInitializationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceInitializationOptions) SetHeaders(param map[string]string) *GetInstanceInitializationOptions {
	options.Headers = param
	return options
}

// GetInstanceNetworkAttachmentOptions : The GetInstanceNetworkAttachment options.
type GetInstanceNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceNetworkAttachmentOptions : Instantiate GetInstanceNetworkAttachmentOptions
func (*VpcV1) NewGetInstanceNetworkAttachmentOptions(instanceID string, id string) *GetInstanceNetworkAttachmentOptions {
	return &GetInstanceNetworkAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceNetworkAttachmentOptions) SetInstanceID(instanceID string) *GetInstanceNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceNetworkAttachmentOptions) SetID(id string) *GetInstanceNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceNetworkAttachmentOptions) SetHeaders(param map[string]string) *GetInstanceNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// GetInstanceNetworkInterfaceFloatingIPOptions : The GetInstanceNetworkInterfaceFloatingIP options.
type GetInstanceNetworkInterfaceFloatingIPOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceNetworkInterfaceFloatingIPOptions : Instantiate GetInstanceNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewGetInstanceNetworkInterfaceFloatingIPOptions(instanceID string, networkInterfaceID string, id string) *GetInstanceNetworkInterfaceFloatingIPOptions {
	return &GetInstanceNetworkInterfaceFloatingIPOptions{
		InstanceID:         core.StringPtr(instanceID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceNetworkInterfaceFloatingIPOptions) SetInstanceID(instanceID string) *GetInstanceNetworkInterfaceFloatingIPOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *GetInstanceNetworkInterfaceFloatingIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *GetInstanceNetworkInterfaceFloatingIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceNetworkInterfaceFloatingIPOptions) SetID(id string) *GetInstanceNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *GetInstanceNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// GetInstanceNetworkInterfaceIPOptions : The GetInstanceNetworkInterfaceIP options.
type GetInstanceNetworkInterfaceIPOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceNetworkInterfaceIPOptions : Instantiate GetInstanceNetworkInterfaceIPOptions
func (*VpcV1) NewGetInstanceNetworkInterfaceIPOptions(instanceID string, networkInterfaceID string, id string) *GetInstanceNetworkInterfaceIPOptions {
	return &GetInstanceNetworkInterfaceIPOptions{
		InstanceID:         core.StringPtr(instanceID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceNetworkInterfaceIPOptions) SetInstanceID(instanceID string) *GetInstanceNetworkInterfaceIPOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *GetInstanceNetworkInterfaceIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *GetInstanceNetworkInterfaceIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceNetworkInterfaceIPOptions) SetID(id string) *GetInstanceNetworkInterfaceIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceNetworkInterfaceIPOptions) SetHeaders(param map[string]string) *GetInstanceNetworkInterfaceIPOptions {
	options.Headers = param
	return options
}

// GetInstanceNetworkInterfaceOptions : The GetInstanceNetworkInterface options.
type GetInstanceNetworkInterfaceOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceNetworkInterfaceOptions : Instantiate GetInstanceNetworkInterfaceOptions
func (*VpcV1) NewGetInstanceNetworkInterfaceOptions(instanceID string, id string) *GetInstanceNetworkInterfaceOptions {
	return &GetInstanceNetworkInterfaceOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceNetworkInterfaceOptions) SetInstanceID(instanceID string) *GetInstanceNetworkInterfaceOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceNetworkInterfaceOptions) SetID(id string) *GetInstanceNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceNetworkInterfaceOptions) SetHeaders(param map[string]string) *GetInstanceNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// GetInstanceOptions : The GetInstance options.
type GetInstanceOptions struct {
	// The virtual server instance identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceOptions : Instantiate GetInstanceOptions
func (*VpcV1) NewGetInstanceOptions(id string) *GetInstanceOptions {
	return &GetInstanceOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetInstanceOptions) SetID(id string) *GetInstanceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceOptions) SetHeaders(param map[string]string) *GetInstanceOptions {
	options.Headers = param
	return options
}

// GetInstanceProfileOptions : The GetInstanceProfile options.
type GetInstanceProfileOptions struct {
	// The instance profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceProfileOptions : Instantiate GetInstanceProfileOptions
func (*VpcV1) NewGetInstanceProfileOptions(name string) *GetInstanceProfileOptions {
	return &GetInstanceProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetInstanceProfileOptions) SetName(name string) *GetInstanceProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceProfileOptions) SetHeaders(param map[string]string) *GetInstanceProfileOptions {
	options.Headers = param
	return options
}

// GetInstanceTemplateOptions : The GetInstanceTemplate options.
type GetInstanceTemplateOptions struct {
	// The instance template identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceTemplateOptions : Instantiate GetInstanceTemplateOptions
func (*VpcV1) NewGetInstanceTemplateOptions(id string) *GetInstanceTemplateOptions {
	return &GetInstanceTemplateOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetInstanceTemplateOptions) SetID(id string) *GetInstanceTemplateOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceTemplateOptions) SetHeaders(param map[string]string) *GetInstanceTemplateOptions {
	options.Headers = param
	return options
}

// GetInstanceVolumeAttachmentOptions : The GetInstanceVolumeAttachment options.
type GetInstanceVolumeAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The volume attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetInstanceVolumeAttachmentOptions : Instantiate GetInstanceVolumeAttachmentOptions
func (*VpcV1) NewGetInstanceVolumeAttachmentOptions(instanceID string, id string) *GetInstanceVolumeAttachmentOptions {
	return &GetInstanceVolumeAttachmentOptions{
		InstanceID: core.StringPtr(instanceID),
		ID:         core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *GetInstanceVolumeAttachmentOptions) SetInstanceID(instanceID string) *GetInstanceVolumeAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetInstanceVolumeAttachmentOptions) SetID(id string) *GetInstanceVolumeAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetInstanceVolumeAttachmentOptions) SetHeaders(param map[string]string) *GetInstanceVolumeAttachmentOptions {
	options.Headers = param
	return options
}

// GetIpsecPolicyOptions : The GetIpsecPolicy options.
type GetIpsecPolicyOptions struct {
	// The IPsec policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetIpsecPolicyOptions : Instantiate GetIpsecPolicyOptions
func (*VpcV1) NewGetIpsecPolicyOptions(id string) *GetIpsecPolicyOptions {
	return &GetIpsecPolicyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetIpsecPolicyOptions) SetID(id string) *GetIpsecPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetIpsecPolicyOptions) SetHeaders(param map[string]string) *GetIpsecPolicyOptions {
	options.Headers = param
	return options
}

// GetKeyOptions : The GetKey options.
type GetKeyOptions struct {
	// The key identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetKeyOptions : Instantiate GetKeyOptions
func (*VpcV1) NewGetKeyOptions(id string) *GetKeyOptions {
	return &GetKeyOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetKeyOptions) SetID(id string) *GetKeyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetKeyOptions) SetHeaders(param map[string]string) *GetKeyOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerListenerOptions : The GetLoadBalancerListener options.
type GetLoadBalancerListenerOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerListenerOptions : Instantiate GetLoadBalancerListenerOptions
func (*VpcV1) NewGetLoadBalancerListenerOptions(loadBalancerID string, id string) *GetLoadBalancerListenerOptions {
	return &GetLoadBalancerListenerOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *GetLoadBalancerListenerOptions) SetLoadBalancerID(loadBalancerID string) *GetLoadBalancerListenerOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerListenerOptions) SetID(id string) *GetLoadBalancerListenerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerListenerOptions) SetHeaders(param map[string]string) *GetLoadBalancerListenerOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerListenerPolicyOptions : The GetLoadBalancerListenerPolicy options.
type GetLoadBalancerListenerPolicyOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerListenerPolicyOptions : Instantiate GetLoadBalancerListenerPolicyOptions
func (*VpcV1) NewGetLoadBalancerListenerPolicyOptions(loadBalancerID string, listenerID string, id string) *GetLoadBalancerListenerPolicyOptions {
	return &GetLoadBalancerListenerPolicyOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *GetLoadBalancerListenerPolicyOptions) SetLoadBalancerID(loadBalancerID string) *GetLoadBalancerListenerPolicyOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *GetLoadBalancerListenerPolicyOptions) SetListenerID(listenerID string) *GetLoadBalancerListenerPolicyOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerListenerPolicyOptions) SetID(id string) *GetLoadBalancerListenerPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerListenerPolicyOptions) SetHeaders(param map[string]string) *GetLoadBalancerListenerPolicyOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerListenerPolicyRuleOptions : The GetLoadBalancerListenerPolicyRule options.
type GetLoadBalancerListenerPolicyRuleOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	PolicyID *string `json:"policy_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerListenerPolicyRuleOptions : Instantiate GetLoadBalancerListenerPolicyRuleOptions
func (*VpcV1) NewGetLoadBalancerListenerPolicyRuleOptions(loadBalancerID string, listenerID string, policyID string, id string) *GetLoadBalancerListenerPolicyRuleOptions {
	return &GetLoadBalancerListenerPolicyRuleOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		PolicyID:       core.StringPtr(policyID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *GetLoadBalancerListenerPolicyRuleOptions) SetLoadBalancerID(loadBalancerID string) *GetLoadBalancerListenerPolicyRuleOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *GetLoadBalancerListenerPolicyRuleOptions) SetListenerID(listenerID string) *GetLoadBalancerListenerPolicyRuleOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetPolicyID : Allow user to set PolicyID
func (_options *GetLoadBalancerListenerPolicyRuleOptions) SetPolicyID(policyID string) *GetLoadBalancerListenerPolicyRuleOptions {
	_options.PolicyID = core.StringPtr(policyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerListenerPolicyRuleOptions) SetID(id string) *GetLoadBalancerListenerPolicyRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerListenerPolicyRuleOptions) SetHeaders(param map[string]string) *GetLoadBalancerListenerPolicyRuleOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerOptions : The GetLoadBalancer options.
type GetLoadBalancerOptions struct {
	// The load balancer identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerOptions : Instantiate GetLoadBalancerOptions
func (*VpcV1) NewGetLoadBalancerOptions(id string) *GetLoadBalancerOptions {
	return &GetLoadBalancerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerOptions) SetID(id string) *GetLoadBalancerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerOptions) SetHeaders(param map[string]string) *GetLoadBalancerOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerPoolMemberOptions : The GetLoadBalancerPoolMember options.
type GetLoadBalancerPoolMemberOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	PoolID *string `json:"pool_id" validate:"required,ne="`

	// The member identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerPoolMemberOptions : Instantiate GetLoadBalancerPoolMemberOptions
func (*VpcV1) NewGetLoadBalancerPoolMemberOptions(loadBalancerID string, poolID string, id string) *GetLoadBalancerPoolMemberOptions {
	return &GetLoadBalancerPoolMemberOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		PoolID:         core.StringPtr(poolID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *GetLoadBalancerPoolMemberOptions) SetLoadBalancerID(loadBalancerID string) *GetLoadBalancerPoolMemberOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetPoolID : Allow user to set PoolID
func (_options *GetLoadBalancerPoolMemberOptions) SetPoolID(poolID string) *GetLoadBalancerPoolMemberOptions {
	_options.PoolID = core.StringPtr(poolID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerPoolMemberOptions) SetID(id string) *GetLoadBalancerPoolMemberOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerPoolMemberOptions) SetHeaders(param map[string]string) *GetLoadBalancerPoolMemberOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerPoolOptions : The GetLoadBalancerPool options.
type GetLoadBalancerPoolOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerPoolOptions : Instantiate GetLoadBalancerPoolOptions
func (*VpcV1) NewGetLoadBalancerPoolOptions(loadBalancerID string, id string) *GetLoadBalancerPoolOptions {
	return &GetLoadBalancerPoolOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ID:             core.StringPtr(id),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *GetLoadBalancerPoolOptions) SetLoadBalancerID(loadBalancerID string) *GetLoadBalancerPoolOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerPoolOptions) SetID(id string) *GetLoadBalancerPoolOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerPoolOptions) SetHeaders(param map[string]string) *GetLoadBalancerPoolOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerProfileOptions : The GetLoadBalancerProfile options.
type GetLoadBalancerProfileOptions struct {
	// The load balancer profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerProfileOptions : Instantiate GetLoadBalancerProfileOptions
func (*VpcV1) NewGetLoadBalancerProfileOptions(name string) *GetLoadBalancerProfileOptions {
	return &GetLoadBalancerProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetLoadBalancerProfileOptions) SetName(name string) *GetLoadBalancerProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerProfileOptions) SetHeaders(param map[string]string) *GetLoadBalancerProfileOptions {
	options.Headers = param
	return options
}

// GetLoadBalancerStatisticsOptions : The GetLoadBalancerStatistics options.
type GetLoadBalancerStatisticsOptions struct {
	// The load balancer identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetLoadBalancerStatisticsOptions : Instantiate GetLoadBalancerStatisticsOptions
func (*VpcV1) NewGetLoadBalancerStatisticsOptions(id string) *GetLoadBalancerStatisticsOptions {
	return &GetLoadBalancerStatisticsOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetLoadBalancerStatisticsOptions) SetID(id string) *GetLoadBalancerStatisticsOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetLoadBalancerStatisticsOptions) SetHeaders(param map[string]string) *GetLoadBalancerStatisticsOptions {
	options.Headers = param
	return options
}

// GetNetworkACLOptions : The GetNetworkACL options.
type GetNetworkACLOptions struct {
	// The network ACL identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetNetworkACLOptions : Instantiate GetNetworkACLOptions
func (*VpcV1) NewGetNetworkACLOptions(id string) *GetNetworkACLOptions {
	return &GetNetworkACLOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetNetworkACLOptions) SetID(id string) *GetNetworkACLOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetNetworkACLOptions) SetHeaders(param map[string]string) *GetNetworkACLOptions {
	options.Headers = param
	return options
}

// GetNetworkACLRuleOptions : The GetNetworkACLRule options.
type GetNetworkACLRuleOptions struct {
	// The network ACL identifier.
	NetworkACLID *string `json:"network_acl_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetNetworkACLRuleOptions : Instantiate GetNetworkACLRuleOptions
func (*VpcV1) NewGetNetworkACLRuleOptions(networkACLID string, id string) *GetNetworkACLRuleOptions {
	return &GetNetworkACLRuleOptions{
		NetworkACLID: core.StringPtr(networkACLID),
		ID:           core.StringPtr(id),
	}
}

// SetNetworkACLID : Allow user to set NetworkACLID
func (_options *GetNetworkACLRuleOptions) SetNetworkACLID(networkACLID string) *GetNetworkACLRuleOptions {
	_options.NetworkACLID = core.StringPtr(networkACLID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetNetworkACLRuleOptions) SetID(id string) *GetNetworkACLRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetNetworkACLRuleOptions) SetHeaders(param map[string]string) *GetNetworkACLRuleOptions {
	options.Headers = param
	return options
}

// GetNetworkInterfaceFloatingIPOptions : The GetNetworkInterfaceFloatingIP options.
type GetNetworkInterfaceFloatingIPOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetNetworkInterfaceFloatingIPOptions : Instantiate GetNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewGetNetworkInterfaceFloatingIPOptions(virtualNetworkInterfaceID string, id string) *GetNetworkInterfaceFloatingIPOptions {
	return &GetNetworkInterfaceFloatingIPOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
		ID:                        core.StringPtr(id),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *GetNetworkInterfaceFloatingIPOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *GetNetworkInterfaceFloatingIPOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetNetworkInterfaceFloatingIPOptions) SetID(id string) *GetNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *GetNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// GetOperatingSystemOptions : The GetOperatingSystem options.
type GetOperatingSystemOptions struct {
	// The operating system name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetOperatingSystemOptions : Instantiate GetOperatingSystemOptions
func (*VpcV1) NewGetOperatingSystemOptions(name string) *GetOperatingSystemOptions {
	return &GetOperatingSystemOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetOperatingSystemOptions) SetName(name string) *GetOperatingSystemOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetOperatingSystemOptions) SetHeaders(param map[string]string) *GetOperatingSystemOptions {
	options.Headers = param
	return options
}

// GetPlacementGroupOptions : The GetPlacementGroup options.
type GetPlacementGroupOptions struct {
	// The placement group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetPlacementGroupOptions : Instantiate GetPlacementGroupOptions
func (*VpcV1) NewGetPlacementGroupOptions(id string) *GetPlacementGroupOptions {
	return &GetPlacementGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetPlacementGroupOptions) SetID(id string) *GetPlacementGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetPlacementGroupOptions) SetHeaders(param map[string]string) *GetPlacementGroupOptions {
	options.Headers = param
	return options
}

// GetPrivatePathServiceGatewayAccountPolicyOptions : The GetPrivatePathServiceGatewayAccountPolicy options.
type GetPrivatePathServiceGatewayAccountPolicyOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The account policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetPrivatePathServiceGatewayAccountPolicyOptions : Instantiate GetPrivatePathServiceGatewayAccountPolicyOptions
func (*VpcV1) NewGetPrivatePathServiceGatewayAccountPolicyOptions(privatePathServiceGatewayID string, id string) *GetPrivatePathServiceGatewayAccountPolicyOptions {
	return &GetPrivatePathServiceGatewayAccountPolicyOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		ID:                          core.StringPtr(id),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *GetPrivatePathServiceGatewayAccountPolicyOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *GetPrivatePathServiceGatewayAccountPolicyOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetPrivatePathServiceGatewayAccountPolicyOptions) SetID(id string) *GetPrivatePathServiceGatewayAccountPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetPrivatePathServiceGatewayAccountPolicyOptions) SetHeaders(param map[string]string) *GetPrivatePathServiceGatewayAccountPolicyOptions {
	options.Headers = param
	return options
}

// GetPrivatePathServiceGatewayEndpointGatewayBindingOptions : The GetPrivatePathServiceGatewayEndpointGatewayBinding options.
type GetPrivatePathServiceGatewayEndpointGatewayBindingOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The endpoint gateway binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetPrivatePathServiceGatewayEndpointGatewayBindingOptions : Instantiate GetPrivatePathServiceGatewayEndpointGatewayBindingOptions
func (*VpcV1) NewGetPrivatePathServiceGatewayEndpointGatewayBindingOptions(privatePathServiceGatewayID string, id string) *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	return &GetPrivatePathServiceGatewayEndpointGatewayBindingOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		ID:                          core.StringPtr(id),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetID(id string) *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetHeaders(param map[string]string) *GetPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	options.Headers = param
	return options
}

// GetPrivatePathServiceGatewayOptions : The GetPrivatePathServiceGateway options.
type GetPrivatePathServiceGatewayOptions struct {
	// The private path service gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetPrivatePathServiceGatewayOptions : Instantiate GetPrivatePathServiceGatewayOptions
func (*VpcV1) NewGetPrivatePathServiceGatewayOptions(id string) *GetPrivatePathServiceGatewayOptions {
	return &GetPrivatePathServiceGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetPrivatePathServiceGatewayOptions) SetID(id string) *GetPrivatePathServiceGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetPrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *GetPrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// GetPublicAddressRangeOptions : The GetPublicAddressRange options.
type GetPublicAddressRangeOptions struct {
	// The public address range identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetPublicAddressRangeOptions : Instantiate GetPublicAddressRangeOptions
func (*VpcV1) NewGetPublicAddressRangeOptions(id string) *GetPublicAddressRangeOptions {
	return &GetPublicAddressRangeOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetPublicAddressRangeOptions) SetID(id string) *GetPublicAddressRangeOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetPublicAddressRangeOptions) SetHeaders(param map[string]string) *GetPublicAddressRangeOptions {
	options.Headers = param
	return options
}

// GetPublicGatewayOptions : The GetPublicGateway options.
type GetPublicGatewayOptions struct {
	// The public gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetPublicGatewayOptions : Instantiate GetPublicGatewayOptions
func (*VpcV1) NewGetPublicGatewayOptions(id string) *GetPublicGatewayOptions {
	return &GetPublicGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetPublicGatewayOptions) SetID(id string) *GetPublicGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetPublicGatewayOptions) SetHeaders(param map[string]string) *GetPublicGatewayOptions {
	options.Headers = param
	return options
}

// GetRegionOptions : The GetRegion options.
type GetRegionOptions struct {
	// The region name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetRegionOptions : Instantiate GetRegionOptions
func (*VpcV1) NewGetRegionOptions(name string) *GetRegionOptions {
	return &GetRegionOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetRegionOptions) SetName(name string) *GetRegionOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetRegionOptions) SetHeaders(param map[string]string) *GetRegionOptions {
	options.Headers = param
	return options
}

// GetRegionZoneOptions : The GetRegionZone options.
type GetRegionZoneOptions struct {
	// The region name.
	RegionName *string `json:"region_name" validate:"required,ne="`

	// The zone name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetRegionZoneOptions : Instantiate GetRegionZoneOptions
func (*VpcV1) NewGetRegionZoneOptions(regionName string, name string) *GetRegionZoneOptions {
	return &GetRegionZoneOptions{
		RegionName: core.StringPtr(regionName),
		Name:       core.StringPtr(name),
	}
}

// SetRegionName : Allow user to set RegionName
func (_options *GetRegionZoneOptions) SetRegionName(regionName string) *GetRegionZoneOptions {
	_options.RegionName = core.StringPtr(regionName)
	return _options
}

// SetName : Allow user to set Name
func (_options *GetRegionZoneOptions) SetName(name string) *GetRegionZoneOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetRegionZoneOptions) SetHeaders(param map[string]string) *GetRegionZoneOptions {
	options.Headers = param
	return options
}

// GetReservationOptions : The GetReservation options.
type GetReservationOptions struct {
	// The reservation identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetReservationOptions : Instantiate GetReservationOptions
func (*VpcV1) NewGetReservationOptions(id string) *GetReservationOptions {
	return &GetReservationOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetReservationOptions) SetID(id string) *GetReservationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetReservationOptions) SetHeaders(param map[string]string) *GetReservationOptions {
	options.Headers = param
	return options
}

// GetSecurityGroupOptions : The GetSecurityGroup options.
type GetSecurityGroupOptions struct {
	// The security group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSecurityGroupOptions : Instantiate GetSecurityGroupOptions
func (*VpcV1) NewGetSecurityGroupOptions(id string) *GetSecurityGroupOptions {
	return &GetSecurityGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSecurityGroupOptions) SetID(id string) *GetSecurityGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSecurityGroupOptions) SetHeaders(param map[string]string) *GetSecurityGroupOptions {
	options.Headers = param
	return options
}

// GetSecurityGroupRuleOptions : The GetSecurityGroupRule options.
type GetSecurityGroupRuleOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSecurityGroupRuleOptions : Instantiate GetSecurityGroupRuleOptions
func (*VpcV1) NewGetSecurityGroupRuleOptions(securityGroupID string, id string) *GetSecurityGroupRuleOptions {
	return &GetSecurityGroupRuleOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *GetSecurityGroupRuleOptions) SetSecurityGroupID(securityGroupID string) *GetSecurityGroupRuleOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetSecurityGroupRuleOptions) SetID(id string) *GetSecurityGroupRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSecurityGroupRuleOptions) SetHeaders(param map[string]string) *GetSecurityGroupRuleOptions {
	options.Headers = param
	return options
}

// GetSecurityGroupTargetOptions : The GetSecurityGroupTarget options.
type GetSecurityGroupTargetOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The security group target identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSecurityGroupTargetOptions : Instantiate GetSecurityGroupTargetOptions
func (*VpcV1) NewGetSecurityGroupTargetOptions(securityGroupID string, id string) *GetSecurityGroupTargetOptions {
	return &GetSecurityGroupTargetOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
		ID:              core.StringPtr(id),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *GetSecurityGroupTargetOptions) SetSecurityGroupID(securityGroupID string) *GetSecurityGroupTargetOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetSecurityGroupTargetOptions) SetID(id string) *GetSecurityGroupTargetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSecurityGroupTargetOptions) SetHeaders(param map[string]string) *GetSecurityGroupTargetOptions {
	options.Headers = param
	return options
}

// GetShareAccessorBindingOptions : The GetShareAccessorBinding options.
type GetShareAccessorBindingOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The file share accessor binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetShareAccessorBindingOptions : Instantiate GetShareAccessorBindingOptions
func (*VpcV1) NewGetShareAccessorBindingOptions(shareID string, id string) *GetShareAccessorBindingOptions {
	return &GetShareAccessorBindingOptions{
		ShareID: core.StringPtr(shareID),
		ID:      core.StringPtr(id),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *GetShareAccessorBindingOptions) SetShareID(shareID string) *GetShareAccessorBindingOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetShareAccessorBindingOptions) SetID(id string) *GetShareAccessorBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetShareAccessorBindingOptions) SetHeaders(param map[string]string) *GetShareAccessorBindingOptions {
	options.Headers = param
	return options
}

// GetShareMountTargetOptions : The GetShareMountTarget options.
type GetShareMountTargetOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The file share mount target identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetShareMountTargetOptions : Instantiate GetShareMountTargetOptions
func (*VpcV1) NewGetShareMountTargetOptions(shareID string, id string) *GetShareMountTargetOptions {
	return &GetShareMountTargetOptions{
		ShareID: core.StringPtr(shareID),
		ID:      core.StringPtr(id),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *GetShareMountTargetOptions) SetShareID(shareID string) *GetShareMountTargetOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetShareMountTargetOptions) SetID(id string) *GetShareMountTargetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetShareMountTargetOptions) SetHeaders(param map[string]string) *GetShareMountTargetOptions {
	options.Headers = param
	return options
}

// GetShareOptions : The GetShare options.
type GetShareOptions struct {
	// The file share identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetShareOptions : Instantiate GetShareOptions
func (*VpcV1) NewGetShareOptions(id string) *GetShareOptions {
	return &GetShareOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetShareOptions) SetID(id string) *GetShareOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetShareOptions) SetHeaders(param map[string]string) *GetShareOptions {
	options.Headers = param
	return options
}

// GetShareProfileOptions : The GetShareProfile options.
type GetShareProfileOptions struct {
	// The file share profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetShareProfileOptions : Instantiate GetShareProfileOptions
func (*VpcV1) NewGetShareProfileOptions(name string) *GetShareProfileOptions {
	return &GetShareProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetShareProfileOptions) SetName(name string) *GetShareProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetShareProfileOptions) SetHeaders(param map[string]string) *GetShareProfileOptions {
	options.Headers = param
	return options
}

// GetShareSnapshotOptions : The GetShareSnapshot options.
type GetShareSnapshotOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The share snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetShareSnapshotOptions : Instantiate GetShareSnapshotOptions
func (*VpcV1) NewGetShareSnapshotOptions(shareID string, id string) *GetShareSnapshotOptions {
	return &GetShareSnapshotOptions{
		ShareID: core.StringPtr(shareID),
		ID:      core.StringPtr(id),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *GetShareSnapshotOptions) SetShareID(shareID string) *GetShareSnapshotOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetShareSnapshotOptions) SetID(id string) *GetShareSnapshotOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetShareSnapshotOptions) SetHeaders(param map[string]string) *GetShareSnapshotOptions {
	options.Headers = param
	return options
}

// GetShareSourceOptions : The GetShareSource options.
type GetShareSourceOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetShareSourceOptions : Instantiate GetShareSourceOptions
func (*VpcV1) NewGetShareSourceOptions(shareID string) *GetShareSourceOptions {
	return &GetShareSourceOptions{
		ShareID: core.StringPtr(shareID),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *GetShareSourceOptions) SetShareID(shareID string) *GetShareSourceOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetShareSourceOptions) SetHeaders(param map[string]string) *GetShareSourceOptions {
	options.Headers = param
	return options
}

// GetSnapshotCloneOptions : The GetSnapshotClone options.
type GetSnapshotCloneOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The zone name.
	ZoneName *string `json:"zone_name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSnapshotCloneOptions : Instantiate GetSnapshotCloneOptions
func (*VpcV1) NewGetSnapshotCloneOptions(id string, zoneName string) *GetSnapshotCloneOptions {
	return &GetSnapshotCloneOptions{
		ID:       core.StringPtr(id),
		ZoneName: core.StringPtr(zoneName),
	}
}

// SetID : Allow user to set ID
func (_options *GetSnapshotCloneOptions) SetID(id string) *GetSnapshotCloneOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *GetSnapshotCloneOptions) SetZoneName(zoneName string) *GetSnapshotCloneOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSnapshotCloneOptions) SetHeaders(param map[string]string) *GetSnapshotCloneOptions {
	options.Headers = param
	return options
}

// GetSnapshotConsistencyGroupOptions : The GetSnapshotConsistencyGroup options.
type GetSnapshotConsistencyGroupOptions struct {
	// The snapshot consistency group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSnapshotConsistencyGroupOptions : Instantiate GetSnapshotConsistencyGroupOptions
func (*VpcV1) NewGetSnapshotConsistencyGroupOptions(id string) *GetSnapshotConsistencyGroupOptions {
	return &GetSnapshotConsistencyGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSnapshotConsistencyGroupOptions) SetID(id string) *GetSnapshotConsistencyGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSnapshotConsistencyGroupOptions) SetHeaders(param map[string]string) *GetSnapshotConsistencyGroupOptions {
	options.Headers = param
	return options
}

// GetSnapshotOptions : The GetSnapshot options.
type GetSnapshotOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSnapshotOptions : Instantiate GetSnapshotOptions
func (*VpcV1) NewGetSnapshotOptions(id string) *GetSnapshotOptions {
	return &GetSnapshotOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSnapshotOptions) SetID(id string) *GetSnapshotOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSnapshotOptions) SetHeaders(param map[string]string) *GetSnapshotOptions {
	options.Headers = param
	return options
}

// GetSubnetNetworkACLOptions : The GetSubnetNetworkACL options.
type GetSubnetNetworkACLOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSubnetNetworkACLOptions : Instantiate GetSubnetNetworkACLOptions
func (*VpcV1) NewGetSubnetNetworkACLOptions(id string) *GetSubnetNetworkACLOptions {
	return &GetSubnetNetworkACLOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSubnetNetworkACLOptions) SetID(id string) *GetSubnetNetworkACLOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSubnetNetworkACLOptions) SetHeaders(param map[string]string) *GetSubnetNetworkACLOptions {
	options.Headers = param
	return options
}

// GetSubnetOptions : The GetSubnet options.
type GetSubnetOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSubnetOptions : Instantiate GetSubnetOptions
func (*VpcV1) NewGetSubnetOptions(id string) *GetSubnetOptions {
	return &GetSubnetOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSubnetOptions) SetID(id string) *GetSubnetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSubnetOptions) SetHeaders(param map[string]string) *GetSubnetOptions {
	options.Headers = param
	return options
}

// GetSubnetPublicGatewayOptions : The GetSubnetPublicGateway options.
type GetSubnetPublicGatewayOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSubnetPublicGatewayOptions : Instantiate GetSubnetPublicGatewayOptions
func (*VpcV1) NewGetSubnetPublicGatewayOptions(id string) *GetSubnetPublicGatewayOptions {
	return &GetSubnetPublicGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSubnetPublicGatewayOptions) SetID(id string) *GetSubnetPublicGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSubnetPublicGatewayOptions) SetHeaders(param map[string]string) *GetSubnetPublicGatewayOptions {
	options.Headers = param
	return options
}

// GetSubnetReservedIPOptions : The GetSubnetReservedIP options.
type GetSubnetReservedIPOptions struct {
	// The subnet identifier.
	SubnetID *string `json:"subnet_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSubnetReservedIPOptions : Instantiate GetSubnetReservedIPOptions
func (*VpcV1) NewGetSubnetReservedIPOptions(subnetID string, id string) *GetSubnetReservedIPOptions {
	return &GetSubnetReservedIPOptions{
		SubnetID: core.StringPtr(subnetID),
		ID:       core.StringPtr(id),
	}
}

// SetSubnetID : Allow user to set SubnetID
func (_options *GetSubnetReservedIPOptions) SetSubnetID(subnetID string) *GetSubnetReservedIPOptions {
	_options.SubnetID = core.StringPtr(subnetID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetSubnetReservedIPOptions) SetID(id string) *GetSubnetReservedIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSubnetReservedIPOptions) SetHeaders(param map[string]string) *GetSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// GetSubnetRoutingTableOptions : The GetSubnetRoutingTable options.
type GetSubnetRoutingTableOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetSubnetRoutingTableOptions : Instantiate GetSubnetRoutingTableOptions
func (*VpcV1) NewGetSubnetRoutingTableOptions(id string) *GetSubnetRoutingTableOptions {
	return &GetSubnetRoutingTableOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetSubnetRoutingTableOptions) SetID(id string) *GetSubnetRoutingTableOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetSubnetRoutingTableOptions) SetHeaders(param map[string]string) *GetSubnetRoutingTableOptions {
	options.Headers = param
	return options
}

// GetVirtualNetworkInterfaceIPOptions : The GetVirtualNetworkInterfaceIP options.
type GetVirtualNetworkInterfaceIPOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVirtualNetworkInterfaceIPOptions : Instantiate GetVirtualNetworkInterfaceIPOptions
func (*VpcV1) NewGetVirtualNetworkInterfaceIPOptions(virtualNetworkInterfaceID string, id string) *GetVirtualNetworkInterfaceIPOptions {
	return &GetVirtualNetworkInterfaceIPOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
		ID:                        core.StringPtr(id),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *GetVirtualNetworkInterfaceIPOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *GetVirtualNetworkInterfaceIPOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVirtualNetworkInterfaceIPOptions) SetID(id string) *GetVirtualNetworkInterfaceIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVirtualNetworkInterfaceIPOptions) SetHeaders(param map[string]string) *GetVirtualNetworkInterfaceIPOptions {
	options.Headers = param
	return options
}

// GetVirtualNetworkInterfaceOptions : The GetVirtualNetworkInterface options.
type GetVirtualNetworkInterfaceOptions struct {
	// The virtual network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVirtualNetworkInterfaceOptions : Instantiate GetVirtualNetworkInterfaceOptions
func (*VpcV1) NewGetVirtualNetworkInterfaceOptions(id string) *GetVirtualNetworkInterfaceOptions {
	return &GetVirtualNetworkInterfaceOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVirtualNetworkInterfaceOptions) SetID(id string) *GetVirtualNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVirtualNetworkInterfaceOptions) SetHeaders(param map[string]string) *GetVirtualNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// GetVolumeOptions : The GetVolume options.
type GetVolumeOptions struct {
	// The volume identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVolumeOptions : Instantiate GetVolumeOptions
func (*VpcV1) NewGetVolumeOptions(id string) *GetVolumeOptions {
	return &GetVolumeOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVolumeOptions) SetID(id string) *GetVolumeOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVolumeOptions) SetHeaders(param map[string]string) *GetVolumeOptions {
	options.Headers = param
	return options
}

// GetVolumeProfileOptions : The GetVolumeProfile options.
type GetVolumeProfileOptions struct {
	// The volume profile name.
	Name *string `json:"name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVolumeProfileOptions : Instantiate GetVolumeProfileOptions
func (*VpcV1) NewGetVolumeProfileOptions(name string) *GetVolumeProfileOptions {
	return &GetVolumeProfileOptions{
		Name: core.StringPtr(name),
	}
}

// SetName : Allow user to set Name
func (_options *GetVolumeProfileOptions) SetName(name string) *GetVolumeProfileOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVolumeProfileOptions) SetHeaders(param map[string]string) *GetVolumeProfileOptions {
	options.Headers = param
	return options
}

// GetVPCAddressPrefixOptions : The GetVPCAddressPrefix options.
type GetVPCAddressPrefixOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The prefix identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCAddressPrefixOptions : Instantiate GetVPCAddressPrefixOptions
func (*VpcV1) NewGetVPCAddressPrefixOptions(vpcID string, id string) *GetVPCAddressPrefixOptions {
	return &GetVPCAddressPrefixOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *GetVPCAddressPrefixOptions) SetVPCID(vpcID string) *GetVPCAddressPrefixOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPCAddressPrefixOptions) SetID(id string) *GetVPCAddressPrefixOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCAddressPrefixOptions) SetHeaders(param map[string]string) *GetVPCAddressPrefixOptions {
	options.Headers = param
	return options
}

// GetVPCDefaultNetworkACLOptions : The GetVPCDefaultNetworkACL options.
type GetVPCDefaultNetworkACLOptions struct {
	// The VPC identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCDefaultNetworkACLOptions : Instantiate GetVPCDefaultNetworkACLOptions
func (*VpcV1) NewGetVPCDefaultNetworkACLOptions(id string) *GetVPCDefaultNetworkACLOptions {
	return &GetVPCDefaultNetworkACLOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPCDefaultNetworkACLOptions) SetID(id string) *GetVPCDefaultNetworkACLOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCDefaultNetworkACLOptions) SetHeaders(param map[string]string) *GetVPCDefaultNetworkACLOptions {
	options.Headers = param
	return options
}

// GetVPCDefaultRoutingTableOptions : The GetVPCDefaultRoutingTable options.
type GetVPCDefaultRoutingTableOptions struct {
	// The VPC identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCDefaultRoutingTableOptions : Instantiate GetVPCDefaultRoutingTableOptions
func (*VpcV1) NewGetVPCDefaultRoutingTableOptions(id string) *GetVPCDefaultRoutingTableOptions {
	return &GetVPCDefaultRoutingTableOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPCDefaultRoutingTableOptions) SetID(id string) *GetVPCDefaultRoutingTableOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCDefaultRoutingTableOptions) SetHeaders(param map[string]string) *GetVPCDefaultRoutingTableOptions {
	options.Headers = param
	return options
}

// GetVPCDefaultSecurityGroupOptions : The GetVPCDefaultSecurityGroup options.
type GetVPCDefaultSecurityGroupOptions struct {
	// The VPC identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCDefaultSecurityGroupOptions : Instantiate GetVPCDefaultSecurityGroupOptions
func (*VpcV1) NewGetVPCDefaultSecurityGroupOptions(id string) *GetVPCDefaultSecurityGroupOptions {
	return &GetVPCDefaultSecurityGroupOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPCDefaultSecurityGroupOptions) SetID(id string) *GetVPCDefaultSecurityGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCDefaultSecurityGroupOptions) SetHeaders(param map[string]string) *GetVPCDefaultSecurityGroupOptions {
	options.Headers = param
	return options
}

// GetVPCDnsResolutionBindingOptions : The GetVPCDnsResolutionBinding options.
type GetVPCDnsResolutionBindingOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The DNS resolution binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCDnsResolutionBindingOptions : Instantiate GetVPCDnsResolutionBindingOptions
func (*VpcV1) NewGetVPCDnsResolutionBindingOptions(vpcID string, id string) *GetVPCDnsResolutionBindingOptions {
	return &GetVPCDnsResolutionBindingOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *GetVPCDnsResolutionBindingOptions) SetVPCID(vpcID string) *GetVPCDnsResolutionBindingOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPCDnsResolutionBindingOptions) SetID(id string) *GetVPCDnsResolutionBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCDnsResolutionBindingOptions) SetHeaders(param map[string]string) *GetVPCDnsResolutionBindingOptions {
	options.Headers = param
	return options
}

// GetVPCOptions : The GetVPC options.
type GetVPCOptions struct {
	// The VPC identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCOptions : Instantiate GetVPCOptions
func (*VpcV1) NewGetVPCOptions(id string) *GetVPCOptions {
	return &GetVPCOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPCOptions) SetID(id string) *GetVPCOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCOptions) SetHeaders(param map[string]string) *GetVPCOptions {
	options.Headers = param
	return options
}

// GetVPCRouteOptions : The GetVPCRoute options.
type GetVPCRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCRouteOptions : Instantiate GetVPCRouteOptions
func (*VpcV1) NewGetVPCRouteOptions(vpcID string, id string) *GetVPCRouteOptions {
	return &GetVPCRouteOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *GetVPCRouteOptions) SetVPCID(vpcID string) *GetVPCRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPCRouteOptions) SetID(id string) *GetVPCRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCRouteOptions) SetHeaders(param map[string]string) *GetVPCRouteOptions {
	options.Headers = param
	return options
}

// GetVPCRoutingTableOptions : The GetVPCRoutingTable options.
type GetVPCRoutingTableOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCRoutingTableOptions : Instantiate GetVPCRoutingTableOptions
func (*VpcV1) NewGetVPCRoutingTableOptions(vpcID string, id string) *GetVPCRoutingTableOptions {
	return &GetVPCRoutingTableOptions{
		VPCID: core.StringPtr(vpcID),
		ID:    core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *GetVPCRoutingTableOptions) SetVPCID(vpcID string) *GetVPCRoutingTableOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPCRoutingTableOptions) SetID(id string) *GetVPCRoutingTableOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCRoutingTableOptions) SetHeaders(param map[string]string) *GetVPCRoutingTableOptions {
	options.Headers = param
	return options
}

// GetVPCRoutingTableRouteOptions : The GetVPCRoutingTableRoute options.
type GetVPCRoutingTableRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	RoutingTableID *string `json:"routing_table_id" validate:"required,ne="`

	// The VPC routing table route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPCRoutingTableRouteOptions : Instantiate GetVPCRoutingTableRouteOptions
func (*VpcV1) NewGetVPCRoutingTableRouteOptions(vpcID string, routingTableID string, id string) *GetVPCRoutingTableRouteOptions {
	return &GetVPCRoutingTableRouteOptions{
		VPCID:          core.StringPtr(vpcID),
		RoutingTableID: core.StringPtr(routingTableID),
		ID:             core.StringPtr(id),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *GetVPCRoutingTableRouteOptions) SetVPCID(vpcID string) *GetVPCRoutingTableRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetRoutingTableID : Allow user to set RoutingTableID
func (_options *GetVPCRoutingTableRouteOptions) SetRoutingTableID(routingTableID string) *GetVPCRoutingTableRouteOptions {
	_options.RoutingTableID = core.StringPtr(routingTableID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPCRoutingTableRouteOptions) SetID(id string) *GetVPCRoutingTableRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPCRoutingTableRouteOptions) SetHeaders(param map[string]string) *GetVPCRoutingTableRouteOptions {
	options.Headers = param
	return options
}

// GetVPNGatewayConnectionOptions : The GetVPNGatewayConnection options.
type GetVPNGatewayConnectionOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPNGatewayConnectionOptions : Instantiate GetVPNGatewayConnectionOptions
func (*VpcV1) NewGetVPNGatewayConnectionOptions(vpnGatewayID string, id string) *GetVPNGatewayConnectionOptions {
	return &GetVPNGatewayConnectionOptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *GetVPNGatewayConnectionOptions) SetVPNGatewayID(vpnGatewayID string) *GetVPNGatewayConnectionOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPNGatewayConnectionOptions) SetID(id string) *GetVPNGatewayConnectionOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPNGatewayConnectionOptions) SetHeaders(param map[string]string) *GetVPNGatewayConnectionOptions {
	options.Headers = param
	return options
}

// GetVPNGatewayOptions : The GetVPNGateway options.
type GetVPNGatewayOptions struct {
	// The VPN gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPNGatewayOptions : Instantiate GetVPNGatewayOptions
func (*VpcV1) NewGetVPNGatewayOptions(id string) *GetVPNGatewayOptions {
	return &GetVPNGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPNGatewayOptions) SetID(id string) *GetVPNGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPNGatewayOptions) SetHeaders(param map[string]string) *GetVPNGatewayOptions {
	options.Headers = param
	return options
}

// GetVPNServerClientConfigurationOptions : The GetVPNServerClientConfiguration options.
type GetVPNServerClientConfigurationOptions struct {
	// The VPN server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPNServerClientConfigurationOptions : Instantiate GetVPNServerClientConfigurationOptions
func (*VpcV1) NewGetVPNServerClientConfigurationOptions(id string) *GetVPNServerClientConfigurationOptions {
	return &GetVPNServerClientConfigurationOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPNServerClientConfigurationOptions) SetID(id string) *GetVPNServerClientConfigurationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPNServerClientConfigurationOptions) SetHeaders(param map[string]string) *GetVPNServerClientConfigurationOptions {
	options.Headers = param
	return options
}

// GetVPNServerClientOptions : The GetVPNServerClient options.
type GetVPNServerClientOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The VPN client identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPNServerClientOptions : Instantiate GetVPNServerClientOptions
func (*VpcV1) NewGetVPNServerClientOptions(vpnServerID string, id string) *GetVPNServerClientOptions {
	return &GetVPNServerClientOptions{
		VPNServerID: core.StringPtr(vpnServerID),
		ID:          core.StringPtr(id),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *GetVPNServerClientOptions) SetVPNServerID(vpnServerID string) *GetVPNServerClientOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPNServerClientOptions) SetID(id string) *GetVPNServerClientOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPNServerClientOptions) SetHeaders(param map[string]string) *GetVPNServerClientOptions {
	options.Headers = param
	return options
}

// GetVPNServerOptions : The GetVPNServer options.
type GetVPNServerOptions struct {
	// The VPN server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPNServerOptions : Instantiate GetVPNServerOptions
func (*VpcV1) NewGetVPNServerOptions(id string) *GetVPNServerOptions {
	return &GetVPNServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *GetVPNServerOptions) SetID(id string) *GetVPNServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPNServerOptions) SetHeaders(param map[string]string) *GetVPNServerOptions {
	options.Headers = param
	return options
}

// GetVPNServerRouteOptions : The GetVPNServerRoute options.
type GetVPNServerRouteOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The VPN route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewGetVPNServerRouteOptions : Instantiate GetVPNServerRouteOptions
func (*VpcV1) NewGetVPNServerRouteOptions(vpnServerID string, id string) *GetVPNServerRouteOptions {
	return &GetVPNServerRouteOptions{
		VPNServerID: core.StringPtr(vpnServerID),
		ID:          core.StringPtr(id),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *GetVPNServerRouteOptions) SetVPNServerID(vpnServerID string) *GetVPNServerRouteOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *GetVPNServerRouteOptions) SetID(id string) *GetVPNServerRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *GetVPNServerRouteOptions) SetHeaders(param map[string]string) *GetVPNServerRouteOptions {
	options.Headers = param
	return options
}

// IkePolicy : IkePolicy struct
type IkePolicy struct {
	// The authentication algorithm.
	//
	// The `md5` and `sha1` algorithms have been deprecated.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AuthenticationAlgorithm *string `json:"authentication_algorithm" validate:"required"`

	// The VPN gateway connections that use this IKE policy.
	Connections []VPNGatewayConnectionReference `json:"connections" validate:"required"`

	// The date and time that this IKE policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The Diffie-Hellman group
	//
	// Groups `2` and `5` have been deprecated.
	DhGroup *int64 `json:"dh_group" validate:"required"`

	// The encryption algorithm.
	//
	// The `triple_des` algorithm has been deprecated.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	EncryptionAlgorithm *string `json:"encryption_algorithm" validate:"required"`

	// The URL for this IKE policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this IKE policy.
	ID *string `json:"id" validate:"required"`

	// The IKE protocol version.
	IkeVersion *int64 `json:"ike_version" validate:"required"`

	// The key lifetime in seconds.
	KeyLifetime *int64 `json:"key_lifetime" validate:"required"`

	// The name for this IKE policy. The name is unique across all IKE policies in the region.
	Name *string `json:"name" validate:"required"`

	// The IKE negotiation mode.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	NegotiationMode *string `json:"negotiation_mode" validate:"required"`

	// The resource group for this IKE policy.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the IkePolicy.AuthenticationAlgorithm property.
// The authentication algorithm.
//
// The `md5` and `sha1` algorithms have been deprecated.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IkePolicyAuthenticationAlgorithmMd5Const    = "md5"
	IkePolicyAuthenticationAlgorithmSha1Const   = "sha1"
	IkePolicyAuthenticationAlgorithmSha256Const = "sha256"
	IkePolicyAuthenticationAlgorithmSha384Const = "sha384"
	IkePolicyAuthenticationAlgorithmSha512Const = "sha512"
)

// Constants associated with the IkePolicy.EncryptionAlgorithm property.
// The encryption algorithm.
//
// The `triple_des` algorithm has been deprecated.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IkePolicyEncryptionAlgorithmAes128Const    = "aes128"
	IkePolicyEncryptionAlgorithmAes192Const    = "aes192"
	IkePolicyEncryptionAlgorithmAes256Const    = "aes256"
	IkePolicyEncryptionAlgorithmTripleDesConst = "triple_des"
)

// Constants associated with the IkePolicy.NegotiationMode property.
// The IKE negotiation mode.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IkePolicyNegotiationModeMainConst = "main"
)

// Constants associated with the IkePolicy.ResourceType property.
// The resource type.
const (
	IkePolicyResourceTypeIkePolicyConst = "ike_policy"
)

// UnmarshalIkePolicy unmarshals an instance of IkePolicy from the specified map of raw messages.
func UnmarshalIkePolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IkePolicy)
	err = core.UnmarshalPrimitive(m, "authentication_algorithm", &obj.AuthenticationAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "authentication_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "connections", &obj.Connections, UnmarshalVPNGatewayConnectionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "dh_group", &obj.DhGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "dh_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption_algorithm", &obj.EncryptionAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ike_version", &obj.IkeVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "key_lifetime", &obj.KeyLifetime)
	if err != nil {
		err = core.SDKErrorf(err, "", "key_lifetime-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "negotiation_mode", &obj.NegotiationMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "negotiation_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// IkePolicyCollection : IkePolicyCollection struct
type IkePolicyCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of IKE policies.
	IkePolicies []IkePolicy `json:"ike_policies" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalIkePolicyCollection unmarshals an instance of IkePolicyCollection from the specified map of raw messages.
func UnmarshalIkePolicyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IkePolicyCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_policies", &obj.IkePolicies, UnmarshalIkePolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *IkePolicyCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// IkePolicyConnectionCollection : IkePolicyConnectionCollection struct
type IkePolicyConnectionCollection struct {
	// A page of VPN gateway connections that use the IKE policy specified by the identifier in the URL.
	Connections []VPNGatewayConnectionIntf `json:"connections" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalIkePolicyConnectionCollection unmarshals an instance of IkePolicyConnectionCollection from the specified map of raw messages.
func UnmarshalIkePolicyConnectionCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IkePolicyConnectionCollection)
	err = core.UnmarshalModel(m, "connections", &obj.Connections, UnmarshalVPNGatewayConnection)
	if err != nil {
		err = core.SDKErrorf(err, "", "connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *IkePolicyConnectionCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// IkePolicyPatch : IkePolicyPatch struct
type IkePolicyPatch struct {
	// The authentication algorithm.
	AuthenticationAlgorithm *string `json:"authentication_algorithm,omitempty"`

	// The Diffie-Hellman group.
	DhGroup *int64 `json:"dh_group,omitempty"`

	// The encryption algorithm.
	EncryptionAlgorithm *string `json:"encryption_algorithm,omitempty"`

	// The IKE protocol version.
	IkeVersion *int64 `json:"ike_version,omitempty"`

	// The key lifetime in seconds.
	KeyLifetime *int64 `json:"key_lifetime,omitempty"`

	// The name for this IKE policy. The name must not be used by another IKE policy in the region.
	Name *string `json:"name,omitempty"`
}

// Constants associated with the IkePolicyPatch.AuthenticationAlgorithm property.
// The authentication algorithm.
const (
	IkePolicyPatchAuthenticationAlgorithmSha256Const = "sha256"
	IkePolicyPatchAuthenticationAlgorithmSha384Const = "sha384"
	IkePolicyPatchAuthenticationAlgorithmSha512Const = "sha512"
)

// Constants associated with the IkePolicyPatch.EncryptionAlgorithm property.
// The encryption algorithm.
const (
	IkePolicyPatchEncryptionAlgorithmAes128Const = "aes128"
	IkePolicyPatchEncryptionAlgorithmAes192Const = "aes192"
	IkePolicyPatchEncryptionAlgorithmAes256Const = "aes256"
)

// UnmarshalIkePolicyPatch unmarshals an instance of IkePolicyPatch from the specified map of raw messages.
func UnmarshalIkePolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IkePolicyPatch)
	err = core.UnmarshalPrimitive(m, "authentication_algorithm", &obj.AuthenticationAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "authentication_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "dh_group", &obj.DhGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "dh_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption_algorithm", &obj.EncryptionAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ike_version", &obj.IkeVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "key_lifetime", &obj.KeyLifetime)
	if err != nil {
		err = core.SDKErrorf(err, "", "key_lifetime-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the IkePolicyPatch
func (ikePolicyPatch *IkePolicyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(ikePolicyPatch.AuthenticationAlgorithm) {
		_patch["authentication_algorithm"] = ikePolicyPatch.AuthenticationAlgorithm
	}
	if !core.IsNil(ikePolicyPatch.DhGroup) {
		_patch["dh_group"] = ikePolicyPatch.DhGroup
	}
	if !core.IsNil(ikePolicyPatch.EncryptionAlgorithm) {
		_patch["encryption_algorithm"] = ikePolicyPatch.EncryptionAlgorithm
	}
	if !core.IsNil(ikePolicyPatch.IkeVersion) {
		_patch["ike_version"] = ikePolicyPatch.IkeVersion
	}
	if !core.IsNil(ikePolicyPatch.KeyLifetime) {
		_patch["key_lifetime"] = ikePolicyPatch.KeyLifetime
	}
	if !core.IsNil(ikePolicyPatch.Name) {
		_patch["name"] = ikePolicyPatch.Name
	}

	return
}

// IkePolicyReference : IkePolicyReference struct
type IkePolicyReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this IKE policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this IKE policy.
	ID *string `json:"id" validate:"required"`

	// The name for this IKE policy. The name is unique across all IKE policies in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the IkePolicyReference.ResourceType property.
// The resource type.
const (
	IkePolicyReferenceResourceTypeIkePolicyConst = "ike_policy"
)

// UnmarshalIkePolicyReference unmarshals an instance of IkePolicyReference from the specified map of raw messages.
func UnmarshalIkePolicyReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IkePolicyReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// IP : IP struct
type IP struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address" validate:"required"`
}

// NewIP : Instantiate IP (Generic Model Constructor)
func (*VpcV1) NewIP(address string) (_model *IP, err error) {
	_model = &IP{
		Address: core.StringPtr(address),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalIP unmarshals an instance of IP from the specified map of raw messages.
func UnmarshalIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IP)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the IP
func (ip *IP) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(ip.Address) {
		_patch["address"] = ip.Address
	}

	return
}

// IPsecPolicy : IPsecPolicy struct
type IPsecPolicy struct {
	// The authentication algorithm
	//
	// The `md5` and `sha1` algorithms have been deprecated
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AuthenticationAlgorithm *string `json:"authentication_algorithm" validate:"required"`

	// The VPN gateway connections that use this IPsec policy.
	Connections []VPNGatewayConnectionReference `json:"connections" validate:"required"`

	// The date and time that this IPsec policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The encapsulation mode used.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	EncapsulationMode *string `json:"encapsulation_mode" validate:"required"`

	// The encryption algorithm
	//
	// The `triple_des` algorithm has been deprecated
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	EncryptionAlgorithm *string `json:"encryption_algorithm" validate:"required"`

	// The URL for this IPsec policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this IPsec policy.
	ID *string `json:"id" validate:"required"`

	// The key lifetime in seconds.
	KeyLifetime *int64 `json:"key_lifetime" validate:"required"`

	// The name for this IPsec policy. The name is unique across all IPsec policies in the region.
	Name *string `json:"name" validate:"required"`

	// The Perfect Forward Secrecy group
	//
	// Groups `group_2` and `group_5` have been deprecated
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Pfs *string `json:"pfs" validate:"required"`

	// The resource group for this IPsec policy.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The transform protocol used.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	TransformProtocol *string `json:"transform_protocol" validate:"required"`
}

// Constants associated with the IPsecPolicy.AuthenticationAlgorithm property.
// The authentication algorithm
//
// # The `md5` and `sha1` algorithms have been deprecated
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IPsecPolicyAuthenticationAlgorithmDisabledConst = "disabled"
	IPsecPolicyAuthenticationAlgorithmMd5Const      = "md5"
	IPsecPolicyAuthenticationAlgorithmSha1Const     = "sha1"
	IPsecPolicyAuthenticationAlgorithmSha256Const   = "sha256"
	IPsecPolicyAuthenticationAlgorithmSha384Const   = "sha384"
	IPsecPolicyAuthenticationAlgorithmSha512Const   = "sha512"
)

// Constants associated with the IPsecPolicy.EncapsulationMode property.
// The encapsulation mode used.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IPsecPolicyEncapsulationModeTunnelConst = "tunnel"
)

// Constants associated with the IPsecPolicy.EncryptionAlgorithm property.
// The encryption algorithm
//
// The `triple_des` algorithm has been deprecated
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IPsecPolicyEncryptionAlgorithmAes128Const      = "aes128"
	IPsecPolicyEncryptionAlgorithmAes128gcm16Const = "aes128gcm16"
	IPsecPolicyEncryptionAlgorithmAes192Const      = "aes192"
	IPsecPolicyEncryptionAlgorithmAes192gcm16Const = "aes192gcm16"
	IPsecPolicyEncryptionAlgorithmAes256Const      = "aes256"
	IPsecPolicyEncryptionAlgorithmAes256gcm16Const = "aes256gcm16"
	IPsecPolicyEncryptionAlgorithmTripleDesConst   = "triple_des"
)

// Constants associated with the IPsecPolicy.Pfs property.
// The Perfect Forward Secrecy group
//
// Groups `group_2` and `group_5` have been deprecated
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IPsecPolicyPfsDisabledConst = "disabled"
	IPsecPolicyPfsGroup14Const  = "group_14"
	IPsecPolicyPfsGroup15Const  = "group_15"
	IPsecPolicyPfsGroup16Const  = "group_16"
	IPsecPolicyPfsGroup17Const  = "group_17"
	IPsecPolicyPfsGroup18Const  = "group_18"
	IPsecPolicyPfsGroup19Const  = "group_19"
	IPsecPolicyPfsGroup2Const   = "group_2"
	IPsecPolicyPfsGroup20Const  = "group_20"
	IPsecPolicyPfsGroup21Const  = "group_21"
	IPsecPolicyPfsGroup22Const  = "group_22"
	IPsecPolicyPfsGroup23Const  = "group_23"
	IPsecPolicyPfsGroup24Const  = "group_24"
	IPsecPolicyPfsGroup31Const  = "group_31"
	IPsecPolicyPfsGroup5Const   = "group_5"
)

// Constants associated with the IPsecPolicy.ResourceType property.
// The resource type.
const (
	IPsecPolicyResourceTypeIpsecPolicyConst = "ipsec_policy"
)

// Constants associated with the IPsecPolicy.TransformProtocol property.
// The transform protocol used.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	IPsecPolicyTransformProtocolEspConst = "esp"
)

// UnmarshalIPsecPolicy unmarshals an instance of IPsecPolicy from the specified map of raw messages.
func UnmarshalIPsecPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IPsecPolicy)
	err = core.UnmarshalPrimitive(m, "authentication_algorithm", &obj.AuthenticationAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "authentication_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "connections", &obj.Connections, UnmarshalVPNGatewayConnectionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encapsulation_mode", &obj.EncapsulationMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "encapsulation_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption_algorithm", &obj.EncryptionAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "key_lifetime", &obj.KeyLifetime)
	if err != nil {
		err = core.SDKErrorf(err, "", "key_lifetime-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "pfs", &obj.Pfs)
	if err != nil {
		err = core.SDKErrorf(err, "", "pfs-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "transform_protocol", &obj.TransformProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "transform_protocol-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// IPsecPolicyCollection : IPsecPolicyCollection struct
type IPsecPolicyCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of IPsec policies.
	IpsecPolicies []IPsecPolicy `json:"ipsec_policies" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalIPsecPolicyCollection unmarshals an instance of IPsecPolicyCollection from the specified map of raw messages.
func UnmarshalIPsecPolicyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IPsecPolicyCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ipsec_policies", &obj.IpsecPolicies, UnmarshalIPsecPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipsec_policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *IPsecPolicyCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// IPsecPolicyConnectionCollection : IPsecPolicyConnectionCollection struct
type IPsecPolicyConnectionCollection struct {
	// A page of VPN gateway connections that use the IPsec policy specified by the identifier in the URL.
	Connections []VPNGatewayConnectionIntf `json:"connections" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalIPsecPolicyConnectionCollection unmarshals an instance of IPsecPolicyConnectionCollection from the specified map of raw messages.
func UnmarshalIPsecPolicyConnectionCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IPsecPolicyConnectionCollection)
	err = core.UnmarshalModel(m, "connections", &obj.Connections, UnmarshalVPNGatewayConnection)
	if err != nil {
		err = core.SDKErrorf(err, "", "connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *IPsecPolicyConnectionCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// IPsecPolicyPatch : IPsecPolicyPatch struct
type IPsecPolicyPatch struct {
	// The authentication algorithm
	//
	// Must be `disabled` if and only if the `encryption_algorithm` is `aes128gcm16`,
	// `aes192gcm16`, or `aes256gcm16`
	//
	// The `md5` and `sha1` algorithms have been deprecated.
	AuthenticationAlgorithm *string `json:"authentication_algorithm,omitempty"`

	// The encryption algorithm
	//
	// The `authentication_algorithm` must be `disabled` if and only if
	// `encryption_algorithm` is `aes128gcm16`, `aes192gcm16`, or `aes256gcm16`
	//
	// The `triple_des` algorithm has been deprecated.
	EncryptionAlgorithm *string `json:"encryption_algorithm,omitempty"`

	// The key lifetime in seconds.
	KeyLifetime *int64 `json:"key_lifetime,omitempty"`

	// The name for this IPsec policy. The name must not be used by another IPsec policy in the region.
	Name *string `json:"name,omitempty"`

	// The Perfect Forward Secrecy group.
	//
	// Groups `group_2` and `group_5` have been deprecated.
	Pfs *string `json:"pfs,omitempty"`
}

// Constants associated with the IPsecPolicyPatch.AuthenticationAlgorithm property.
// The authentication algorithm
//
// Must be `disabled` if and only if the `encryption_algorithm` is `aes128gcm16`,
// `aes192gcm16`, or `aes256gcm16`
//
// The `md5` and `sha1` algorithms have been deprecated.
const (
	IPsecPolicyPatchAuthenticationAlgorithmDisabledConst = "disabled"
	IPsecPolicyPatchAuthenticationAlgorithmSha256Const   = "sha256"
	IPsecPolicyPatchAuthenticationAlgorithmSha384Const   = "sha384"
	IPsecPolicyPatchAuthenticationAlgorithmSha512Const   = "sha512"
)

// Constants associated with the IPsecPolicyPatch.EncryptionAlgorithm property.
// The encryption algorithm
//
// The `authentication_algorithm` must be `disabled` if and only if
// `encryption_algorithm` is `aes128gcm16`, `aes192gcm16`, or `aes256gcm16`
//
// The `triple_des` algorithm has been deprecated.
const (
	IPsecPolicyPatchEncryptionAlgorithmAes128Const      = "aes128"
	IPsecPolicyPatchEncryptionAlgorithmAes128gcm16Const = "aes128gcm16"
	IPsecPolicyPatchEncryptionAlgorithmAes192Const      = "aes192"
	IPsecPolicyPatchEncryptionAlgorithmAes192gcm16Const = "aes192gcm16"
	IPsecPolicyPatchEncryptionAlgorithmAes256Const      = "aes256"
	IPsecPolicyPatchEncryptionAlgorithmAes256gcm16Const = "aes256gcm16"
)

// Constants associated with the IPsecPolicyPatch.Pfs property.
// The Perfect Forward Secrecy group.
//
// Groups `group_2` and `group_5` have been deprecated.
const (
	IPsecPolicyPatchPfsDisabledConst = "disabled"
	IPsecPolicyPatchPfsGroup14Const  = "group_14"
	IPsecPolicyPatchPfsGroup15Const  = "group_15"
	IPsecPolicyPatchPfsGroup16Const  = "group_16"
	IPsecPolicyPatchPfsGroup17Const  = "group_17"
	IPsecPolicyPatchPfsGroup18Const  = "group_18"
	IPsecPolicyPatchPfsGroup19Const  = "group_19"
	IPsecPolicyPatchPfsGroup20Const  = "group_20"
	IPsecPolicyPatchPfsGroup21Const  = "group_21"
	IPsecPolicyPatchPfsGroup22Const  = "group_22"
	IPsecPolicyPatchPfsGroup23Const  = "group_23"
	IPsecPolicyPatchPfsGroup24Const  = "group_24"
	IPsecPolicyPatchPfsGroup31Const  = "group_31"
)

// UnmarshalIPsecPolicyPatch unmarshals an instance of IPsecPolicyPatch from the specified map of raw messages.
func UnmarshalIPsecPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IPsecPolicyPatch)
	err = core.UnmarshalPrimitive(m, "authentication_algorithm", &obj.AuthenticationAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "authentication_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption_algorithm", &obj.EncryptionAlgorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "key_lifetime", &obj.KeyLifetime)
	if err != nil {
		err = core.SDKErrorf(err, "", "key_lifetime-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "pfs", &obj.Pfs)
	if err != nil {
		err = core.SDKErrorf(err, "", "pfs-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the IPsecPolicyPatch
func (iPsecPolicyPatch *IPsecPolicyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(iPsecPolicyPatch.AuthenticationAlgorithm) {
		_patch["authentication_algorithm"] = iPsecPolicyPatch.AuthenticationAlgorithm
	}
	if !core.IsNil(iPsecPolicyPatch.EncryptionAlgorithm) {
		_patch["encryption_algorithm"] = iPsecPolicyPatch.EncryptionAlgorithm
	}
	if !core.IsNil(iPsecPolicyPatch.KeyLifetime) {
		_patch["key_lifetime"] = iPsecPolicyPatch.KeyLifetime
	}
	if !core.IsNil(iPsecPolicyPatch.Name) {
		_patch["name"] = iPsecPolicyPatch.Name
	}
	if !core.IsNil(iPsecPolicyPatch.Pfs) {
		_patch["pfs"] = iPsecPolicyPatch.Pfs
	}

	return
}

// IPsecPolicyReference : IPsecPolicyReference struct
type IPsecPolicyReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this IPsec policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this IPsec policy.
	ID *string `json:"id" validate:"required"`

	// The name for this IPsec policy. The name is unique across all IPsec policies in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the IPsecPolicyReference.ResourceType property.
// The resource type.
const (
	IPsecPolicyReferenceResourceTypeIpsecPolicyConst = "ipsec_policy"
)

// UnmarshalIPsecPolicyReference unmarshals an instance of IPsecPolicyReference from the specified map of raw messages.
func UnmarshalIPsecPolicyReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(IPsecPolicyReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Image : Image struct
type Image struct {
	// The usage constraints to match against the requested instance or bare metal server
	// properties to determine compatibility.
	AllowedUse *ImageAllowedUse `json:"allowed_use" validate:"required"`

	CatalogOffering *ImageCatalogOffering `json:"catalog_offering" validate:"required"`

	// The date and time that the image was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this image.
	CRN *string `json:"crn" validate:"required"`

	// The deprecation date and time (UTC) for this image.
	//
	// If absent, no deprecation date and time has been set.
	DeprecationAt *strfmt.DateTime `json:"deprecation_at,omitempty"`

	// The type of encryption used on the image.
	Encryption *string `json:"encryption" validate:"required"`

	// The key that will be used to encrypt volumes created from this image (unless an
	// alternate `encryption_key` is specified at volume creation).
	//
	// This property will be present for images with an `encryption` type of `user_managed`.
	EncryptionKey *EncryptionKeyReference `json:"encryption_key,omitempty"`

	// The metadata for the imported image file.
	File *ImageFile `json:"file" validate:"required"`

	// The URL for this image.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this image.
	ID *string `json:"id" validate:"required"`

	// The minimum size (in gigabytes) of a volume onto which this image may be provisioned.
	//
	// This property may be absent if the image has a `status` of `pending` or `failed`.
	MinimumProvisionedSize *int64 `json:"minimum_provisioned_size,omitempty"`

	// The name for this image. The name is unique across all images in the region.
	Name *string `json:"name" validate:"required"`

	// The obsolescence date and time (UTC) for this image.
	//
	// If absent, no obsolescence date and time has been set.
	ObsolescenceAt *strfmt.DateTime `json:"obsolescence_at,omitempty"`

	// The operating system included in this image.
	OperatingSystem *OperatingSystem `json:"operating_system" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *ImageRemote `json:"remote,omitempty"`

	// The resource group for this image.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The volume used to create this image (this may be
	// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
	// If absent, this image was not created from a volume.
	SourceVolume *VolumeReference `json:"source_volume,omitempty"`

	// The status of this image:
	// - available: image can be used to create resources
	// - deleting: image is being deleted, and can no longer be used to create
	//   resources
	// - deprecated: image is slated to be deleted, but can still be used to create
	//   resources
	// - failed: image was not created successfully, and cannot be used to create
	//   resources
	// - obsolete: image is slated to be deleted, and can no longer be used to create
	//   resources
	// - pending: image is being imported, and cannot yet be used to create resources
	// - unusable: image cannot be used (see `status_reasons[]` for possible remediation)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []ImageStatusReason `json:"status_reasons" validate:"required"`

	// The user data format for this image:
	// - `cloud_init`: `user_data` will be interpreted according to the cloud-init standard
	// - `esxi_kickstart`: `user_data` will be interpreted as a VMware ESXi installation script
	// - `ipxe`: `user_data` will be interpreted as a single URL to an iPXE script or as the
	//   text of an iPXE script
	//
	// The value for this property is inherited from `operating_system.user_data_format`.
	UserDataFormat *string `json:"user_data_format" validate:"required"`

	// The visibility of this image.
	// - `private`: Visible only to this account
	// - `public`: Visible to all accounts.
	Visibility *string `json:"visibility" validate:"required"`
}

// Constants associated with the Image.Encryption property.
// The type of encryption used on the image.
const (
	ImageEncryptionNoneConst        = "none"
	ImageEncryptionUserManagedConst = "user_managed"
)

// Constants associated with the Image.ResourceType property.
// The resource type.
const (
	ImageResourceTypeImageConst = "image"
)

// Constants associated with the Image.Status property.
// The status of this image:
//   - available: image can be used to create resources
//   - deleting: image is being deleted, and can no longer be used to create
//     resources
//   - deprecated: image is slated to be deleted, but can still be used to create
//     resources
//   - failed: image was not created successfully, and cannot be used to create
//     resources
//   - obsolete: image is slated to be deleted, and can no longer be used to create
//     resources
//   - pending: image is being imported, and cannot yet be used to create resources
//   - unusable: image cannot be used (see `status_reasons[]` for possible remediation)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ImageStatusAvailableConst  = "available"
	ImageStatusDeletingConst   = "deleting"
	ImageStatusDeprecatedConst = "deprecated"
	ImageStatusFailedConst     = "failed"
	ImageStatusObsoleteConst   = "obsolete"
	ImageStatusPendingConst    = "pending"
	ImageStatusUnusableConst   = "unusable"
)

// Constants associated with the Image.UserDataFormat property.
// The user data format for this image:
//   - `cloud_init`: `user_data` will be interpreted according to the cloud-init standard
//   - `esxi_kickstart`: `user_data` will be interpreted as a VMware ESXi installation script
//   - `ipxe`: `user_data` will be interpreted as a single URL to an iPXE script or as the
//     text of an iPXE script
//
// The value for this property is inherited from `operating_system.user_data_format`.
const (
	ImageUserDataFormatCloudInitConst     = "cloud_init"
	ImageUserDataFormatEsxiKickstartConst = "esxi_kickstart"
	ImageUserDataFormatIpxeConst          = "ipxe"
)

// Constants associated with the Image.Visibility property.
// The visibility of this image.
// - `private`: Visible only to this account
// - `public`: Visible to all accounts.
const (
	ImageVisibilityPrivateConst = "private"
	ImageVisibilityPublicConst  = "public"
)

// UnmarshalImage unmarshals an instance of Image from the specified map of raw messages.
func UnmarshalImage(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Image)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalImageAllowedUse)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "catalog_offering", &obj.CatalogOffering, UnmarshalImageCatalogOffering)
	if err != nil {
		err = core.SDKErrorf(err, "", "catalog_offering-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "deprecation_at", &obj.DeprecationAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "deprecation_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption", &obj.Encryption)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "file", &obj.File, UnmarshalImageFile)
	if err != nil {
		err = core.SDKErrorf(err, "", "file-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "minimum_provisioned_size", &obj.MinimumProvisionedSize)
	if err != nil {
		err = core.SDKErrorf(err, "", "minimum_provisioned_size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "obsolescence_at", &obj.ObsolescenceAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "obsolescence_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "operating_system", &obj.OperatingSystem, UnmarshalOperatingSystem)
	if err != nil {
		err = core.SDKErrorf(err, "", "operating_system-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalImageRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_volume", &obj.SourceVolume, UnmarshalVolumeReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_volume-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalImageStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_data_format", &obj.UserDataFormat)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_data_format-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "visibility", &obj.Visibility)
	if err != nil {
		err = core.SDKErrorf(err, "", "visibility-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageAllowedUse : ImageAllowedUse struct
type ImageAllowedUse struct {
	// The API version with which to evaluate the expressions.
	ApiVersion *string `json:"api_version" validate:"required"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using this image.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `BareMetalServer` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server" validate:"required"`

	// The expression that must be satisfied by the properties of a virtual server instance provisioned using this image.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `Instance` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled
	// - `gpu.count` (integer): The number of GPUs
	// - `gpu.manufacturer` (string): The GPU manufacturer
	// - `gpu.memory` (integer): The overall amount of GPU memory in GiB (gibibytes)
	// - `gpu.model` (string): The GPU model.
	Instance *string `json:"instance" validate:"required"`
}

// UnmarshalImageAllowedUse unmarshals an instance of ImageAllowedUse from the specified map of raw messages.
func UnmarshalImageAllowedUse(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageAllowedUse)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance", &obj.Instance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageAllowedUsePatch : ImageAllowedUsePatch struct
type ImageAllowedUsePatch struct {
	// The API version with which to evaluate the expressions.
	//
	// If specified, the value must be between `2019-01-01` and today's date (in UTC).
	ApiVersion *string `json:"api_version,omitempty"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using this image.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variable is supported, corresponding
	// to the `BareMetalServer` property:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server,omitempty"`

	// The expression that must be satisfied by the properties of a virtual server instance provisioned using this image.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `Instance` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled
	// - `gpu.count` (integer): The number of GPUs
	// - `gpu.manufacturer` (string): The GPU manufacturer
	// - `gpu.memory` (integer): The overall amount of GPU memory in GiB (gibibytes)
	// - `gpu.model` (string): The GPU model.
	Instance *string `json:"instance,omitempty"`
}

// UnmarshalImageAllowedUsePatch unmarshals an instance of ImageAllowedUsePatch from the specified map of raw messages.
func UnmarshalImageAllowedUsePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageAllowedUsePatch)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance", &obj.Instance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ImageAllowedUsePatch
func (imageAllowedUsePatch *ImageAllowedUsePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(imageAllowedUsePatch.ApiVersion) {
		_patch["api_version"] = imageAllowedUsePatch.ApiVersion
	}
	if !core.IsNil(imageAllowedUsePatch.BareMetalServer) {
		_patch["bare_metal_server"] = imageAllowedUsePatch.BareMetalServer
	}
	if !core.IsNil(imageAllowedUsePatch.Instance) {
		_patch["instance"] = imageAllowedUsePatch.Instance
	}

	return
}

// ImageAllowedUsePrototype : ImageAllowedUsePrototype struct
type ImageAllowedUsePrototype struct {
	// The API version with which to evaluate the expressions.
	//
	// If specified, the value must be between `2019-01-01` and today's date (in UTC). If unspecified, the `version` query
	// parameter value will be used.
	ApiVersion *string `json:"api_version,omitempty"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using this image.
	//
	// If unspecified, the expression will be set to `true`.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variable is supported, corresponding
	// to the `BareMetalServer` property:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server,omitempty"`

	// The expression that must be satisfied by the properties of a virtual server instance provisioned using this image.
	//
	// If unspecified, the expression will be set to `true`.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `Instance` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled
	// - `gpu.count` (integer): The number of GPUs
	// - `gpu.manufacturer` (string): The GPU manufacturer
	// - `gpu.memory` (integer): The overall amount of GPU memory in GiB (gibibytes)
	// - `gpu.model` (string): The GPU model.
	Instance *string `json:"instance,omitempty"`
}

// UnmarshalImageAllowedUsePrototype unmarshals an instance of ImageAllowedUsePrototype from the specified map of raw messages.
func UnmarshalImageAllowedUsePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageAllowedUsePrototype)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance", &obj.Instance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageBareMetalServerProfileCollection : ImageBareMetalServerProfileCollection struct
type ImageBareMetalServerProfileCollection struct {
	// A page of bare metal server profiles compatible with the image.
	BareMetalServerProfiles []BareMetalServerProfileReference `json:"bare_metal_server_profiles" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalImageBareMetalServerProfileCollection unmarshals an instance of ImageBareMetalServerProfileCollection from the specified map of raw messages.
func UnmarshalImageBareMetalServerProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageBareMetalServerProfileCollection)
	err = core.UnmarshalModel(m, "bare_metal_server_profiles", &obj.BareMetalServerProfiles, UnmarshalBareMetalServerProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ImageBareMetalServerProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ImageCatalogOffering : ImageCatalogOffering struct
type ImageCatalogOffering struct {
	// Indicates whether this image is managed as part of a
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering. If an image is managed,
	// accounts with access to that catalog can specify the image's catalog offering version CRN to provision virtual
	// server instances using the image.
	Managed *bool `json:"managed" validate:"required"`

	// The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user)
	// offering version associated with this image.
	//
	// If absent, this image is not associated with a cloud catalog offering.
	Version *CatalogOfferingVersionReference `json:"version,omitempty"`
}

// UnmarshalImageCatalogOffering unmarshals an instance of ImageCatalogOffering from the specified map of raw messages.
func UnmarshalImageCatalogOffering(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageCatalogOffering)
	err = core.UnmarshalPrimitive(m, "managed", &obj.Managed)
	if err != nil {
		err = core.SDKErrorf(err, "", "managed-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "version", &obj.Version, UnmarshalCatalogOfferingVersionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "version-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageCollection : ImageCollection struct
type ImageCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of images.
	Images []Image `json:"images" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalImageCollection unmarshals an instance of ImageCollection from the specified map of raw messages.
func UnmarshalImageCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "images", &obj.Images, UnmarshalImage)
	if err != nil {
		err = core.SDKErrorf(err, "", "images-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ImageCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ImageExportJob : ImageExportJob struct
type ImageExportJob struct {
	// The date and time that the image export job was completed.
	//
	// If absent, the export job has not yet completed.
	CompletedAt *strfmt.DateTime `json:"completed_at,omitempty"`

	// The date and time that the image export job was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// A base64-encoded, encrypted representation of the key that was used to encrypt the data for the exported image. This
	// key can be unwrapped with the image's `encryption_key` root key using either Key Protect or Hyper Protect Crypto
	// Services.
	//
	// If absent, the export job is for an unencrypted image.
	EncryptedDataKey *[]byte `json:"encrypted_data_key,omitempty"`

	// The format of the exported image.
	Format *string `json:"format" validate:"required"`

	// The URL for this image export job.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this image export job.
	ID *string `json:"id" validate:"required"`

	// The name for this image export job. The name must not be used by another export job for the image. Changing the name
	// will not affect the exported image name,
	// `storage_object.name`, or `storage_href` values.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The date and time that the image export job started running.
	//
	// If absent, the export job has not yet started.
	StartedAt *strfmt.DateTime `json:"started_at,omitempty"`

	// The status of this image export job:
	// - `deleting`: Export job is being deleted
	// - `failed`: Export job could not be completed successfully
	// - `queued`: Export job is queued
	// - `running`: Export job is in progress
	// - `succeeded`: Export job was completed successfully
	//
	// The exported image object is automatically deleted for `failed` jobs.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []ImageExportJobStatusReason `json:"status_reasons" validate:"required"`

	// The Cloud Object Storage bucket of the exported image object.
	StorageBucket *CloudObjectStorageBucketReference `json:"storage_bucket" validate:"required"`

	// The Cloud Object Storage location of the exported image object. The object at this location will not exist until the
	// job completes successfully. The exported image object is not managed by the IBM VPC service, and may be removed or
	// replaced with a different object by any user or service with IAM authorization to the storage bucket.
	StorageHref *string `json:"storage_href" validate:"required"`

	// The Cloud Object Storage object for the exported image. This object will not exist until
	// the job completes successfully. The exported image object is not managed by the IBM VPC
	// service, and may be removed or replaced with a different object by any user or service
	// with IAM authorization to the storage bucket.
	StorageObject *CloudObjectStorageObjectReference `json:"storage_object" validate:"required"`
}

// Constants associated with the ImageExportJob.Format property.
// The format of the exported image.
const (
	ImageExportJobFormatQcow2Const = "qcow2"
	ImageExportJobFormatVhdConst   = "vhd"
)

// Constants associated with the ImageExportJob.ResourceType property.
// The resource type.
const (
	ImageExportJobResourceTypeImageExportJobConst = "image_export_job"
)

// Constants associated with the ImageExportJob.Status property.
// The status of this image export job:
// - `deleting`: Export job is being deleted
// - `failed`: Export job could not be completed successfully
// - `queued`: Export job is queued
// - `running`: Export job is in progress
// - `succeeded`: Export job was completed successfully
//
// The exported image object is automatically deleted for `failed` jobs.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ImageExportJobStatusDeletingConst  = "deleting"
	ImageExportJobStatusFailedConst    = "failed"
	ImageExportJobStatusQueuedConst    = "queued"
	ImageExportJobStatusRunningConst   = "running"
	ImageExportJobStatusSucceededConst = "succeeded"
)

// UnmarshalImageExportJob unmarshals an instance of ImageExportJob from the specified map of raw messages.
func UnmarshalImageExportJob(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageExportJob)
	err = core.UnmarshalPrimitive(m, "completed_at", &obj.CompletedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "completed_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encrypted_data_key", &obj.EncryptedDataKey)
	if err != nil {
		err = core.SDKErrorf(err, "", "encrypted_data_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "format", &obj.Format)
	if err != nil {
		err = core.SDKErrorf(err, "", "format-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "started_at", &obj.StartedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "started_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalImageExportJobStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "storage_bucket", &obj.StorageBucket, UnmarshalCloudObjectStorageBucketReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "storage_bucket-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "storage_href", &obj.StorageHref)
	if err != nil {
		err = core.SDKErrorf(err, "", "storage_href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "storage_object", &obj.StorageObject, UnmarshalCloudObjectStorageObjectReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "storage_object-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageExportJobPatch : ImageExportJobPatch struct
type ImageExportJobPatch struct {
	// The name for this image export job. The name must not be used by another export job for the image. Changing the name
	// will not affect the exported image name,
	// `storage_object.name`, or `storage_href` values.
	Name *string `json:"name,omitempty"`
}

// UnmarshalImageExportJobPatch unmarshals an instance of ImageExportJobPatch from the specified map of raw messages.
func UnmarshalImageExportJobPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageExportJobPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ImageExportJobPatch
func (imageExportJobPatch *ImageExportJobPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(imageExportJobPatch.Name) {
		_patch["name"] = imageExportJobPatch.Name
	}

	return
}

// ImageExportJobStatusReason : ImageExportJobStatusReason struct
type ImageExportJobStatusReason struct {
	// A snake case string succinctly identifying the status reason.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ImageExportJobStatusReason.Code property.
// A snake case string succinctly identifying the status reason.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ImageExportJobStatusReasonCodeCannotAccessStorageBucketConst = "cannot_access_storage_bucket"
	ImageExportJobStatusReasonCodeInternalErrorConst             = "internal_error"
)

// UnmarshalImageExportJobStatusReason unmarshals an instance of ImageExportJobStatusReason from the specified map of raw messages.
func UnmarshalImageExportJobStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageExportJobStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageExportJobUnpaginatedCollection : ImageExportJobUnpaginatedCollection struct
type ImageExportJobUnpaginatedCollection struct {
	// The export jobs for the image.
	ExportJobs []ImageExportJob `json:"export_jobs" validate:"required"`
}

// UnmarshalImageExportJobUnpaginatedCollection unmarshals an instance of ImageExportJobUnpaginatedCollection from the specified map of raw messages.
func UnmarshalImageExportJobUnpaginatedCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageExportJobUnpaginatedCollection)
	err = core.UnmarshalModel(m, "export_jobs", &obj.ExportJobs, UnmarshalImageExportJob)
	if err != nil {
		err = core.SDKErrorf(err, "", "export_jobs-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageFile : ImageFile struct
type ImageFile struct {
	// The checksums for the imported image file.
	//
	// This property may be absent if the associated image has a `status` of `pending` or
	// `failed`.
	Checksums *ImageFileChecksums `json:"checksums,omitempty"`

	// The size of the imported image file, rounded up to the next gigabyte.
	//
	// This property may be absent if the associated image has a `status` of `pending` or
	// `failed`.
	Size *int64 `json:"size,omitempty"`
}

// UnmarshalImageFile unmarshals an instance of ImageFile from the specified map of raw messages.
func UnmarshalImageFile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageFile)
	err = core.UnmarshalModel(m, "checksums", &obj.Checksums, UnmarshalImageFileChecksums)
	if err != nil {
		err = core.SDKErrorf(err, "", "checksums-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageFileChecksums : ImageFileChecksums struct
type ImageFileChecksums struct {
	// The SHA256 fingerprint of the image file, in hexadecimal.
	Sha256 *string `json:"sha256,omitempty"`
}

// UnmarshalImageFileChecksums unmarshals an instance of ImageFileChecksums from the specified map of raw messages.
func UnmarshalImageFileChecksums(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageFileChecksums)
	err = core.UnmarshalPrimitive(m, "sha256", &obj.Sha256)
	if err != nil {
		err = core.SDKErrorf(err, "", "sha256-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageFilePrototype : ImageFilePrototype struct
type ImageFilePrototype struct {
	// The Cloud Object Storage location of the image file.
	//
	// The image file format is specified by the file's extension, which must be either
	// `qcow2` or `vhd`.
	Href *string `json:"href" validate:"required"`
}

// NewImageFilePrototype : Instantiate ImageFilePrototype (Generic Model Constructor)
func (*VpcV1) NewImageFilePrototype(href string) (_model *ImageFilePrototype, err error) {
	_model = &ImageFilePrototype{
		Href: core.StringPtr(href),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalImageFilePrototype unmarshals an instance of ImageFilePrototype from the specified map of raw messages.
func UnmarshalImageFilePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageFilePrototype)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageIdentity : Identifies an image by a unique property.
// Models which "extend" this model:
// - ImageIdentityByID
// - ImageIdentityByCRN
// - ImageIdentityByHref
type ImageIdentity struct {
	// The unique identifier for this image.
	ID *string `json:"id,omitempty"`

	// The CRN for this image.
	CRN *string `json:"crn,omitempty"`

	// The URL for this image.
	Href *string `json:"href,omitempty"`
}

func (*ImageIdentity) isaImageIdentity() bool {
	return true
}

type ImageIdentityIntf interface {
	isaImageIdentity() bool
}

// UnmarshalImageIdentity unmarshals an instance of ImageIdentity from the specified map of raw messages.
func UnmarshalImageIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageInstanceProfileCollection : ImageInstanceProfileCollection struct
type ImageInstanceProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of instance profiles compatible with the image.
	InstanceProfiles []InstanceProfileReference `json:"instance_profiles" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalImageInstanceProfileCollection unmarshals an instance of ImageInstanceProfileCollection from the specified map of raw messages.
func UnmarshalImageInstanceProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageInstanceProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_profiles", &obj.InstanceProfiles, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ImageInstanceProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ImagePatch : ImagePatch struct
type ImagePatch struct {
	// The usage constraints to be matched against the requested instance or bare metal server
	// properties to determine compatibility.
	AllowedUse *ImageAllowedUsePatch `json:"allowed_use,omitempty"`

	// The deprecation date and time to set for this image.
	//
	// This cannot be set if the image has a `status` of `failed` or `deleting`, or if
	// `catalog_offering.managed` is `true`.
	//
	// The date and time must not be in the past, and must be earlier than `obsolescence_at`
	// (if `obsolescence_at` is set). Additionally, if the image status is currently
	// `deprecated`, the value cannot be changed (but may be removed).
	//
	// Specify `null` to remove an existing deprecation date and time. If the image status is currently `deprecated`, it
	// will become `available`.
	//
	// If the deprecation date and time is reached while the image has a status of `pending`, the image's status will
	// transition to `deprecated` upon its successful creation (or
	// `obsolete` if the obsolescence date and time was also reached).
	DeprecationAt *strfmt.DateTime `json:"deprecation_at,omitempty"`

	// The name for this image. The name must not be used by another image in the region. Names starting with `ibm-` are
	// reserved for system-provided images, and are not allowed.
	Name *string `json:"name,omitempty"`

	// The obsolescence date and time to set for this image.
	//
	// This cannot be set if the image has a `status` of `failed` or `deleting`, or if
	// `catalog_offering.managed` is `true`.
	//
	// The date and time must not be in the past, and must be later than `deprecation_at` (if
	// `deprecation_at` is set). Additionally, if the image status is currently `obsolete`, the value cannot be changed
	// (but may be removed).
	//
	// Specify `null` to remove an existing obsolescence date and time. If the image status is currently `obsolete`, it
	// will become `deprecated` if `deprecation_at` is in the past. Otherwise, it will become `available`.
	//
	// If the obsolescence date and time is reached while the image has a status of `pending`, the image's status will
	// transition to `obsolete` upon its successful creation.
	ObsolescenceAt *strfmt.DateTime `json:"obsolescence_at,omitempty"`
}

// UnmarshalImagePatch unmarshals an instance of ImagePatch from the specified map of raw messages.
func UnmarshalImagePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImagePatch)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalImageAllowedUsePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "deprecation_at", &obj.DeprecationAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "deprecation_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "obsolescence_at", &obj.ObsolescenceAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "obsolescence_at-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ImagePatch
func (imagePatch *ImagePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(imagePatch.AllowedUse) {
		_patch["allowed_use"] = imagePatch.AllowedUse.asPatch()
	}
	if !core.IsNil(imagePatch.DeprecationAt) {
		_patch["deprecation_at"] = imagePatch.DeprecationAt
	}
	if !core.IsNil(imagePatch.Name) {
		_patch["name"] = imagePatch.Name
	}
	if !core.IsNil(imagePatch.ObsolescenceAt) {
		_patch["obsolescence_at"] = imagePatch.ObsolescenceAt
	}

	return
}

// ImagePrototype : ImagePrototype struct
// Models which "extend" this model:
// - ImagePrototypeImageByFile
// - ImagePrototypeImageBySourceVolume
type ImagePrototype struct {
	// The usage constraints to match against the requested instance or bare metal server
	// properties to determine compatibility.
	AllowedUse *ImageAllowedUsePrototype `json:"allowed_use,omitempty"`

	// The deprecation date and time to set for this image.
	//
	// The date and time must not be in the past, and must be earlier than `obsolescence_at`
	// (if `obsolescence_at` is set).
	//
	// If unspecified, no deprecation date and time will be set.
	//
	// If the deprecation date and time is reached while the image has a status of `pending`, the image's status will
	// transition to `deprecated` upon its successful creation (or
	// `obsolete` if the obsolescence date and time was also reached).
	DeprecationAt *strfmt.DateTime `json:"deprecation_at,omitempty"`

	// The name for this image. The name must not be used by another image in the region. Names starting with `ibm-` are
	// reserved for system-provided images, and are not allowed. If unspecified, the name will be a hyphenated list of
	// randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The obsolescence date and time to set for this image.
	//
	// The date and time must not be in the past, and must be later than `deprecation_at` (if
	// `deprecation_at` is set).
	//
	// If unspecified, no obsolescence date and time will be set.
	//
	// If the obsolescence date and time is reached while the image has a status of
	// `pending`, the image's status will transition to `obsolete` upon its successful creation.
	ObsolescenceAt *strfmt.DateTime `json:"obsolescence_at,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// A base64-encoded, encrypted representation of the key that was used to encrypt the data for this image.
	//
	// That representation is created by wrapping the key's value with the `encryption_key` root key (which must also be
	// specified), using either [Key Protect](https://cloud.ibm.com/docs/key-protect?topic=key-protect-wrap-keys) or the
	// [Hyper Protect Crypto Services](https://cloud.ibm.com/docs/services/hs-crypto?topic=hs-crypto-wrap-keys).
	//
	// If unspecified, the imported image is treated as unencrypted.
	EncryptedDataKey *string `json:"encrypted_data_key,omitempty"`

	// The root key that was used to wrap the data key (which is ultimately represented as
	// `encrypted_data_key`). Additionally, the root key will be used to encrypt volumes
	// created from this image (unless an alternate `encryption_key` is specified at volume
	// creation).
	//
	// If unspecified, the imported image is treated as unencrypted.
	EncryptionKey EncryptionKeyIdentityIntf `json:"encryption_key,omitempty"`

	// The file from which to create the image.
	File *ImageFilePrototype `json:"file,omitempty"`

	// The [supported operating
	// system](https://cloud.ibm.com/apidocs/vpc#list-operating-systems) included in this
	// image.
	OperatingSystem OperatingSystemIdentityIntf `json:"operating_system,omitempty"`

	// The volume from which to create the image. The specified volume must:
	// - Have an `operating_system`, which will be used to populate this image's
	//   operating system information.
	// - Not be `active` or `busy`.
	//
	// During image creation, the specified volume may briefly become `busy`.
	SourceVolume VolumeIdentityIntf `json:"source_volume,omitempty"`
}

func (*ImagePrototype) isaImagePrototype() bool {
	return true
}

type ImagePrototypeIntf interface {
	isaImagePrototype() bool
}

// UnmarshalImagePrototype unmarshals an instance of ImagePrototype from the specified map of raw messages.
func UnmarshalImagePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImagePrototype)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalImageAllowedUsePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "deprecation_at", &obj.DeprecationAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "deprecation_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "obsolescence_at", &obj.ObsolescenceAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "obsolescence_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encrypted_data_key", &obj.EncryptedDataKey)
	if err != nil {
		err = core.SDKErrorf(err, "", "encrypted_data_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "file", &obj.File, UnmarshalImageFilePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "file-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "operating_system", &obj.OperatingSystem, UnmarshalOperatingSystemIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "operating_system-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_volume", &obj.SourceVolume, UnmarshalVolumeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_volume-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageReference : ImageReference struct
type ImageReference struct {
	// The CRN for this image.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this image.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this image.
	ID *string `json:"id" validate:"required"`

	// The name for this image. The name is unique across all images in the region.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *ImageRemoteContextImageReference `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ImageReference.ResourceType property.
// The resource type.
const (
	ImageReferenceResourceTypeImageConst = "image"
)

// UnmarshalImageReference unmarshals an instance of ImageReference from the specified map of raw messages.
func UnmarshalImageReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalImageRemoteContextImageReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type ImageRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`
}

// UnmarshalImageRemote unmarshals an instance of ImageRemote from the specified map of raw messages.
func UnmarshalImageRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageRemote)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageRemoteContextImageReference : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type ImageRemoteContextImageReference struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`

	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalImageRemoteContextImageReference unmarshals an instance of ImageRemoteContextImageReference from the specified map of raw messages.
func UnmarshalImageRemoteContextImageReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageRemoteContextImageReference)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ImageStatusReason : ImageStatusReason struct
type ImageStatusReason struct {
	// A reason code for the status:
	// - `encrypted_data_key_invalid`: image cannot be decrypted with the specified
	//   `encryption_key`
	// - `encryption_key_deleted`: image unusable because its `encryption_key` was deleted
	// - `encryption_key_disabled`: image unusable until its `encryption_key` is re-enabled
	// - `image_data_corrupted`: image data is corrupt, or is not in the specified format
	// - `image_provisioned_size_unsupported`: image requires a boot volume size greater
	//   than the maximum supported value
	// - `image_request_in_progress`: image operation is in progress (such as an import from
	//    Cloud Object Storage)
	// - `image_request_queued`: image request has been accepted but the requested
	//   operation has not started
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ImageStatusReason.Code property.
// A reason code for the status:
//   - `encrypted_data_key_invalid`: image cannot be decrypted with the specified
//     `encryption_key`
//   - `encryption_key_deleted`: image unusable because its `encryption_key` was deleted
//   - `encryption_key_disabled`: image unusable until its `encryption_key` is re-enabled
//   - `image_data_corrupted`: image data is corrupt, or is not in the specified format
//   - `image_provisioned_size_unsupported`: image requires a boot volume size greater
//     than the maximum supported value
//   - `image_request_in_progress`: image operation is in progress (such as an import from
//     Cloud Object Storage)
//   - `image_request_queued`: image request has been accepted but the requested
//     operation has not started
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ImageStatusReasonCodeEncryptedDataKeyInvalidConst         = "encrypted_data_key_invalid"
	ImageStatusReasonCodeEncryptionKeyDeletedConst            = "encryption_key_deleted"
	ImageStatusReasonCodeEncryptionKeyDisabledConst           = "encryption_key_disabled"
	ImageStatusReasonCodeImageDataCorruptedConst              = "image_data_corrupted"
	ImageStatusReasonCodeImageProvisionedSizeUnsupportedConst = "image_provisioned_size_unsupported"
	ImageStatusReasonCodeImageRequestInProgressConst          = "image_request_in_progress"
	ImageStatusReasonCodeImageRequestQueuedConst              = "image_request_queued"
)

// UnmarshalImageStatusReason unmarshals an instance of ImageStatusReason from the specified map of raw messages.
func UnmarshalImageStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ImageStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Instance : Instance struct
type Instance struct {
	// The availability policy for this virtual server instance.
	AvailabilityPolicy *InstanceAvailabilityPolicy `json:"availability_policy" validate:"required"`

	// The total bandwidth (in megabits per second) shared across the instance network attachments or instance network
	// interfaces and storage volumes of the virtual server instance.
	Bandwidth *int64 `json:"bandwidth" validate:"required"`

	// The boot volume attachment for this virtual server instance.
	BootVolumeAttachment *VolumeAttachmentReferenceInstanceContext `json:"boot_volume_attachment" validate:"required"`

	// If present, this virtual server instance was provisioned from a
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user).
	CatalogOffering *InstanceCatalogOffering `json:"catalog_offering,omitempty"`

	// If present, the cluster network that this virtual server instance resides in.
	ClusterNetwork *ClusterNetworkReference `json:"cluster_network,omitempty"`

	// The cluster network attachments for this virtual server instance.
	//
	// The cluster network attachments are ordered for consistent instance configuration.
	ClusterNetworkAttachments []InstanceClusterNetworkAttachmentReference `json:"cluster_network_attachments" validate:"required"`

	// The confidential compute mode for this virtual server instance.
	ConfidentialComputeMode *string `json:"confidential_compute_mode" validate:"required"`

	// The date and time that the virtual server instance was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this virtual server instance.
	CRN *string `json:"crn" validate:"required"`

	// If present, the dedicated host this virtual server instance has been placed on.
	DedicatedHost *DedicatedHostReference `json:"dedicated_host,omitempty"`

	// The instance disks for this virtual server instance.
	Disks []InstanceDisk `json:"disks" validate:"required"`

	// Indicates whether secure boot is enabled for this virtual server instance.
	EnableSecureBoot *bool `json:"enable_secure_boot" validate:"required"`

	// The virtual server instance GPU configuration.
	Gpu *InstanceGpu `json:"gpu,omitempty"`

	// The reasons for the current `health_state` (if any).
	HealthReasons []InstanceHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this virtual server instance.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this virtual server instance.
	ID *string `json:"id" validate:"required"`

	// The image the virtual server instance was provisioned from.
	Image *ImageReference `json:"image,omitempty"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []InstanceLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the virtual server instance.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The amount of memory, truncated to whole gibibytes.
	//
	// The maximum limit for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Memory *int64 `json:"memory" validate:"required"`

	// The metadata service configuration.
	MetadataService *InstanceMetadataService `json:"metadata_service" validate:"required"`

	// The name for this virtual server instance. The name is unique across all virtual server instances in the region.
	Name *string `json:"name" validate:"required"`

	// The network attachments for this virtual server instance, including the primary network attachment.
	NetworkAttachments []InstanceNetworkAttachmentReference `json:"network_attachments" validate:"required"`

	// The network interfaces for this instance, including the primary network interface.
	//
	// If this instance has network attachments, each network interface is a [read-only
	// representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its corresponding network
	// attachment and its attached virtual network interface.
	NetworkInterfaces []NetworkInterfaceInstanceContextReference `json:"network_interfaces" validate:"required"`

	// The number of NUMA nodes this virtual server instance is provisioned on.
	//
	// This property will be absent if the instance's `status` is not `running`.
	NumaCount *int64 `json:"numa_count,omitempty"`

	// The placement restrictions for the virtual server instance.
	PlacementTarget InstancePlacementTargetIntf `json:"placement_target,omitempty"`

	// The primary network attachment for this virtual server instance.
	PrimaryNetworkAttachment *InstanceNetworkAttachmentReference `json:"primary_network_attachment,omitempty"`

	// The primary network interface for this virtual server instance.
	//
	// If this instance has network attachments, this primary network interface is a
	// [read-only
	// representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients)
	// of the primary network attachment and its attached virtual network interface.
	PrimaryNetworkInterface *NetworkInterfaceInstanceContextReference `json:"primary_network_interface" validate:"required"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) for this virtual
	// server instance.
	Profile *InstanceProfileReference `json:"profile" validate:"required"`

	// The reservation used by this virtual server instance.
	//
	// If absent, no reservation is in use.
	Reservation *ReservationReference `json:"reservation,omitempty"`

	ReservationAffinity *InstanceReservationAffinity `json:"reservation_affinity" validate:"required"`

	// The resource group for this instance.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// Indicates whether the state of the virtual server instance permits a start request.
	Startable *bool `json:"startable" validate:"required"`

	// The status of the virtual server instance.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []InstanceStatusReason `json:"status_reasons" validate:"required"`

	// The amount of bandwidth (in megabits per second) allocated exclusively to instance network attachments or instance
	// network interfaces.
	TotalNetworkBandwidth *int64 `json:"total_network_bandwidth" validate:"required"`

	// The amount of bandwidth (in megabits per second) allocated exclusively to instance storage volumes. An increase in
	// this value will result in a corresponding decrease to
	// `total_network_bandwidth`.
	TotalVolumeBandwidth *int64 `json:"total_volume_bandwidth" validate:"required"`

	// The virtual server instance VCPU configuration.
	Vcpu *InstanceVcpu `json:"vcpu" validate:"required"`

	// The volume attachments for this virtual server instance, including the boot volume attachment.
	VolumeAttachments []VolumeAttachmentReferenceInstanceContext `json:"volume_attachments" validate:"required"`

	// The VPC this virtual server instance resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The zone this virtual server instance resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the Instance.ConfidentialComputeMode property.
// The confidential compute mode for this virtual server instance.
const (
	InstanceConfidentialComputeModeDisabledConst = "disabled"
	InstanceConfidentialComputeModeSgxConst      = "sgx"
	InstanceConfidentialComputeModeTdxConst      = "tdx"
)

// Constants associated with the Instance.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	InstanceHealthStateDegradedConst     = "degraded"
	InstanceHealthStateFaultedConst      = "faulted"
	InstanceHealthStateInapplicableConst = "inapplicable"
	InstanceHealthStateOkConst           = "ok"
)

// Constants associated with the Instance.LifecycleState property.
// The lifecycle state of the virtual server instance.
const (
	InstanceLifecycleStateDeletingConst  = "deleting"
	InstanceLifecycleStateFailedConst    = "failed"
	InstanceLifecycleStatePendingConst   = "pending"
	InstanceLifecycleStateStableConst    = "stable"
	InstanceLifecycleStateSuspendedConst = "suspended"
	InstanceLifecycleStateUpdatingConst  = "updating"
	InstanceLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the Instance.ResourceType property.
// The resource type.
const (
	InstanceResourceTypeInstanceConst = "instance"
)

// Constants associated with the Instance.Status property.
// The status of the virtual server instance.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceStatusDeletingConst   = "deleting"
	InstanceStatusFailedConst     = "failed"
	InstanceStatusPendingConst    = "pending"
	InstanceStatusRestartingConst = "restarting"
	InstanceStatusRunningConst    = "running"
	InstanceStatusStartingConst   = "starting"
	InstanceStatusStoppedConst    = "stopped"
	InstanceStatusStoppingConst   = "stopping"
)

// UnmarshalInstance unmarshals an instance of Instance from the specified map of raw messages.
func UnmarshalInstance(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Instance)
	err = core.UnmarshalModel(m, "availability_policy", &obj.AvailabilityPolicy, UnmarshalInstanceAvailabilityPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "availability_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bandwidth", &obj.Bandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "boot_volume_attachment", &obj.BootVolumeAttachment, UnmarshalVolumeAttachmentReferenceInstanceContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "boot_volume_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "catalog_offering", &obj.CatalogOffering, UnmarshalInstanceCatalogOffering)
	if err != nil {
		err = core.SDKErrorf(err, "", "catalog_offering-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cluster_network", &obj.ClusterNetwork, UnmarshalClusterNetworkReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cluster_network_attachments", &obj.ClusterNetworkAttachments, UnmarshalInstanceClusterNetworkAttachmentReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "confidential_compute_mode", &obj.ConfidentialComputeMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "confidential_compute_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "dedicated_host", &obj.DedicatedHost, UnmarshalDedicatedHostReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "dedicated_host-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalInstanceDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "gpu", &obj.Gpu, UnmarshalInstanceGpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "gpu-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalInstanceHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "image", &obj.Image, UnmarshalImageReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "image-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalInstanceLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "memory", &obj.Memory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "metadata_service", &obj.MetadataService, UnmarshalInstanceMetadataService)
	if err != nil {
		err = core.SDKErrorf(err, "", "metadata_service-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalInstanceNetworkAttachmentReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalNetworkInterfaceInstanceContextReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "numa_count", &obj.NumaCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "numa_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "placement_target", &obj.PlacementTarget, UnmarshalInstancePlacementTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "placement_target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_attachment", &obj.PrimaryNetworkAttachment, UnmarshalInstanceNetworkAttachmentReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_interface", &obj.PrimaryNetworkInterface, UnmarshalNetworkInterfaceInstanceContextReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation", &obj.Reservation, UnmarshalReservationReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalInstanceReservationAffinity)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "startable", &obj.Startable)
	if err != nil {
		err = core.SDKErrorf(err, "", "startable-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalInstanceStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_network_bandwidth", &obj.TotalNetworkBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_network_bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_volume_bandwidth", &obj.TotalVolumeBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_volume_bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu", &obj.Vcpu, UnmarshalInstanceVcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "volume_attachments", &obj.VolumeAttachments, UnmarshalVolumeAttachmentReferenceInstanceContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "volume_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceAction : InstanceAction struct
type InstanceAction struct {
	// The date and time that the action was completed.
	// Deprecated: this field is deprecated and may be removed in a future release.
	CompletedAt *strfmt.DateTime `json:"completed_at,omitempty"`

	// The date and time that the action was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// If set to true, the action will be forced immediately, and all queued actions deleted. Ignored for the start action.
	Force *bool `json:"force,omitempty"`

	// The URL for this instance action.
	// Deprecated: this field is deprecated and may be removed in a future release.
	Href *string `json:"href" validate:"required"`

	// The identifier for this instance action.
	// Deprecated: this field is deprecated and may be removed in a future release.
	ID *string `json:"id" validate:"required"`

	// The date and time that the action was started.
	// Deprecated: this field is deprecated and may be removed in a future release.
	StartedAt *strfmt.DateTime `json:"started_at,omitempty"`

	// The current status of this action.
	// Deprecated: this field is deprecated and may be removed in a future release.
	Status *string `json:"status" validate:"required"`

	// The type of action.
	Type *string `json:"type" validate:"required"`
}

// Constants associated with the InstanceAction.Status property.
// The current status of this action.
const (
	InstanceActionStatusCompletedConst = "completed"
	InstanceActionStatusFailedConst    = "failed"
	InstanceActionStatusPendingConst   = "pending"
	InstanceActionStatusRunningConst   = "running"
)

// Constants associated with the InstanceAction.Type property.
// The type of action.
const (
	InstanceActionTypeRebootConst = "reboot"
	InstanceActionTypeStartConst  = "start"
	InstanceActionTypeStopConst   = "stop"
)

// UnmarshalInstanceAction unmarshals an instance of InstanceAction from the specified map of raw messages.
func UnmarshalInstanceAction(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceAction)
	err = core.UnmarshalPrimitive(m, "completed_at", &obj.CompletedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "completed_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "force", &obj.Force)
	if err != nil {
		err = core.SDKErrorf(err, "", "force-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "started_at", &obj.StartedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "started_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceAvailabilityPolicy : InstanceAvailabilityPolicy struct
type InstanceAvailabilityPolicy struct {
	// The action to perform if the compute host experiences a failure:
	// - `restart`: Automatically restart the virtual server instance after host failure
	// - `stop`: Leave the virtual server instance stopped after host failure
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	HostFailure *string `json:"host_failure" validate:"required"`
}

// Constants associated with the InstanceAvailabilityPolicy.HostFailure property.
// The action to perform if the compute host experiences a failure:
// - `restart`: Automatically restart the virtual server instance after host failure
// - `stop`: Leave the virtual server instance stopped after host failure
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceAvailabilityPolicyHostFailureRestartConst = "restart"
	InstanceAvailabilityPolicyHostFailureStopConst    = "stop"
)

// UnmarshalInstanceAvailabilityPolicy unmarshals an instance of InstanceAvailabilityPolicy from the specified map of raw messages.
func UnmarshalInstanceAvailabilityPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceAvailabilityPolicy)
	err = core.UnmarshalPrimitive(m, "host_failure", &obj.HostFailure)
	if err != nil {
		err = core.SDKErrorf(err, "", "host_failure-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceAvailabilityPolicyPatch : InstanceAvailabilityPolicyPatch struct
type InstanceAvailabilityPolicyPatch struct {
	// The action to perform if the compute host experiences a failure.
	// - `restart`: Automatically restart the virtual server instance after host failure
	// - `stop`: Leave the virtual server instance stopped after host failure.
	HostFailure *string `json:"host_failure,omitempty"`
}

// Constants associated with the InstanceAvailabilityPolicyPatch.HostFailure property.
// The action to perform if the compute host experiences a failure.
// - `restart`: Automatically restart the virtual server instance after host failure
// - `stop`: Leave the virtual server instance stopped after host failure.
const (
	InstanceAvailabilityPolicyPatchHostFailureRestartConst = "restart"
	InstanceAvailabilityPolicyPatchHostFailureStopConst    = "stop"
)

// UnmarshalInstanceAvailabilityPolicyPatch unmarshals an instance of InstanceAvailabilityPolicyPatch from the specified map of raw messages.
func UnmarshalInstanceAvailabilityPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceAvailabilityPolicyPatch)
	err = core.UnmarshalPrimitive(m, "host_failure", &obj.HostFailure)
	if err != nil {
		err = core.SDKErrorf(err, "", "host_failure-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstanceAvailabilityPolicyPatch
func (instanceAvailabilityPolicyPatch *InstanceAvailabilityPolicyPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceAvailabilityPolicyPatch.HostFailure) {
		_patch["host_failure"] = instanceAvailabilityPolicyPatch.HostFailure
	}

	return
}

// InstanceAvailabilityPolicyPrototype : InstanceAvailabilityPolicyPrototype struct
type InstanceAvailabilityPolicyPrototype struct {
	// The action to perform if the compute host experiences a failure.
	// - `restart`: Automatically restart the virtual server instance after host failure
	// - `stop`: Leave the virtual server instance stopped after host failure.
	HostFailure *string `json:"host_failure,omitempty"`
}

// Constants associated with the InstanceAvailabilityPolicyPrototype.HostFailure property.
// The action to perform if the compute host experiences a failure.
// - `restart`: Automatically restart the virtual server instance after host failure
// - `stop`: Leave the virtual server instance stopped after host failure.
const (
	InstanceAvailabilityPolicyPrototypeHostFailureRestartConst = "restart"
	InstanceAvailabilityPolicyPrototypeHostFailureStopConst    = "stop"
)

// UnmarshalInstanceAvailabilityPolicyPrototype unmarshals an instance of InstanceAvailabilityPolicyPrototype from the specified map of raw messages.
func UnmarshalInstanceAvailabilityPolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceAvailabilityPolicyPrototype)
	err = core.UnmarshalPrimitive(m, "host_failure", &obj.HostFailure)
	if err != nil {
		err = core.SDKErrorf(err, "", "host_failure-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceCatalogOffering : InstanceCatalogOffering struct
type InstanceCatalogOffering struct {
	// The billing plan used for the catalog offering version.
	//
	// If absent, no billing plan is in use (free).
	Plan *CatalogOfferingVersionPlanReference `json:"plan,omitempty"`

	// The catalog offering version this virtual server instance was provisioned from.
	//
	// The catalog offering version is not managed by the IBM VPC service, and may no longer
	// exist, or may refer to a different image CRN than the `image.crn` for this virtual
	// server instance. However, all images associated with a catalog offering version will
	// have the same checksum, and therefore will have the same data.
	Version *CatalogOfferingVersionReference `json:"version" validate:"required"`
}

// UnmarshalInstanceCatalogOffering unmarshals an instance of InstanceCatalogOffering from the specified map of raw messages.
func UnmarshalInstanceCatalogOffering(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceCatalogOffering)
	err = core.UnmarshalModel(m, "plan", &obj.Plan, UnmarshalCatalogOfferingVersionPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "version", &obj.Version, UnmarshalCatalogOfferingVersionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "version-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceCatalogOfferingPrototype : The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering or offering version to use
// when provisioning this virtual server instance.
//
// If an offering is specified, the latest version of that offering will be used.
//
// The specified offering or offering version may be in a different account, subject to IAM policies.
// Models which "extend" this model:
// - InstanceCatalogOfferingPrototypeCatalogOfferingByOffering
// - InstanceCatalogOfferingPrototypeCatalogOfferingByVersion
type InstanceCatalogOfferingPrototype struct {
	// The billing plan to use for the catalog offering version. If unspecified, no billing
	// plan will be used (free). Must be specified for catalog offering versions that require
	// a billing plan to be used.
	Plan CatalogOfferingVersionPlanIdentityIntf `json:"plan,omitempty"`

	// Identifies a [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user)
	// offering by a unique property.
	Offering CatalogOfferingIdentityIntf `json:"offering,omitempty"`

	// Identifies a version of a
	// [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering by a
	// unique property.
	Version CatalogOfferingVersionIdentityIntf `json:"version,omitempty"`
}

func (*InstanceCatalogOfferingPrototype) isaInstanceCatalogOfferingPrototype() bool {
	return true
}

type InstanceCatalogOfferingPrototypeIntf interface {
	isaInstanceCatalogOfferingPrototype() bool
}

// UnmarshalInstanceCatalogOfferingPrototype unmarshals an instance of InstanceCatalogOfferingPrototype from the specified map of raw messages.
func UnmarshalInstanceCatalogOfferingPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceCatalogOfferingPrototype)
	err = core.UnmarshalModel(m, "plan", &obj.Plan, UnmarshalCatalogOfferingVersionPlanIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "offering", &obj.Offering, UnmarshalCatalogOfferingIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "offering-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "version", &obj.Version, UnmarshalCatalogOfferingVersionIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "version-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachment : InstanceClusterNetworkAttachment struct
type InstanceClusterNetworkAttachment struct {
	// The instance cluster network attachment that is immediately before. If absent, this is the
	// last instance cluster network attachment.
	Before *InstanceClusterNetworkAttachmentBefore `json:"before,omitempty"`

	// The cluster network interface for this instance cluster network attachment.
	ClusterNetworkInterface *ClusterNetworkInterfaceReference `json:"cluster_network_interface" validate:"required"`

	// The URL for this instance cluster network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance cluster network attachment.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []InstanceClusterNetworkAttachmentLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the instance cluster network attachment.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this instance cluster network attachment. The name is unique across all network attachments for the
	// instance.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the InstanceClusterNetworkAttachment.LifecycleState property.
// The lifecycle state of the instance cluster network attachment.
const (
	InstanceClusterNetworkAttachmentLifecycleStateDeletingConst  = "deleting"
	InstanceClusterNetworkAttachmentLifecycleStateFailedConst    = "failed"
	InstanceClusterNetworkAttachmentLifecycleStatePendingConst   = "pending"
	InstanceClusterNetworkAttachmentLifecycleStateStableConst    = "stable"
	InstanceClusterNetworkAttachmentLifecycleStateSuspendedConst = "suspended"
	InstanceClusterNetworkAttachmentLifecycleStateUpdatingConst  = "updating"
	InstanceClusterNetworkAttachmentLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the InstanceClusterNetworkAttachment.ResourceType property.
// The resource type.
const (
	InstanceClusterNetworkAttachmentResourceTypeInstanceClusterNetworkAttachmentConst = "instance_cluster_network_attachment"
)

// UnmarshalInstanceClusterNetworkAttachment unmarshals an instance of InstanceClusterNetworkAttachment from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachment(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachment)
	err = core.UnmarshalModel(m, "before", &obj.Before, UnmarshalInstanceClusterNetworkAttachmentBefore)
	if err != nil {
		err = core.SDKErrorf(err, "", "before-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cluster_network_interface", &obj.ClusterNetworkInterface, UnmarshalClusterNetworkInterfaceReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalInstanceClusterNetworkAttachmentLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachmentBefore : The instance cluster network attachment that is immediately before. If absent, this is the last instance cluster
// network attachment.
type InstanceClusterNetworkAttachmentBefore struct {
	// The URL for this instance cluster network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance cluster network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this instance cluster network attachment. The name is unique across all network attachments for the
	// instance.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the InstanceClusterNetworkAttachmentBefore.ResourceType property.
// The resource type.
const (
	InstanceClusterNetworkAttachmentBeforeResourceTypeInstanceClusterNetworkAttachmentConst = "instance_cluster_network_attachment"
)

// UnmarshalInstanceClusterNetworkAttachmentBefore unmarshals an instance of InstanceClusterNetworkAttachmentBefore from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentBefore(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentBefore)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachmentBeforePrototype : The instance cluster network attachment to insert this instance cluster network attachment immediately before.
//
// If unspecified, this instance cluster network attachment will be inserted after all existing instance cluster network
// attachments.
// Models which "extend" this model:
// - InstanceClusterNetworkAttachmentBeforePrototypeInstanceClusterNetworkAttachmentIdentityByID
// - InstanceClusterNetworkAttachmentBeforePrototypeInstanceClusterNetworkAttachmentIdentityByHref
type InstanceClusterNetworkAttachmentBeforePrototype struct {
	// The unique identifier for this instance cluster network attachment.
	ID *string `json:"id,omitempty"`

	// The URL for this instance cluster network attachment.
	Href *string `json:"href,omitempty"`
}

func (*InstanceClusterNetworkAttachmentBeforePrototype) isaInstanceClusterNetworkAttachmentBeforePrototype() bool {
	return true
}

type InstanceClusterNetworkAttachmentBeforePrototypeIntf interface {
	isaInstanceClusterNetworkAttachmentBeforePrototype() bool
}

// UnmarshalInstanceClusterNetworkAttachmentBeforePrototype unmarshals an instance of InstanceClusterNetworkAttachmentBeforePrototype from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentBeforePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentBeforePrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachmentCollection : InstanceClusterNetworkAttachmentCollection struct
type InstanceClusterNetworkAttachmentCollection struct {
	// A page of ordered cluster network attachments (sorted based on the `before` property) for the instance. A cluster
	// network attachment represents a device to which a cluster network interface is attached.
	ClusterNetworkAttachments []InstanceClusterNetworkAttachment `json:"cluster_network_attachments" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceClusterNetworkAttachmentCollection unmarshals an instance of InstanceClusterNetworkAttachmentCollection from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentCollection)
	err = core.UnmarshalModel(m, "cluster_network_attachments", &obj.ClusterNetworkAttachments, UnmarshalInstanceClusterNetworkAttachment)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceClusterNetworkAttachmentCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceClusterNetworkAttachmentLifecycleReason : InstanceClusterNetworkAttachmentLifecycleReason struct
type InstanceClusterNetworkAttachmentLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the InstanceClusterNetworkAttachmentLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceClusterNetworkAttachmentLifecycleReasonCodeInternalErrorConst               = "internal_error"
	InstanceClusterNetworkAttachmentLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalInstanceClusterNetworkAttachmentLifecycleReason unmarshals an instance of InstanceClusterNetworkAttachmentLifecycleReason from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachmentPatch : InstanceClusterNetworkAttachmentPatch struct
type InstanceClusterNetworkAttachmentPatch struct {
	// The name for this network attachment. The name must not be used by another network attachment for the instance.
	// Names starting with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// UnmarshalInstanceClusterNetworkAttachmentPatch unmarshals an instance of InstanceClusterNetworkAttachmentPatch from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceClusterNetworkAttachmentPatch
func (instanceClusterNetworkAttachmentPatch *InstanceClusterNetworkAttachmentPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceClusterNetworkAttachmentPatch.Name) {
		_patch["name"] = instanceClusterNetworkAttachmentPatch.Name
	}

	return
}

// InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface : A cluster network interface for the instance cluster network attachment. This can be specified using an existing
// cluster network interface that does not already have a
// `target`, or a prototype object for a new cluster network interface.
//
// This instance must reside in the same VPC as the specified cluster network interface. The cluster network interface
// must reside in the same cluster network as the
// `cluster_network_interface` of any other `cluster_network_attachments` for this instance.
// Models which "extend" this model:
// - InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceInstanceClusterNetworkInterfacePrototypeInstanceClusterNetworkAttachment
// - InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceClusterNetworkInterfaceIdentity
type InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface struct {
	// Indicates whether this cluster network interface will be automatically deleted when `target` is deleted.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this cluster network interface. The name must not be used by another interface in the cluster network.
	// Names beginning with `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified, the name
	// will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the cluster network interface. May be either
	// a cluster network subnet reserved IP identity, or a cluster network subnet reserved IP
	// prototype object which will be used to create a new cluster network subnet reserved IP.
	//
	// If a cluster network subnet reserved IP identity is provided, the specified cluster
	// network subnet reserved IP must be unbound.
	//
	// If a cluster network subnet reserved IP prototype object with an address is provided,
	// the address must be available on the cluster network interface's cluster network
	// subnet. If no address is specified, an available address on the cluster network subnet
	// will be automatically selected and reserved.
	PrimaryIP ClusterNetworkInterfacePrimaryIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The associated cluster network subnet. Required if `primary_ip` does not specify a
	// cluster network subnet reserved IP identity.
	Subnet ClusterNetworkSubnetIdentityIntf `json:"subnet,omitempty"`

	// The unique identifier for this cluster network interface.
	ID *string `json:"id,omitempty"`

	// The URL for this cluster network interface.
	Href *string `json:"href,omitempty"`
}

func (*InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface) isaInstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface() bool {
	return true
}

type InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceIntf interface {
	isaInstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface() bool
}

// UnmarshalInstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface unmarshals an instance of InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalClusterNetworkInterfacePrimaryIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalClusterNetworkSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachmentPrototypeInstanceContext : InstanceClusterNetworkAttachmentPrototypeInstanceContext struct
type InstanceClusterNetworkAttachmentPrototypeInstanceContext struct {
	// A cluster network interface for the instance cluster network attachment. This can be
	// specified using an existing cluster network interface that does not already have a
	// `target`, or a prototype object for a new cluster network interface.
	//
	// This instance must reside in the same VPC as the specified cluster network interface. The
	// cluster network interface must reside in the same cluster network as the
	// `cluster_network_interface` of any other `cluster_network_attachments` for this instance.
	ClusterNetworkInterface InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceIntf `json:"cluster_network_interface" validate:"required"`

	// The name for this cluster network attachment. Names must be unique within the instance the cluster network
	// attachment resides in. If unspecified, the name will be a hyphenated list of randomly-selected words. Names starting
	// with `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// NewInstanceClusterNetworkAttachmentPrototypeInstanceContext : Instantiate InstanceClusterNetworkAttachmentPrototypeInstanceContext (Generic Model Constructor)
func (*VpcV1) NewInstanceClusterNetworkAttachmentPrototypeInstanceContext(clusterNetworkInterface InstanceClusterNetworkAttachmentPrototypeClusterNetworkInterfaceIntf) (_model *InstanceClusterNetworkAttachmentPrototypeInstanceContext, err error) {
	_model = &InstanceClusterNetworkAttachmentPrototypeInstanceContext{
		ClusterNetworkInterface: clusterNetworkInterface,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalInstanceClusterNetworkAttachmentPrototypeInstanceContext unmarshals an instance of InstanceClusterNetworkAttachmentPrototypeInstanceContext from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentPrototypeInstanceContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentPrototypeInstanceContext)
	err = core.UnmarshalModel(m, "cluster_network_interface", &obj.ClusterNetworkInterface, UnmarshalInstanceClusterNetworkAttachmentPrototypeClusterNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceClusterNetworkAttachmentReference : InstanceClusterNetworkAttachmentReference struct
type InstanceClusterNetworkAttachmentReference struct {
	// The URL for this instance cluster network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance cluster network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this instance cluster network attachment. The name is unique across all network attachments for the
	// instance.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the InstanceClusterNetworkAttachmentReference.ResourceType property.
// The resource type.
const (
	InstanceClusterNetworkAttachmentReferenceResourceTypeInstanceClusterNetworkAttachmentConst = "instance_cluster_network_attachment"
)

// UnmarshalInstanceClusterNetworkAttachmentReference unmarshals an instance of InstanceClusterNetworkAttachmentReference from the specified map of raw messages.
func UnmarshalInstanceClusterNetworkAttachmentReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceClusterNetworkAttachmentReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceCollection : InstanceCollection struct
type InstanceCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of virtual server instances.
	Instances []Instance `json:"instances" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceCollection unmarshals an instance of InstanceCollection from the specified map of raw messages.
func UnmarshalInstanceCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instances", &obj.Instances, UnmarshalInstance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instances-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceConsoleAccessToken : The instance console access token information.
type InstanceConsoleAccessToken struct {
	// A URL safe single-use token used to access the console WebSocket.
	AccessToken *string `json:"access_token" validate:"required"`

	// The instance console type for which this token may be used.
	ConsoleType *string `json:"console_type" validate:"required"`

	// The date and time that the access token was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The date and time that the access token will expire.
	ExpiresAt *strfmt.DateTime `json:"expires_at" validate:"required"`

	// Indicates whether to disconnect an existing serial console session as the serial console cannot be shared.  This has
	// no effect on VNC consoles.
	Force *bool `json:"force" validate:"required"`

	// The URL to access this instance console.
	Href *string `json:"href" validate:"required"`
}

// Constants associated with the InstanceConsoleAccessToken.ConsoleType property.
// The instance console type for which this token may be used.
const (
	InstanceConsoleAccessTokenConsoleTypeSerialConst = "serial"
	InstanceConsoleAccessTokenConsoleTypeVncConst    = "vnc"
)

// UnmarshalInstanceConsoleAccessToken unmarshals an instance of InstanceConsoleAccessToken from the specified map of raw messages.
func UnmarshalInstanceConsoleAccessToken(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceConsoleAccessToken)
	err = core.UnmarshalPrimitive(m, "access_token", &obj.AccessToken)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_token-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "console_type", &obj.ConsoleType)
	if err != nil {
		err = core.SDKErrorf(err, "", "console_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "expires_at", &obj.ExpiresAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "expires_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "force", &obj.Force)
	if err != nil {
		err = core.SDKErrorf(err, "", "force-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceDefaultTrustedProfilePrototype : InstanceDefaultTrustedProfilePrototype struct
type InstanceDefaultTrustedProfilePrototype struct {
	// If set to `true`, the system will create a link to the specified `target` trusted profile during instance creation.
	// Regardless of whether a link is created by the system or manually using the IAM Identity service, it will be
	// automatically deleted when the instance is deleted.
	AutoLink *bool `json:"auto_link,omitempty"`

	// The default IAM trusted profile to use for this virtual server instance.
	Target TrustedProfileIdentityIntf `json:"target" validate:"required"`
}

// NewInstanceDefaultTrustedProfilePrototype : Instantiate InstanceDefaultTrustedProfilePrototype (Generic Model Constructor)
func (*VpcV1) NewInstanceDefaultTrustedProfilePrototype(target TrustedProfileIdentityIntf) (_model *InstanceDefaultTrustedProfilePrototype, err error) {
	_model = &InstanceDefaultTrustedProfilePrototype{
		Target: target,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalInstanceDefaultTrustedProfilePrototype unmarshals an instance of InstanceDefaultTrustedProfilePrototype from the specified map of raw messages.
func UnmarshalInstanceDefaultTrustedProfilePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceDefaultTrustedProfilePrototype)
	err = core.UnmarshalPrimitive(m, "auto_link", &obj.AutoLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_link-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalTrustedProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceDisk : InstanceDisk struct
type InstanceDisk struct {
	// The date and time that the disk was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this instance disk.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance disk.
	ID *string `json:"id" validate:"required"`

	// The disk interface used for attaching the disk.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	InterfaceType *string `json:"interface_type" validate:"required"`

	// The name for this instance disk. The name is unique across all disks on the instance.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The size of the disk in GB (gigabytes).
	Size *int64 `json:"size" validate:"required"`
}

// Constants associated with the InstanceDisk.InterfaceType property.
// The disk interface used for attaching the disk.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceDiskInterfaceTypeNvmeConst      = "nvme"
	InstanceDiskInterfaceTypeVirtioBlkConst = "virtio_blk"
)

// Constants associated with the InstanceDisk.ResourceType property.
// The resource type.
const (
	InstanceDiskResourceTypeInstanceDiskConst = "instance_disk"
)

// UnmarshalInstanceDisk unmarshals an instance of InstanceDisk from the specified map of raw messages.
func UnmarshalInstanceDisk(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceDisk)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interface_type", &obj.InterfaceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "interface_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceDiskCollection : InstanceDiskCollection struct
type InstanceDiskCollection struct {
	// The disks for the instance.
	Disks []InstanceDisk `json:"disks" validate:"required"`
}

// UnmarshalInstanceDiskCollection unmarshals an instance of InstanceDiskCollection from the specified map of raw messages.
func UnmarshalInstanceDiskCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceDiskCollection)
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalInstanceDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceDiskPatch : InstanceDiskPatch struct
type InstanceDiskPatch struct {
	// The name for this instance disk. The name must not be used by another disk on the instance.
	Name *string `json:"name,omitempty"`
}

// UnmarshalInstanceDiskPatch unmarshals an instance of InstanceDiskPatch from the specified map of raw messages.
func UnmarshalInstanceDiskPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceDiskPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceDiskPatch
func (instanceDiskPatch *InstanceDiskPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceDiskPatch.Name) {
		_patch["name"] = instanceDiskPatch.Name
	}

	return
}

// InstanceDiskReference : InstanceDiskReference struct
type InstanceDiskReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance disk.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance disk.
	ID *string `json:"id" validate:"required"`

	// The name for this instance disk. The name is unique across all disks on the instance.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the InstanceDiskReference.ResourceType property.
// The resource type.
const (
	InstanceDiskReferenceResourceTypeInstanceDiskConst = "instance_disk"
)

// UnmarshalInstanceDiskReference unmarshals an instance of InstanceDiskReference from the specified map of raw messages.
func UnmarshalInstanceDiskReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceDiskReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGpu : The virtual server instance GPU configuration.
type InstanceGpu struct {
	// The number of GPUs assigned to the instance.
	Count *int64 `json:"count" validate:"required"`

	// The GPU manufacturer.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Manufacturer *string `json:"manufacturer" validate:"required"`

	// The overall amount of GPU memory in GiB (gibibytes).
	Memory *int64 `json:"memory" validate:"required"`

	// The GPU model.
	Model *string `json:"model" validate:"required"`
}

// Constants associated with the InstanceGpu.Manufacturer property.
// The GPU manufacturer.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGpuManufacturerAmdConst    = "amd"
	InstanceGpuManufacturerIntelConst  = "intel"
	InstanceGpuManufacturerNvidiaConst = "nvidia"
)

// UnmarshalInstanceGpu unmarshals an instance of InstanceGpu from the specified map of raw messages.
func UnmarshalInstanceGpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGpu)
	err = core.UnmarshalPrimitive(m, "count", &obj.Count)
	if err != nil {
		err = core.SDKErrorf(err, "", "count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "manufacturer", &obj.Manufacturer)
	if err != nil {
		err = core.SDKErrorf(err, "", "manufacturer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "memory", &obj.Memory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "model", &obj.Model)
	if err != nil {
		err = core.SDKErrorf(err, "", "model-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroup : InstanceGroup struct
type InstanceGroup struct {
	// The port used for new load balancer pool members created by this instance group.
	//
	// This property will be present if and only if `load_balancer_pool` is present.
	ApplicationPort *int64 `json:"application_port,omitempty"`

	// The date and time that the instance group was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this instance group.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this instance group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group.
	ID *string `json:"id" validate:"required"`

	// The template used to create new instances for this group.
	InstanceTemplate *InstanceTemplateReference `json:"instance_template" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []InstanceGroupLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the instance group.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// If present, the load balancer pool this instance group manages. A pool member will
	// be created for each instance created by this group.
	LoadBalancerPool *LoadBalancerPoolReference `json:"load_balancer_pool,omitempty"`

	// The managers for the instance group.
	Managers []InstanceGroupManagerReference `json:"managers" validate:"required"`

	// The number of instances in the instance group.
	MembershipCount *int64 `json:"membership_count" validate:"required"`

	// The name for this instance group. The name is unique across all instance groups in the region.
	Name *string `json:"name" validate:"required"`

	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The status of the instance group
	// - `deleting`: Group is being deleted
	// - `healthy`: Group has `membership_count` instances
	// - `scaling`: Instances in the group are being created or deleted to reach
	//              `membership_count`
	// - `unhealthy`: Group is unable to reach `membership_count` instances
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The subnets to use when creating new instances.
	Subnets []SubnetReference `json:"subnets" validate:"required"`

	// The date and time that the instance group was updated.
	UpdatedAt *strfmt.DateTime `json:"updated_at" validate:"required"`

	// The VPC the instance group resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// Constants associated with the InstanceGroup.LifecycleState property.
// The lifecycle state of the instance group.
const (
	InstanceGroupLifecycleStateDeletingConst  = "deleting"
	InstanceGroupLifecycleStateFailedConst    = "failed"
	InstanceGroupLifecycleStatePendingConst   = "pending"
	InstanceGroupLifecycleStateStableConst    = "stable"
	InstanceGroupLifecycleStateSuspendedConst = "suspended"
	InstanceGroupLifecycleStateUpdatingConst  = "updating"
	InstanceGroupLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the InstanceGroup.Status property.
// The status of the instance group
//   - `deleting`: Group is being deleted
//   - `healthy`: Group has `membership_count` instances
//   - `scaling`: Instances in the group are being created or deleted to reach
//     `membership_count`
//   - `unhealthy`: Group is unable to reach `membership_count` instances
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGroupStatusDeletingConst  = "deleting"
	InstanceGroupStatusHealthyConst   = "healthy"
	InstanceGroupStatusScalingConst   = "scaling"
	InstanceGroupStatusUnhealthyConst = "unhealthy"
)

// UnmarshalInstanceGroup unmarshals an instance of InstanceGroup from the specified map of raw messages.
func UnmarshalInstanceGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroup)
	err = core.UnmarshalPrimitive(m, "application_port", &obj.ApplicationPort)
	if err != nil {
		err = core.SDKErrorf(err, "", "application_port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_template", &obj.InstanceTemplate, UnmarshalInstanceTemplateReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_template-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalInstanceGroupLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "load_balancer_pool", &obj.LoadBalancerPool, UnmarshalLoadBalancerPoolReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "load_balancer_pool-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "managers", &obj.Managers, UnmarshalInstanceGroupManagerReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "managers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "membership_count", &obj.MembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "updated_at", &obj.UpdatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "updated_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupCollection : InstanceGroupCollection struct
type InstanceGroupCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of instance groups.
	InstanceGroups []InstanceGroup `json:"instance_groups" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceGroupCollection unmarshals an instance of InstanceGroupCollection from the specified map of raw messages.
func UnmarshalInstanceGroupCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_groups", &obj.InstanceGroups, UnmarshalInstanceGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceGroupCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceGroupLifecycleReason : InstanceGroupLifecycleReason struct
type InstanceGroupLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the InstanceGroupLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGroupLifecycleReasonCodeInternalErrorConst               = "internal_error"
	InstanceGroupLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalInstanceGroupLifecycleReason unmarshals an instance of InstanceGroupLifecycleReason from the specified map of raw messages.
func UnmarshalInstanceGroupLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManager : InstanceGroupManager struct
// Models which "extend" this model:
// - InstanceGroupManagerAutoScale
// - InstanceGroupManagerScheduled
type InstanceGroupManager struct {
	// The date and time that the instance group manager was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this instance group manager.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group manager.
	ID *string `json:"id" validate:"required"`

	// Indicates whether this manager will control the instance group.
	ManagementEnabled *bool `json:"management_enabled" validate:"required"`

	// The name for this instance group manager. The name is unique across all managers for the instance group.
	Name *string `json:"name" validate:"required"`

	// The date and time that the instance group manager was updated.
	UpdatedAt *strfmt.DateTime `json:"updated_at" validate:"required"`

	// The time window in seconds to aggregate metrics prior to evaluation.
	AggregationWindow *int64 `json:"aggregation_window,omitempty"`

	// The duration of time in seconds to pause further scale actions after scaling has taken place.
	Cooldown *int64 `json:"cooldown,omitempty"`

	// The type of instance group manager.
	ManagerType *string `json:"manager_type,omitempty"`

	// The maximum number of members in a managed instance group.
	MaxMembershipCount *int64 `json:"max_membership_count,omitempty"`

	// The minimum number of members in a managed instance group.
	MinMembershipCount *int64 `json:"min_membership_count,omitempty"`

	// The policies of the instance group manager.
	Policies []InstanceGroupManagerPolicyReference `json:"policies,omitempty"`

	// The actions of the instance group manager.
	Actions []InstanceGroupManagerActionReference `json:"actions,omitempty"`
}

// Constants associated with the InstanceGroupManager.ManagerType property.
// The type of instance group manager.
const (
	InstanceGroupManagerManagerTypeAutoscaleConst = "autoscale"
)

func (*InstanceGroupManager) isaInstanceGroupManager() bool {
	return true
}

type InstanceGroupManagerIntf interface {
	isaInstanceGroupManager() bool
}

// UnmarshalInstanceGroupManager unmarshals an instance of InstanceGroupManager from the specified map of raw messages.
func UnmarshalInstanceGroupManager(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManager)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "management_enabled", &obj.ManagementEnabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "management_enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "updated_at", &obj.UpdatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "updated_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "aggregation_window", &obj.AggregationWindow)
	if err != nil {
		err = core.SDKErrorf(err, "", "aggregation_window-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cooldown", &obj.Cooldown)
	if err != nil {
		err = core.SDKErrorf(err, "", "cooldown-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "manager_type", &obj.ManagerType)
	if err != nil {
		err = core.SDKErrorf(err, "", "manager_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_membership_count", &obj.MaxMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min_membership_count", &obj.MinMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "min_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "policies", &obj.Policies, UnmarshalInstanceGroupManagerPolicyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "actions", &obj.Actions, UnmarshalInstanceGroupManagerActionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "actions-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerAction : InstanceGroupManagerAction struct
// Models which "extend" this model:
// - InstanceGroupManagerActionScheduledAction
type InstanceGroupManagerAction struct {
	// Indicates whether this scheduled action will be automatically deleted after it has completed and
	// `auto_delete_timeout` hours have passed.
	AutoDelete *bool `json:"auto_delete" validate:"required"`

	// If `auto_delete` is `true`, and this scheduled action has finished, the hours after which it will be automatically
	// deleted. If the value is `0`, the action will be deleted once it has finished.
	AutoDeleteTimeout *int64 `json:"auto_delete_timeout" validate:"required"`

	// The date and time that the instance group manager action was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this instance group manager action.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group manager action.
	ID *string `json:"id" validate:"required"`

	// The name for this instance group manager action. The name is unique across all actions for the instance group
	// manager.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of the instance group action
	// - `active`: Action is ready to be run
	// - `completed`: Action was completed successfully
	// - `failed`: Action could not be completed successfully
	// - `incompatible`: Action parameters are not compatible with the group or manager
	// - `omitted`: Action was not applied because this action's manager was disabled
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The date and time that the instance group manager action was updated.
	UpdatedAt *strfmt.DateTime `json:"updated_at" validate:"required"`

	// The type of action for the instance group.
	ActionType *string `json:"action_type,omitempty"`

	// The cron specification for a recurring scheduled action. Actions can be applied a maximum of one time within a 5 min
	// period.
	CronSpec *string `json:"cron_spec,omitempty"`

	// The date and time the scheduled action was last applied. If absent, the action has never been applied.
	LastAppliedAt *strfmt.DateTime `json:"last_applied_at,omitempty"`

	// The date and time the scheduled action will next run. If absent, the system is currently calculating the next run
	// time.
	NextRunAt *strfmt.DateTime `json:"next_run_at,omitempty"`

	Group *InstanceGroupManagerScheduledActionGroup `json:"group,omitempty"`

	Manager InstanceGroupManagerScheduledActionManagerIntf `json:"manager,omitempty"`
}

// Constants associated with the InstanceGroupManagerAction.ResourceType property.
// The resource type.
const (
	InstanceGroupManagerActionResourceTypeInstanceGroupManagerActionConst = "instance_group_manager_action"
)

// Constants associated with the InstanceGroupManagerAction.Status property.
// The status of the instance group action
// - `active`: Action is ready to be run
// - `completed`: Action was completed successfully
// - `failed`: Action could not be completed successfully
// - `incompatible`: Action parameters are not compatible with the group or manager
// - `omitted`: Action was not applied because this action's manager was disabled
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGroupManagerActionStatusActiveConst       = "active"
	InstanceGroupManagerActionStatusCompletedConst    = "completed"
	InstanceGroupManagerActionStatusFailedConst       = "failed"
	InstanceGroupManagerActionStatusIncompatibleConst = "incompatible"
	InstanceGroupManagerActionStatusOmittedConst      = "omitted"
)

// Constants associated with the InstanceGroupManagerAction.ActionType property.
// The type of action for the instance group.
const (
	InstanceGroupManagerActionActionTypeScheduledConst = "scheduled"
)

func (*InstanceGroupManagerAction) isaInstanceGroupManagerAction() bool {
	return true
}

type InstanceGroupManagerActionIntf interface {
	isaInstanceGroupManagerAction() bool
}

// UnmarshalInstanceGroupManagerAction unmarshals an instance of InstanceGroupManagerAction from the specified map of raw messages.
func UnmarshalInstanceGroupManagerAction(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerAction)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete_timeout", &obj.AutoDeleteTimeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete_timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "updated_at", &obj.UpdatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "updated_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "action_type", &obj.ActionType)
	if err != nil {
		err = core.SDKErrorf(err, "", "action_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cron_spec", &obj.CronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "last_applied_at", &obj.LastAppliedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "last_applied_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "next_run_at", &obj.NextRunAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "next_run_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "group", &obj.Group, UnmarshalInstanceGroupManagerScheduledActionGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "manager", &obj.Manager, UnmarshalInstanceGroupManagerScheduledActionManager)
	if err != nil {
		err = core.SDKErrorf(err, "", "manager-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerActionGroupPatch : InstanceGroupManagerActionGroupPatch struct
type InstanceGroupManagerActionGroupPatch struct {
	// The desired number of instance group members at the scheduled time.
	MembershipCount *int64 `json:"membership_count,omitempty"`
}

// UnmarshalInstanceGroupManagerActionGroupPatch unmarshals an instance of InstanceGroupManagerActionGroupPatch from the specified map of raw messages.
func UnmarshalInstanceGroupManagerActionGroupPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerActionGroupPatch)
	err = core.UnmarshalPrimitive(m, "membership_count", &obj.MembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "membership_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstanceGroupManagerActionGroupPatch
func (instanceGroupManagerActionGroupPatch *InstanceGroupManagerActionGroupPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupManagerActionGroupPatch.MembershipCount) {
		_patch["membership_count"] = instanceGroupManagerActionGroupPatch.MembershipCount
	}

	return
}

// InstanceGroupManagerActionManagerPatch : InstanceGroupManagerActionManagerPatch struct
type InstanceGroupManagerActionManagerPatch struct {
	// The desired maximum number of instance group members at the scheduled time.
	MaxMembershipCount *int64 `json:"max_membership_count,omitempty"`

	// The desired minimum number of instance group members at the scheduled time.
	MinMembershipCount *int64 `json:"min_membership_count,omitempty"`
}

// UnmarshalInstanceGroupManagerActionManagerPatch unmarshals an instance of InstanceGroupManagerActionManagerPatch from the specified map of raw messages.
func UnmarshalInstanceGroupManagerActionManagerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerActionManagerPatch)
	err = core.UnmarshalPrimitive(m, "max_membership_count", &obj.MaxMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min_membership_count", &obj.MinMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "min_membership_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstanceGroupManagerActionManagerPatch
func (instanceGroupManagerActionManagerPatch *InstanceGroupManagerActionManagerPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupManagerActionManagerPatch.MaxMembershipCount) {
		_patch["max_membership_count"] = instanceGroupManagerActionManagerPatch.MaxMembershipCount
	}
	if !core.IsNil(instanceGroupManagerActionManagerPatch.MinMembershipCount) {
		_patch["min_membership_count"] = instanceGroupManagerActionManagerPatch.MinMembershipCount
	}

	return
}

// InstanceGroupManagerActionPatch : InstanceGroupManagerActionPatch struct
type InstanceGroupManagerActionPatch struct {
	// Indicates whether this scheduled action will be automatically deleted after it has completed and
	// `auto_delete_timeout` hours have passed.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// If `auto_delete` is `true`, and this scheduled action has finished, the hours after which it will be automatically
	// deleted. If the value is `0`, the action will be deleted once it has finished.
	AutoDeleteTimeout *int64 `json:"auto_delete_timeout,omitempty"`

	// The cron specification for a recurring scheduled action. Actions can be applied a maximum of one time within a 5 min
	// period.
	CronSpec *string `json:"cron_spec,omitempty"`

	Group *InstanceGroupManagerActionGroupPatch `json:"group,omitempty"`

	Manager *InstanceGroupManagerActionManagerPatch `json:"manager,omitempty"`

	// The name for this instance group manager action. The name must not be used by another action for the instance group
	// manager.
	Name *string `json:"name,omitempty"`

	// The date and time the scheduled action will run.
	RunAt *strfmt.DateTime `json:"run_at,omitempty"`
}

// UnmarshalInstanceGroupManagerActionPatch unmarshals an instance of InstanceGroupManagerActionPatch from the specified map of raw messages.
func UnmarshalInstanceGroupManagerActionPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerActionPatch)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete_timeout", &obj.AutoDeleteTimeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete_timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cron_spec", &obj.CronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "group", &obj.Group, UnmarshalInstanceGroupManagerActionGroupPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "manager", &obj.Manager, UnmarshalInstanceGroupManagerActionManagerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "manager-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "run_at", &obj.RunAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "run_at-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceGroupManagerActionPatch
func (instanceGroupManagerActionPatch *InstanceGroupManagerActionPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupManagerActionPatch.AutoDelete) {
		_patch["auto_delete"] = instanceGroupManagerActionPatch.AutoDelete
	}
	if !core.IsNil(instanceGroupManagerActionPatch.AutoDeleteTimeout) {
		_patch["auto_delete_timeout"] = instanceGroupManagerActionPatch.AutoDeleteTimeout
	}
	if !core.IsNil(instanceGroupManagerActionPatch.CronSpec) {
		_patch["cron_spec"] = instanceGroupManagerActionPatch.CronSpec
	}
	if !core.IsNil(instanceGroupManagerActionPatch.Group) {
		_patch["group"] = instanceGroupManagerActionPatch.Group.asPatch()
	}
	if !core.IsNil(instanceGroupManagerActionPatch.Manager) {
		_patch["manager"] = instanceGroupManagerActionPatch.Manager.asPatch()
	}
	if !core.IsNil(instanceGroupManagerActionPatch.Name) {
		_patch["name"] = instanceGroupManagerActionPatch.Name
	}
	if !core.IsNil(instanceGroupManagerActionPatch.RunAt) {
		_patch["run_at"] = instanceGroupManagerActionPatch.RunAt
	}

	return
}

// InstanceGroupManagerActionPrototype : InstanceGroupManagerActionPrototype struct
// Models which "extend" this model:
// - InstanceGroupManagerActionPrototypeScheduledActionPrototype
type InstanceGroupManagerActionPrototype struct {
	// The name for this instance group manager action. The name must not be used by another action for the instance group
	// manager. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The date and time the scheduled action will run.
	RunAt *strfmt.DateTime `json:"run_at,omitempty"`

	Group *InstanceGroupManagerScheduledActionGroupPrototype `json:"group,omitempty"`

	Manager InstanceGroupManagerScheduledActionManagerPrototypeIntf `json:"manager,omitempty"`

	// The cron specification for a recurring scheduled action. Actions can be applied a maximum of one time within a 5 min
	// period.
	CronSpec *string `json:"cron_spec,omitempty"`
}

func (*InstanceGroupManagerActionPrototype) isaInstanceGroupManagerActionPrototype() bool {
	return true
}

type InstanceGroupManagerActionPrototypeIntf interface {
	isaInstanceGroupManagerActionPrototype() bool
}

// UnmarshalInstanceGroupManagerActionPrototype unmarshals an instance of InstanceGroupManagerActionPrototype from the specified map of raw messages.
func UnmarshalInstanceGroupManagerActionPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerActionPrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "run_at", &obj.RunAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "run_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "group", &obj.Group, UnmarshalInstanceGroupManagerScheduledActionGroupPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "manager", &obj.Manager, UnmarshalInstanceGroupManagerScheduledActionManagerPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "manager-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cron_spec", &obj.CronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "cron_spec-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerActionReference : InstanceGroupManagerActionReference struct
type InstanceGroupManagerActionReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance group manager action.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group manager action.
	ID *string `json:"id" validate:"required"`

	// The name for this instance group manager action. The name is unique across all actions for the instance group
	// manager.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the InstanceGroupManagerActionReference.ResourceType property.
// The resource type.
const (
	InstanceGroupManagerActionReferenceResourceTypeInstanceGroupManagerActionConst = "instance_group_manager_action"
)

// UnmarshalInstanceGroupManagerActionReference unmarshals an instance of InstanceGroupManagerActionReference from the specified map of raw messages.
func UnmarshalInstanceGroupManagerActionReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerActionReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerActionsCollection : InstanceGroupManagerActionsCollection struct
type InstanceGroupManagerActionsCollection struct {
	// A page of actions for the instance group manager.
	Actions []InstanceGroupManagerActionIntf `json:"actions" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceGroupManagerActionsCollection unmarshals an instance of InstanceGroupManagerActionsCollection from the specified map of raw messages.
func UnmarshalInstanceGroupManagerActionsCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerActionsCollection)
	err = core.UnmarshalModel(m, "actions", &obj.Actions, UnmarshalInstanceGroupManagerAction)
	if err != nil {
		err = core.SDKErrorf(err, "", "actions-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceGroupManagerActionsCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceGroupManagerCollection : InstanceGroupManagerCollection struct
type InstanceGroupManagerCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A page of managers for the instance group.
	Managers []InstanceGroupManagerIntf `json:"managers" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceGroupManagerCollection unmarshals an instance of InstanceGroupManagerCollection from the specified map of raw messages.
func UnmarshalInstanceGroupManagerCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "managers", &obj.Managers, UnmarshalInstanceGroupManager)
	if err != nil {
		err = core.SDKErrorf(err, "", "managers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceGroupManagerCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceGroupManagerPatch : InstanceGroupManagerPatch struct
type InstanceGroupManagerPatch struct {
	// The time window in seconds to aggregate metrics prior to evaluation.
	AggregationWindow *int64 `json:"aggregation_window,omitempty"`

	// The duration of time in seconds to pause further scale actions after scaling has taken place.
	Cooldown *int64 `json:"cooldown,omitempty"`

	// Indicates whether this manager will control the instance group.
	ManagementEnabled *bool `json:"management_enabled,omitempty"`

	// The maximum number of members in a managed instance group.
	MaxMembershipCount *int64 `json:"max_membership_count,omitempty"`

	// The minimum number of members in a managed instance group.
	MinMembershipCount *int64 `json:"min_membership_count,omitempty"`

	// The name for this instance group manager. The name must not be used by another manager for the instance group.
	Name *string `json:"name,omitempty"`
}

// UnmarshalInstanceGroupManagerPatch unmarshals an instance of InstanceGroupManagerPatch from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPatch)
	err = core.UnmarshalPrimitive(m, "aggregation_window", &obj.AggregationWindow)
	if err != nil {
		err = core.SDKErrorf(err, "", "aggregation_window-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cooldown", &obj.Cooldown)
	if err != nil {
		err = core.SDKErrorf(err, "", "cooldown-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "management_enabled", &obj.ManagementEnabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "management_enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_membership_count", &obj.MaxMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min_membership_count", &obj.MinMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "min_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceGroupManagerPatch
func (instanceGroupManagerPatch *InstanceGroupManagerPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupManagerPatch.AggregationWindow) {
		_patch["aggregation_window"] = instanceGroupManagerPatch.AggregationWindow
	}
	if !core.IsNil(instanceGroupManagerPatch.Cooldown) {
		_patch["cooldown"] = instanceGroupManagerPatch.Cooldown
	}
	if !core.IsNil(instanceGroupManagerPatch.ManagementEnabled) {
		_patch["management_enabled"] = instanceGroupManagerPatch.ManagementEnabled
	}
	if !core.IsNil(instanceGroupManagerPatch.MaxMembershipCount) {
		_patch["max_membership_count"] = instanceGroupManagerPatch.MaxMembershipCount
	}
	if !core.IsNil(instanceGroupManagerPatch.MinMembershipCount) {
		_patch["min_membership_count"] = instanceGroupManagerPatch.MinMembershipCount
	}
	if !core.IsNil(instanceGroupManagerPatch.Name) {
		_patch["name"] = instanceGroupManagerPatch.Name
	}

	return
}

// InstanceGroupManagerPolicy : InstanceGroupManagerPolicy struct
// Models which "extend" this model:
// - InstanceGroupManagerPolicyInstanceGroupManagerTargetPolicy
type InstanceGroupManagerPolicy struct {
	// The date and time that the instance group manager policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this instance group manager policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group manager policy.
	ID *string `json:"id" validate:"required"`

	// The name for this instance group manager policy. The name is unique across all policies for the instance group
	// manager.
	Name *string `json:"name" validate:"required"`

	// The date and time that the instance group manager policy was updated.
	UpdatedAt *strfmt.DateTime `json:"updated_at" validate:"required"`

	// The type of metric to be evaluated
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	MetricType *string `json:"metric_type,omitempty"`

	// The metric value to be evaluated.
	MetricValue *int64 `json:"metric_value,omitempty"`

	// The type of policy for the instance group
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	PolicyType *string `json:"policy_type,omitempty"`
}

// Constants associated with the InstanceGroupManagerPolicy.MetricType property.
// The type of metric to be evaluated
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGroupManagerPolicyMetricTypeCpuConst        = "cpu"
	InstanceGroupManagerPolicyMetricTypeMemoryConst     = "memory"
	InstanceGroupManagerPolicyMetricTypeNetworkInConst  = "network_in"
	InstanceGroupManagerPolicyMetricTypeNetworkOutConst = "network_out"
)

// Constants associated with the InstanceGroupManagerPolicy.PolicyType property.
// The type of policy for the instance group
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGroupManagerPolicyPolicyTypeTargetConst = "target"
)

func (*InstanceGroupManagerPolicy) isaInstanceGroupManagerPolicy() bool {
	return true
}

type InstanceGroupManagerPolicyIntf interface {
	isaInstanceGroupManagerPolicy() bool
}

// UnmarshalInstanceGroupManagerPolicy unmarshals an instance of InstanceGroupManagerPolicy from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPolicy)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "updated_at", &obj.UpdatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "updated_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "metric_type", &obj.MetricType)
	if err != nil {
		err = core.SDKErrorf(err, "", "metric_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "metric_value", &obj.MetricValue)
	if err != nil {
		err = core.SDKErrorf(err, "", "metric_value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "policy_type", &obj.PolicyType)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerPolicyCollection : InstanceGroupManagerPolicyCollection struct
type InstanceGroupManagerPolicyCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of policies for the instance group manager.
	Policies []InstanceGroupManagerPolicyIntf `json:"policies" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceGroupManagerPolicyCollection unmarshals an instance of InstanceGroupManagerPolicyCollection from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPolicyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPolicyCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "policies", &obj.Policies, UnmarshalInstanceGroupManagerPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceGroupManagerPolicyCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceGroupManagerPolicyPatch : InstanceGroupManagerPolicyPatch struct
type InstanceGroupManagerPolicyPatch struct {
	// The type of metric to be evaluated.
	MetricType *string `json:"metric_type,omitempty"`

	// The metric value to be evaluated.
	MetricValue *int64 `json:"metric_value,omitempty"`

	// The name for this instance group manager policy. The name must not be used by another policy for the instance group
	// manager.
	Name *string `json:"name,omitempty"`
}

// Constants associated with the InstanceGroupManagerPolicyPatch.MetricType property.
// The type of metric to be evaluated.
const (
	InstanceGroupManagerPolicyPatchMetricTypeCpuConst        = "cpu"
	InstanceGroupManagerPolicyPatchMetricTypeMemoryConst     = "memory"
	InstanceGroupManagerPolicyPatchMetricTypeNetworkInConst  = "network_in"
	InstanceGroupManagerPolicyPatchMetricTypeNetworkOutConst = "network_out"
)

// UnmarshalInstanceGroupManagerPolicyPatch unmarshals an instance of InstanceGroupManagerPolicyPatch from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPolicyPatch)
	err = core.UnmarshalPrimitive(m, "metric_type", &obj.MetricType)
	if err != nil {
		err = core.SDKErrorf(err, "", "metric_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "metric_value", &obj.MetricValue)
	if err != nil {
		err = core.SDKErrorf(err, "", "metric_value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceGroupManagerPolicyPatch
func (instanceGroupManagerPolicyPatch *InstanceGroupManagerPolicyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupManagerPolicyPatch.MetricType) {
		_patch["metric_type"] = instanceGroupManagerPolicyPatch.MetricType
	}
	if !core.IsNil(instanceGroupManagerPolicyPatch.MetricValue) {
		_patch["metric_value"] = instanceGroupManagerPolicyPatch.MetricValue
	}
	if !core.IsNil(instanceGroupManagerPolicyPatch.Name) {
		_patch["name"] = instanceGroupManagerPolicyPatch.Name
	}

	return
}

// InstanceGroupManagerPolicyPrototype : InstanceGroupManagerPolicyPrototype struct
// Models which "extend" this model:
// - InstanceGroupManagerPolicyPrototypeInstanceGroupManagerTargetPolicyPrototype
type InstanceGroupManagerPolicyPrototype struct {
	// The name for this instance group manager policy. The name must not be used by another policy for the instance group
	// manager. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The type of metric to be evaluated.
	MetricType *string `json:"metric_type,omitempty"`

	// The metric value to be evaluated.
	MetricValue *int64 `json:"metric_value,omitempty"`

	// The type of policy for the instance group.
	PolicyType *string `json:"policy_type,omitempty"`
}

// Constants associated with the InstanceGroupManagerPolicyPrototype.MetricType property.
// The type of metric to be evaluated.
const (
	InstanceGroupManagerPolicyPrototypeMetricTypeCpuConst        = "cpu"
	InstanceGroupManagerPolicyPrototypeMetricTypeMemoryConst     = "memory"
	InstanceGroupManagerPolicyPrototypeMetricTypeNetworkInConst  = "network_in"
	InstanceGroupManagerPolicyPrototypeMetricTypeNetworkOutConst = "network_out"
)

// Constants associated with the InstanceGroupManagerPolicyPrototype.PolicyType property.
// The type of policy for the instance group.
const (
	InstanceGroupManagerPolicyPrototypePolicyTypeTargetConst = "target"
)

func (*InstanceGroupManagerPolicyPrototype) isaInstanceGroupManagerPolicyPrototype() bool {
	return true
}

type InstanceGroupManagerPolicyPrototypeIntf interface {
	isaInstanceGroupManagerPolicyPrototype() bool
}

// UnmarshalInstanceGroupManagerPolicyPrototype unmarshals an instance of InstanceGroupManagerPolicyPrototype from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPolicyPrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "metric_type", &obj.MetricType)
	if err != nil {
		err = core.SDKErrorf(err, "", "metric_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "metric_value", &obj.MetricValue)
	if err != nil {
		err = core.SDKErrorf(err, "", "metric_value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "policy_type", &obj.PolicyType)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerPolicyReference : InstanceGroupManagerPolicyReference struct
type InstanceGroupManagerPolicyReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance group manager policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group manager policy.
	ID *string `json:"id" validate:"required"`

	// The name for this instance group manager policy. The name is unique across all policies for the instance group
	// manager.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalInstanceGroupManagerPolicyReference unmarshals an instance of InstanceGroupManagerPolicyReference from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPolicyReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPolicyReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerPrototype : InstanceGroupManagerPrototype struct
// Models which "extend" this model:
// - InstanceGroupManagerPrototypeInstanceGroupManagerAutoScalePrototype
// - InstanceGroupManagerPrototypeInstanceGroupManagerScheduledPrototype
type InstanceGroupManagerPrototype struct {
	// Indicates whether this manager will control the instance group.
	ManagementEnabled *bool `json:"management_enabled,omitempty"`

	// The name for this instance group manager. The name must not be used by another manager for the instance group. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The time window in seconds to aggregate metrics prior to evaluation.
	AggregationWindow *int64 `json:"aggregation_window,omitempty"`

	// The duration of time in seconds to pause further scale actions after scaling has taken place.
	Cooldown *int64 `json:"cooldown,omitempty"`

	// The type of instance group manager.
	ManagerType *string `json:"manager_type,omitempty"`

	// The maximum number of members in a managed instance group.
	MaxMembershipCount *int64 `json:"max_membership_count,omitempty"`

	// The minimum number of members in a managed instance group.
	MinMembershipCount *int64 `json:"min_membership_count,omitempty"`
}

// Constants associated with the InstanceGroupManagerPrototype.ManagerType property.
// The type of instance group manager.
const (
	InstanceGroupManagerPrototypeManagerTypeAutoscaleConst = "autoscale"
)

func (*InstanceGroupManagerPrototype) isaInstanceGroupManagerPrototype() bool {
	return true
}

type InstanceGroupManagerPrototypeIntf interface {
	isaInstanceGroupManagerPrototype() bool
}

// UnmarshalInstanceGroupManagerPrototype unmarshals an instance of InstanceGroupManagerPrototype from the specified map of raw messages.
func UnmarshalInstanceGroupManagerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerPrototype)
	err = core.UnmarshalPrimitive(m, "management_enabled", &obj.ManagementEnabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "management_enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "aggregation_window", &obj.AggregationWindow)
	if err != nil {
		err = core.SDKErrorf(err, "", "aggregation_window-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cooldown", &obj.Cooldown)
	if err != nil {
		err = core.SDKErrorf(err, "", "cooldown-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "manager_type", &obj.ManagerType)
	if err != nil {
		err = core.SDKErrorf(err, "", "manager_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_membership_count", &obj.MaxMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min_membership_count", &obj.MinMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "min_membership_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerReference : InstanceGroupManagerReference struct
type InstanceGroupManagerReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance group manager.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group manager.
	ID *string `json:"id" validate:"required"`

	// The name for this instance group manager. The name is unique across all managers for the instance group.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalInstanceGroupManagerReference unmarshals an instance of InstanceGroupManagerReference from the specified map of raw messages.
func UnmarshalInstanceGroupManagerReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerScheduledActionGroup : InstanceGroupManagerScheduledActionGroup struct
type InstanceGroupManagerScheduledActionGroup struct {
	// The desired number of instance group members at the scheduled time.
	MembershipCount *int64 `json:"membership_count" validate:"required"`
}

// UnmarshalInstanceGroupManagerScheduledActionGroup unmarshals an instance of InstanceGroupManagerScheduledActionGroup from the specified map of raw messages.
func UnmarshalInstanceGroupManagerScheduledActionGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerScheduledActionGroup)
	err = core.UnmarshalPrimitive(m, "membership_count", &obj.MembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "membership_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerScheduledActionGroupPrototype : InstanceGroupManagerScheduledActionGroupPrototype struct
type InstanceGroupManagerScheduledActionGroupPrototype struct {
	// The desired number of instance group members at the scheduled time.
	MembershipCount *int64 `json:"membership_count" validate:"required"`
}

// NewInstanceGroupManagerScheduledActionGroupPrototype : Instantiate InstanceGroupManagerScheduledActionGroupPrototype (Generic Model Constructor)
func (*VpcV1) NewInstanceGroupManagerScheduledActionGroupPrototype(membershipCount int64) (_model *InstanceGroupManagerScheduledActionGroupPrototype, err error) {
	_model = &InstanceGroupManagerScheduledActionGroupPrototype{
		MembershipCount: core.Int64Ptr(membershipCount),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalInstanceGroupManagerScheduledActionGroupPrototype unmarshals an instance of InstanceGroupManagerScheduledActionGroupPrototype from the specified map of raw messages.
func UnmarshalInstanceGroupManagerScheduledActionGroupPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerScheduledActionGroupPrototype)
	err = core.UnmarshalPrimitive(m, "membership_count", &obj.MembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "membership_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerScheduledActionManager : InstanceGroupManagerScheduledActionManager struct
// Models which "extend" this model:
// - InstanceGroupManagerScheduledActionManagerAutoScale
type InstanceGroupManagerScheduledActionManager struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance group manager.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this instance group manager.
	ID *string `json:"id,omitempty"`

	// The name for this instance group manager. The name is unique across all managers for the instance group.
	Name *string `json:"name,omitempty"`

	// The desired maximum number of instance group members at the scheduled time.
	MaxMembershipCount *int64 `json:"max_membership_count,omitempty"`

	// The desired minimum number of instance group members at the scheduled time.
	MinMembershipCount *int64 `json:"min_membership_count,omitempty"`
}

func (*InstanceGroupManagerScheduledActionManager) isaInstanceGroupManagerScheduledActionManager() bool {
	return true
}

type InstanceGroupManagerScheduledActionManagerIntf interface {
	isaInstanceGroupManagerScheduledActionManager() bool
}

// UnmarshalInstanceGroupManagerScheduledActionManager unmarshals an instance of InstanceGroupManagerScheduledActionManager from the specified map of raw messages.
func UnmarshalInstanceGroupManagerScheduledActionManager(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerScheduledActionManager)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_membership_count", &obj.MaxMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min_membership_count", &obj.MinMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "min_membership_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupManagerScheduledActionManagerPrototype : InstanceGroupManagerScheduledActionManagerPrototype struct
// Models which "extend" this model:
// - InstanceGroupManagerScheduledActionManagerPrototypeAutoScalePrototype
type InstanceGroupManagerScheduledActionManagerPrototype struct {
	// The desired maximum number of instance group members at the scheduled time.
	MaxMembershipCount *int64 `json:"max_membership_count,omitempty"`

	// The desired minimum number of instance group members at the scheduled time.
	MinMembershipCount *int64 `json:"min_membership_count,omitempty"`

	// The unique identifier for this instance group manager.
	ID *string `json:"id,omitempty"`

	// The URL for this instance group manager.
	Href *string `json:"href,omitempty"`
}

func (*InstanceGroupManagerScheduledActionManagerPrototype) isaInstanceGroupManagerScheduledActionManagerPrototype() bool {
	return true
}

type InstanceGroupManagerScheduledActionManagerPrototypeIntf interface {
	isaInstanceGroupManagerScheduledActionManagerPrototype() bool
}

// UnmarshalInstanceGroupManagerScheduledActionManagerPrototype unmarshals an instance of InstanceGroupManagerScheduledActionManagerPrototype from the specified map of raw messages.
func UnmarshalInstanceGroupManagerScheduledActionManagerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupManagerScheduledActionManagerPrototype)
	err = core.UnmarshalPrimitive(m, "max_membership_count", &obj.MaxMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min_membership_count", &obj.MinMembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "min_membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupMembership : InstanceGroupMembership struct
type InstanceGroupMembership struct {
	// The date and time that the instance group manager policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// If set to true, when deleting the membership the instance will also be deleted.
	DeleteInstanceOnMembershipDelete *bool `json:"delete_instance_on_membership_delete" validate:"required"`

	// The URL for this instance group membership.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group membership.
	ID *string `json:"id" validate:"required"`

	Instance *InstanceReference `json:"instance" validate:"required"`

	InstanceTemplate *InstanceTemplateReference `json:"instance_template" validate:"required"`

	// The name for this instance group membership. The name is unique across all memberships for the instance group.
	Name *string `json:"name" validate:"required"`

	PoolMember *LoadBalancerPoolMemberReference `json:"pool_member,omitempty"`

	// The status of the instance group membership
	// - `deleting`: Membership is deleting dependent resources
	// - `failed`: Membership was unable to maintain dependent resources
	// - `healthy`: Membership is active and serving in the group
	// - `pending`: Membership is waiting for dependent resources
	// - `unhealthy`: Membership has unhealthy dependent resources
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The date and time that the instance group membership was updated.
	UpdatedAt *strfmt.DateTime `json:"updated_at" validate:"required"`
}

// Constants associated with the InstanceGroupMembership.Status property.
// The status of the instance group membership
// - `deleting`: Membership is deleting dependent resources
// - `failed`: Membership was unable to maintain dependent resources
// - `healthy`: Membership is active and serving in the group
// - `pending`: Membership is waiting for dependent resources
// - `unhealthy`: Membership has unhealthy dependent resources
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceGroupMembershipStatusDeletingConst  = "deleting"
	InstanceGroupMembershipStatusFailedConst    = "failed"
	InstanceGroupMembershipStatusHealthyConst   = "healthy"
	InstanceGroupMembershipStatusPendingConst   = "pending"
	InstanceGroupMembershipStatusUnhealthyConst = "unhealthy"
)

// UnmarshalInstanceGroupMembership unmarshals an instance of InstanceGroupMembership from the specified map of raw messages.
func UnmarshalInstanceGroupMembership(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupMembership)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "delete_instance_on_membership_delete", &obj.DeleteInstanceOnMembershipDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_instance_on_membership_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance", &obj.Instance, UnmarshalInstanceReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_template", &obj.InstanceTemplate, UnmarshalInstanceTemplateReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_template-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool_member", &obj.PoolMember, UnmarshalLoadBalancerPoolMemberReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool_member-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "updated_at", &obj.UpdatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "updated_at-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceGroupMembershipCollection : InstanceGroupMembershipCollection struct
type InstanceGroupMembershipCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A page of memberships for the instance group.
	Memberships []InstanceGroupMembership `json:"memberships" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceGroupMembershipCollection unmarshals an instance of InstanceGroupMembershipCollection from the specified map of raw messages.
func UnmarshalInstanceGroupMembershipCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupMembershipCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "memberships", &obj.Memberships, UnmarshalInstanceGroupMembership)
	if err != nil {
		err = core.SDKErrorf(err, "", "memberships-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *InstanceGroupMembershipCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// InstanceGroupMembershipPatch : InstanceGroupMembershipPatch struct
type InstanceGroupMembershipPatch struct {
	// If set to true, when deleting the membership the instance will also be deleted.
	DeleteInstanceOnMembershipDelete *bool `json:"delete_instance_on_membership_delete,omitempty"`

	// The name for this instance group membership. The name must not be used by another membership for the instance group
	// manager.
	Name *string `json:"name,omitempty"`
}

// UnmarshalInstanceGroupMembershipPatch unmarshals an instance of InstanceGroupMembershipPatch from the specified map of raw messages.
func UnmarshalInstanceGroupMembershipPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupMembershipPatch)
	err = core.UnmarshalPrimitive(m, "delete_instance_on_membership_delete", &obj.DeleteInstanceOnMembershipDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_instance_on_membership_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceGroupMembershipPatch
func (instanceGroupMembershipPatch *InstanceGroupMembershipPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupMembershipPatch.DeleteInstanceOnMembershipDelete) {
		_patch["delete_instance_on_membership_delete"] = instanceGroupMembershipPatch.DeleteInstanceOnMembershipDelete
	}
	if !core.IsNil(instanceGroupMembershipPatch.Name) {
		_patch["name"] = instanceGroupMembershipPatch.Name
	}

	return
}

// InstanceGroupPatch : To add or update load balancer specification for an instance group the `membership_count` must first be set to 0.
type InstanceGroupPatch struct {
	// The port to use for new load balancer pool members created by this instance group.
	//
	// This property must be set if and only if `load_balancer_pool` has been set.
	ApplicationPort *int64 `json:"application_port,omitempty"`

	// The instance template to use when creating new instances.
	//
	// The specified template must not have `default_trusted_profile.auto_link` set to `true`.
	InstanceTemplate InstanceTemplateIdentityIntf `json:"instance_template,omitempty"`

	// The load balancer associated with `load_balancer_pool`.
	// The load balancer must have `instance_groups_supported` set to `true`.
	//
	// This property must be set if and only if `load_balancer_pool` has been set.
	LoadBalancer LoadBalancerIdentityIntf `json:"load_balancer,omitempty"`

	// If specified, this instance group will manage the load balancer pool. A pool member
	// will be created for each instance created by this group.  The specified load
	// balancer pool must not be used by another instance group in the VPC.
	//
	// If set, `load_balancer` and `application_port` must also be set.
	LoadBalancerPool LoadBalancerPoolIdentityIntf `json:"load_balancer_pool,omitempty"`

	// The number of instances in the instance group.
	MembershipCount *int64 `json:"membership_count,omitempty"`

	// The name for this instance group. The name must not be used by another instance group in the region.
	Name *string `json:"name,omitempty"`

	// The subnets to use when creating new instances.
	Subnets []SubnetIdentityIntf `json:"subnets,omitempty"`
}

// UnmarshalInstanceGroupPatch unmarshals an instance of InstanceGroupPatch from the specified map of raw messages.
func UnmarshalInstanceGroupPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupPatch)
	err = core.UnmarshalPrimitive(m, "application_port", &obj.ApplicationPort)
	if err != nil {
		err = core.SDKErrorf(err, "", "application_port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_template", &obj.InstanceTemplate, UnmarshalInstanceTemplateIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_template-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "load_balancer", &obj.LoadBalancer, UnmarshalLoadBalancerIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "load_balancer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "load_balancer_pool", &obj.LoadBalancerPool, UnmarshalLoadBalancerPoolIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "load_balancer_pool-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "membership_count", &obj.MembershipCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "membership_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceGroupPatch
func (instanceGroupPatch *InstanceGroupPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceGroupPatch.ApplicationPort) {
		_patch["application_port"] = instanceGroupPatch.ApplicationPort
	}
	if !core.IsNil(instanceGroupPatch.InstanceTemplate) {
		_patch["instance_template"] = instanceGroupPatch.InstanceTemplate.asPatch()
	}
	if !core.IsNil(instanceGroupPatch.LoadBalancer) {
		_patch["load_balancer"] = instanceGroupPatch.LoadBalancer.asPatch()
	}
	if !core.IsNil(instanceGroupPatch.LoadBalancerPool) {
		_patch["load_balancer_pool"] = instanceGroupPatch.LoadBalancerPool.asPatch()
	}
	if !core.IsNil(instanceGroupPatch.MembershipCount) {
		_patch["membership_count"] = instanceGroupPatch.MembershipCount
	}
	if !core.IsNil(instanceGroupPatch.Name) {
		_patch["name"] = instanceGroupPatch.Name
	}
	if !core.IsNil(instanceGroupPatch.Subnets) {
		var subnetsPatches []map[string]interface{}
		for _, subnets := range instanceGroupPatch.Subnets {
			subnetsPatches = append(subnetsPatches, subnets.asPatch())
		}
		_patch["subnets"] = subnetsPatches
	}

	return
}

// InstanceGroupReference : InstanceGroupReference struct
type InstanceGroupReference struct {
	// The CRN for this instance group.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance group.
	ID *string `json:"id" validate:"required"`

	// The name for this instance group. The name is unique across all instance groups in the region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalInstanceGroupReference unmarshals an instance of InstanceGroupReference from the specified map of raw messages.
func UnmarshalInstanceGroupReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceGroupReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceHealthReason : InstanceHealthReason struct
type InstanceHealthReason struct {
	// A reason code for this health state:
	// - `reservation_capacity_unavailable`: The reservation affinity pool has no
	//   available capacity.
	// - `reservation_deleted`: The reservation affinity pool has a deleted reservation.
	// - `reservation_expired`: The reservation affinity pool has an expired reservation.
	// - `reservation_failed`: The reservation affinity pool has a failed reservation.
	//
	// See [health status reasons](https://cloud.ibm.com/docs/vpc?topic=vpc-server-health-status-reasons) for details. The
	// enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the InstanceHealthReason.Code property.
// A reason code for this health state:
//   - `reservation_capacity_unavailable`: The reservation affinity pool has no
//     available capacity.
//   - `reservation_deleted`: The reservation affinity pool has a deleted reservation.
//   - `reservation_expired`: The reservation affinity pool has an expired reservation.
//   - `reservation_failed`: The reservation affinity pool has a failed reservation.
//
// See [health status reasons](https://cloud.ibm.com/docs/vpc?topic=vpc-server-health-status-reasons) for details. The
// enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceHealthReasonCodeReservationCapacityUnavailableConst = "reservation_capacity_unavailable"
	InstanceHealthReasonCodeReservationDeletedConst             = "reservation_deleted"
	InstanceHealthReasonCodeReservationExpiredConst             = "reservation_expired"
	InstanceHealthReasonCodeReservationFailedConst              = "reservation_failed"
)

// UnmarshalInstanceHealthReason unmarshals an instance of InstanceHealthReason from the specified map of raw messages.
func UnmarshalInstanceHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceInitialization : InstanceInitialization struct
type InstanceInitialization struct {
	// The default trusted profile configuration specified at virtual server instance
	// creation. If absent, no default trusted profile was specified.
	DefaultTrustedProfile *InstanceInitializationDefaultTrustedProfile `json:"default_trusted_profile,omitempty"`

	// The public SSH keys used at instance initialization.
	Keys []KeyReference `json:"keys" validate:"required"`

	Password *InstanceInitializationPassword `json:"password,omitempty"`
}

// UnmarshalInstanceInitialization unmarshals an instance of InstanceInitialization from the specified map of raw messages.
func UnmarshalInstanceInitialization(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceInitialization)
	err = core.UnmarshalModel(m, "default_trusted_profile", &obj.DefaultTrustedProfile, UnmarshalInstanceInitializationDefaultTrustedProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_trusted_profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "password", &obj.Password, UnmarshalInstanceInitializationPassword)
	if err != nil {
		err = core.SDKErrorf(err, "", "password-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceInitializationDefaultTrustedProfile : InstanceInitializationDefaultTrustedProfile struct
type InstanceInitializationDefaultTrustedProfile struct {
	// If set to `true`, the system created a link to the specified `target` trusted profile during instance creation.
	// Regardless of whether a link was created by the system or manually using the IAM Identity service, it will be
	// automatically deleted when the instance is deleted.
	AutoLink *bool `json:"auto_link" validate:"required"`

	// The default IAM trusted profile to use for this virtual server instance.
	Target *TrustedProfileReference `json:"target" validate:"required"`
}

// UnmarshalInstanceInitializationDefaultTrustedProfile unmarshals an instance of InstanceInitializationDefaultTrustedProfile from the specified map of raw messages.
func UnmarshalInstanceInitializationDefaultTrustedProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceInitializationDefaultTrustedProfile)
	err = core.UnmarshalPrimitive(m, "auto_link", &obj.AutoLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_link-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalTrustedProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceInitializationPassword : InstanceInitializationPassword struct
type InstanceInitializationPassword struct {
	// The administrator password at initialization, encrypted using `encryption_key`, and returned base64-encoded.
	EncryptedPassword *[]byte `json:"encrypted_password" validate:"required"`

	// The public SSH key used to encrypt the administrator password.
	EncryptionKey *KeyIdentityByFingerprint `json:"encryption_key" validate:"required"`
}

// UnmarshalInstanceInitializationPassword unmarshals an instance of InstanceInitializationPassword from the specified map of raw messages.
func UnmarshalInstanceInitializationPassword(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceInitializationPassword)
	err = core.UnmarshalPrimitive(m, "encrypted_password", &obj.EncryptedPassword)
	if err != nil {
		err = core.SDKErrorf(err, "", "encrypted_password-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalKeyIdentityByFingerprint)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceLifecycleReason : InstanceLifecycleReason struct
type InstanceLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `failed_registration`: the instance's registration to Resource Controller has
	//   failed. Delete the instance and provision it again. If the problem persists,
	//   contact IBM Support.
	// - `internal_error`: internal error (contact IBM support)
	// - `pending_registration`: the instance's registration to Resource Controller is
	//   being processed.
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the InstanceLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `failed_registration`: the instance's registration to Resource Controller has
//     failed. Delete the instance and provision it again. If the problem persists,
//     contact IBM Support.
//   - `internal_error`: internal error (contact IBM support)
//   - `pending_registration`: the instance's registration to Resource Controller is
//     being processed.
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceLifecycleReasonCodeFailedRegistrationConst          = "failed_registration"
	InstanceLifecycleReasonCodeInternalErrorConst               = "internal_error"
	InstanceLifecycleReasonCodePendingRegistrationConst         = "pending_registration"
	InstanceLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalInstanceLifecycleReason unmarshals an instance of InstanceLifecycleReason from the specified map of raw messages.
func UnmarshalInstanceLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceMetadataService : The metadata service configuration.
type InstanceMetadataService struct {
	// Indicates whether the metadata service endpoint is available to the virtual server instance.
	Enabled *bool `json:"enabled" validate:"required"`

	// The communication protocol to use for the metadata service endpoint. Applies only when the metadata service is
	// enabled.
	// - `http`: HTTP protocol (unencrypted)
	// - `https`: HTTP Secure protocol.
	Protocol *string `json:"protocol" validate:"required"`

	// The hop limit (IP time to live) for IP response packets from the metadata service. Applies only when the metadata
	// service is enabled.
	ResponseHopLimit *int64 `json:"response_hop_limit" validate:"required"`
}

// Constants associated with the InstanceMetadataService.Protocol property.
// The communication protocol to use for the metadata service endpoint. Applies only when the metadata service is
// enabled.
// - `http`: HTTP protocol (unencrypted)
// - `https`: HTTP Secure protocol.
const (
	InstanceMetadataServiceProtocolHTTPConst  = "http"
	InstanceMetadataServiceProtocolHTTPSConst = "https"
)

// UnmarshalInstanceMetadataService unmarshals an instance of InstanceMetadataService from the specified map of raw messages.
func UnmarshalInstanceMetadataService(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceMetadataService)
	err = core.UnmarshalPrimitive(m, "enabled", &obj.Enabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "response_hop_limit", &obj.ResponseHopLimit)
	if err != nil {
		err = core.SDKErrorf(err, "", "response_hop_limit-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceMetadataServicePatch : The metadata service configuration.
type InstanceMetadataServicePatch struct {
	// Indicates whether the metadata service endpoint will be available to the virtual server instance.
	Enabled *bool `json:"enabled,omitempty"`

	// The communication protocol to use for the metadata service endpoint. Applies only when the metadata service is
	// enabled.
	// - `http`: HTTP protocol (unencrypted)
	// - `https`: HTTP Secure protocol.
	Protocol *string `json:"protocol,omitempty"`

	// The hop limit (IP time to live) for IP response packets from the metadata service. Applies only when the metadata
	// service is enabled.
	ResponseHopLimit *int64 `json:"response_hop_limit,omitempty"`
}

// Constants associated with the InstanceMetadataServicePatch.Protocol property.
// The communication protocol to use for the metadata service endpoint. Applies only when the metadata service is
// enabled.
// - `http`: HTTP protocol (unencrypted)
// - `https`: HTTP Secure protocol.
const (
	InstanceMetadataServicePatchProtocolHTTPConst  = "http"
	InstanceMetadataServicePatchProtocolHTTPSConst = "https"
)

// UnmarshalInstanceMetadataServicePatch unmarshals an instance of InstanceMetadataServicePatch from the specified map of raw messages.
func UnmarshalInstanceMetadataServicePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceMetadataServicePatch)
	err = core.UnmarshalPrimitive(m, "enabled", &obj.Enabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "response_hop_limit", &obj.ResponseHopLimit)
	if err != nil {
		err = core.SDKErrorf(err, "", "response_hop_limit-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstanceMetadataServicePatch
func (instanceMetadataServicePatch *InstanceMetadataServicePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceMetadataServicePatch.Enabled) {
		_patch["enabled"] = instanceMetadataServicePatch.Enabled
	}
	if !core.IsNil(instanceMetadataServicePatch.Protocol) {
		_patch["protocol"] = instanceMetadataServicePatch.Protocol
	}
	if !core.IsNil(instanceMetadataServicePatch.ResponseHopLimit) {
		_patch["response_hop_limit"] = instanceMetadataServicePatch.ResponseHopLimit
	}

	return
}

// InstanceMetadataServicePrototype : The metadata service configuration.
type InstanceMetadataServicePrototype struct {
	// Indicates whether the metadata service endpoint will be available to the virtual server instance.
	Enabled *bool `json:"enabled,omitempty"`

	// The communication protocol to use for the metadata service endpoint. Applies only when the metadata service is
	// enabled.
	// - `http`: HTTP protocol (unencrypted)
	// - `https`: HTTP Secure protocol.
	Protocol *string `json:"protocol,omitempty"`

	// The hop limit (IP time to live) for IP response packets from the metadata service. Applies only when the metadata
	// service is enabled.
	ResponseHopLimit *int64 `json:"response_hop_limit,omitempty"`
}

// Constants associated with the InstanceMetadataServicePrototype.Protocol property.
// The communication protocol to use for the metadata service endpoint. Applies only when the metadata service is
// enabled.
// - `http`: HTTP protocol (unencrypted)
// - `https`: HTTP Secure protocol.
const (
	InstanceMetadataServicePrototypeProtocolHTTPConst  = "http"
	InstanceMetadataServicePrototypeProtocolHTTPSConst = "https"
)

// UnmarshalInstanceMetadataServicePrototype unmarshals an instance of InstanceMetadataServicePrototype from the specified map of raw messages.
func UnmarshalInstanceMetadataServicePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceMetadataServicePrototype)
	err = core.UnmarshalPrimitive(m, "enabled", &obj.Enabled)
	if err != nil {
		err = core.SDKErrorf(err, "", "enabled-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "response_hop_limit", &obj.ResponseHopLimit)
	if err != nil {
		err = core.SDKErrorf(err, "", "response_hop_limit-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceNetworkAttachment : InstanceNetworkAttachment struct
type InstanceNetworkAttachment struct {
	// The date and time that the instance network attachment was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this instance network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance network attachment.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the instance network attachment.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this instance network attachment. The name is unique across all network attachments for the instance.
	Name *string `json:"name" validate:"required"`

	// The port speed for this instance network attachment in Mbps.
	PortSpeed *int64 `json:"port_speed" validate:"required"`

	// The primary IP address of the virtual network interface for the instance network
	// attachment.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The subnet of the virtual network interface for the instance network attachment.
	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The instance network attachment type.
	Type *string `json:"type" validate:"required"`

	// The virtual network interface for this instance network attachment.
	VirtualNetworkInterface *VirtualNetworkInterfaceReferenceAttachmentContext `json:"virtual_network_interface" validate:"required"`
}

// Constants associated with the InstanceNetworkAttachment.LifecycleState property.
// The lifecycle state of the instance network attachment.
const (
	InstanceNetworkAttachmentLifecycleStateDeletingConst  = "deleting"
	InstanceNetworkAttachmentLifecycleStateFailedConst    = "failed"
	InstanceNetworkAttachmentLifecycleStatePendingConst   = "pending"
	InstanceNetworkAttachmentLifecycleStateStableConst    = "stable"
	InstanceNetworkAttachmentLifecycleStateSuspendedConst = "suspended"
	InstanceNetworkAttachmentLifecycleStateUpdatingConst  = "updating"
	InstanceNetworkAttachmentLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the InstanceNetworkAttachment.ResourceType property.
// The resource type.
const (
	InstanceNetworkAttachmentResourceTypeInstanceNetworkAttachmentConst = "instance_network_attachment"
)

// Constants associated with the InstanceNetworkAttachment.Type property.
// The instance network attachment type.
const (
	InstanceNetworkAttachmentTypePrimaryConst   = "primary"
	InstanceNetworkAttachmentTypeSecondaryConst = "secondary"
)

// UnmarshalInstanceNetworkAttachment unmarshals an instance of InstanceNetworkAttachment from the specified map of raw messages.
func UnmarshalInstanceNetworkAttachment(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceNetworkAttachment)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_speed", &obj.PortSpeed)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_speed-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalVirtualNetworkInterfaceReferenceAttachmentContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceNetworkAttachmentCollection : InstanceNetworkAttachmentCollection struct
type InstanceNetworkAttachmentCollection struct {
	// The network attachments for the instance.
	NetworkAttachments []InstanceNetworkAttachment `json:"network_attachments" validate:"required"`
}

// UnmarshalInstanceNetworkAttachmentCollection unmarshals an instance of InstanceNetworkAttachmentCollection from the specified map of raw messages.
func UnmarshalInstanceNetworkAttachmentCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceNetworkAttachmentCollection)
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalInstanceNetworkAttachment)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceNetworkAttachmentPatch : InstanceNetworkAttachmentPatch struct
type InstanceNetworkAttachmentPatch struct {
	// The name for this network attachment. The name must not be used by another network attachment for the instance.
	Name *string `json:"name,omitempty"`
}

// UnmarshalInstanceNetworkAttachmentPatch unmarshals an instance of InstanceNetworkAttachmentPatch from the specified map of raw messages.
func UnmarshalInstanceNetworkAttachmentPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceNetworkAttachmentPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceNetworkAttachmentPatch
func (instanceNetworkAttachmentPatch *InstanceNetworkAttachmentPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceNetworkAttachmentPatch.Name) {
		_patch["name"] = instanceNetworkAttachmentPatch.Name
	}

	return
}

// InstanceNetworkAttachmentPrototype : InstanceNetworkAttachmentPrototype struct
type InstanceNetworkAttachmentPrototype struct {
	// The name for this network attachment. Names must be unique within the instance the network attachment resides in. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// A virtual network interface for the instance network attachment. This can be specified
	// using an existing virtual network interface, or a prototype object for a new virtual
	// network interface.
	//
	// If an existing virtual network interface is specified, `enable_infrastructure_nat` must be
	// `true`.
	VirtualNetworkInterface InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf `json:"virtual_network_interface" validate:"required"`
}

// NewInstanceNetworkAttachmentPrototype : Instantiate InstanceNetworkAttachmentPrototype (Generic Model Constructor)
func (*VpcV1) NewInstanceNetworkAttachmentPrototype(virtualNetworkInterface InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf) (_model *InstanceNetworkAttachmentPrototype, err error) {
	_model = &InstanceNetworkAttachmentPrototype{
		VirtualNetworkInterface: virtualNetworkInterface,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalInstanceNetworkAttachmentPrototype unmarshals an instance of InstanceNetworkAttachmentPrototype from the specified map of raw messages.
func UnmarshalInstanceNetworkAttachmentPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceNetworkAttachmentPrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalInstanceNetworkAttachmentPrototypeVirtualNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceNetworkAttachmentPrototypeVirtualNetworkInterface : A virtual network interface for the instance network attachment. This can be specified using an existing virtual
// network interface, or a prototype object for a new virtual network interface.
//
// If an existing virtual network interface is specified, `enable_infrastructure_nat` must be
// `true`.
// Models which "extend" this model:
// - InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceVirtualNetworkInterfacePrototypeInstanceNetworkAttachmentContext
// - InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceVirtualNetworkInterfaceIdentity
type InstanceNetworkAttachmentPrototypeVirtualNetworkInterface struct {
	// Indicates whether source IP spoofing is allowed on this interface. If `false`, source IP spoofing is prevented on
	// this interface. If `true`, source IP spoofing is allowed on this interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// Indicates whether this virtual network interface will be automatically deleted when
	// `target` is deleted.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the virtual network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - Can only be attached to a `target` with a `resource_type` of
	//   `bare_metal_server_network_attachment`.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The additional IP addresses to bind to the virtual network interface. Each item may be either a reserved IP
	// identity, or a reserved IP prototype object which will be used to create a new reserved IP. All IP addresses must be
	// in the primary IP's subnet.
	//
	// If reserved IP identities are provided, the specified reserved IPs must be unbound.
	//
	// If reserved IP prototype objects with addresses are provided, the addresses must be available on the virtual network
	// interface's subnet. For any prototype objects that do not specify an address, an available address on the subnet
	// will be automatically selected and reserved.
	Ips []VirtualNetworkInterfaceIPPrototypeIntf `json:"ips,omitempty"`

	// The name for this virtual network interface. The name must not be used by another virtual network interface in the
	// VPC. If unspecified, the name will be a hyphenated list of randomly-selected words. Names beginning with `ibm-` are
	// reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the virtual network interface. May be either a
	// reserved IP identity, or a reserved IP prototype object which will be used to create a
	// new reserved IP.
	//
	// If a reserved IP identity is provided, the specified reserved IP must be unbound.
	//
	// If a reserved IP prototype object with an address is provided, the address must be
	// available on the virtual network interface's subnet. If no address is specified,
	// an available address on the subnet will be automatically selected and reserved.
	PrimaryIP VirtualNetworkInterfacePrimaryIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The protocol state filtering mode to use for this virtual network interface. If
	// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
	// resource type:
	//
	// - `bare_metal_server_network_attachment`: disabled
	// - `instance_network_attachment`: enabled
	// - `share_mount_target`: enabled
	//
	// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
	// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
	// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
	ProtocolStateFilteringMode *string `json:"protocol_state_filtering_mode,omitempty"`

	// The resource group to use for this virtual network interface. If unspecified, the
	// virtual server instance's resource group will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The security groups to use for this virtual network interface. If unspecified, the default security group of the VPC
	// for the subnet is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet. Required if `primary_ip` does not specify a reserved IP
	// identity.
	Subnet SubnetIdentityIntf `json:"subnet,omitempty"`

	// The unique identifier for this virtual network interface.
	ID *string `json:"id,omitempty"`

	// The URL for this virtual network interface.
	Href *string `json:"href,omitempty"`

	// The CRN for this virtual network interface.
	CRN *string `json:"crn,omitempty"`
}

// Constants associated with the InstanceNetworkAttachmentPrototypeVirtualNetworkInterface.ProtocolStateFilteringMode property.
// The protocol state filtering mode to use for this virtual network interface. If
// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
// resource type:
//
// - `bare_metal_server_network_attachment`: disabled
// - `instance_network_attachment`: enabled
// - `share_mount_target`: enabled
//
// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
const (
	InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceProtocolStateFilteringModeAutoConst     = "auto"
	InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceProtocolStateFilteringModeDisabledConst = "disabled"
	InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceProtocolStateFilteringModeEnabledConst  = "enabled"
)

func (*InstanceNetworkAttachmentPrototypeVirtualNetworkInterface) isaInstanceNetworkAttachmentPrototypeVirtualNetworkInterface() bool {
	return true
}

type InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf interface {
	isaInstanceNetworkAttachmentPrototypeVirtualNetworkInterface() bool
}

// UnmarshalInstanceNetworkAttachmentPrototypeVirtualNetworkInterface unmarshals an instance of InstanceNetworkAttachmentPrototypeVirtualNetworkInterface from the specified map of raw messages.
func UnmarshalInstanceNetworkAttachmentPrototypeVirtualNetworkInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceNetworkAttachmentPrototypeVirtualNetworkInterface)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_infrastructure_nat", &obj.EnableInfrastructureNat)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_infrastructure_nat-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalVirtualNetworkInterfaceIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalVirtualNetworkInterfacePrimaryIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol_state_filtering_mode", &obj.ProtocolStateFilteringMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol_state_filtering_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceNetworkAttachmentReference : InstanceNetworkAttachmentReference struct
type InstanceNetworkAttachmentReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this instance network attachment. The name is unique across all network attachments for the instance.
	Name *string `json:"name" validate:"required"`

	// The primary IP address of the virtual network interface for the instance network
	// attachment.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The subnet of the virtual network interface for the instance network attachment.
	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The virtual network interface for this instance network attachment.
	VirtualNetworkInterface *VirtualNetworkInterfaceReferenceAttachmentContext `json:"virtual_network_interface" validate:"required"`
}

// Constants associated with the InstanceNetworkAttachmentReference.ResourceType property.
// The resource type.
const (
	InstanceNetworkAttachmentReferenceResourceTypeInstanceNetworkAttachmentConst = "instance_network_attachment"
)

// UnmarshalInstanceNetworkAttachmentReference unmarshals an instance of InstanceNetworkAttachmentReference from the specified map of raw messages.
func UnmarshalInstanceNetworkAttachmentReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceNetworkAttachmentReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalVirtualNetworkInterfaceReferenceAttachmentContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstancePatch : InstancePatch struct
type InstancePatch struct {
	// The availability policy for this virtual server instance.
	AvailabilityPolicy *InstanceAvailabilityPolicyPatch `json:"availability_policy,omitempty"`

	// The confidential compute mode to use for this virtual server instance.
	//
	// For this property to be changed, the virtual server instance `status` must be
	// `stopping` or `stopped`.
	ConfidentialComputeMode *string `json:"confidential_compute_mode,omitempty"`

	// Indicates whether secure boot is enabled for this virtual server instance.
	//
	// For this property to be changed, the virtual server instance `status` must be
	// `stopping` or `stopped`.
	EnableSecureBoot *bool `json:"enable_secure_boot,omitempty"`

	// The metadata service configuration.
	MetadataService *InstanceMetadataServicePatch `json:"metadata_service,omitempty"`

	// The name for this virtual server instance. The name must not be used by another virtual server instance in the
	// region. Changing the name will not affect the system hostname.
	Name *string `json:"name,omitempty"`

	// The placement restrictions to use for the virtual server instance. For the
	// placement restrictions to be changed, the instance `status` must be `stopping` or
	// `stopped`.
	//
	// If set, `reservation_affinity.policy` must be `disabled`.
	PlacementTarget InstancePlacementTargetPatchIntf `json:"placement_target,omitempty"`

	// The profile to use for this virtual server instance. Any disks associated with the
	// current profile will be deleted, and any disks associated with the requested profile
	// will be created.
	//
	// For the profile to be changed, the instance `status` must be `stopping` or `stopped`.
	// In addition, the requested profile must:
	// - Be compatible with any `placement_target` constraints. For example, if the
	//   instance is placed on a dedicated host, the requested profile `family` must be
	//   the same as the dedicated host `family`.
	// - Have the same `vcpu.architecture`.
	// - Support the number of network attachments or network interfaces the instance
	//   currently has.
	Profile InstancePatchProfileIntf `json:"profile,omitempty"`

	ReservationAffinity *InstanceReservationAffinityPatch `json:"reservation_affinity,omitempty"`

	// The amount of bandwidth (in megabits per second) allocated exclusively to instance storage volumes. An increase in
	// this value will result in a corresponding decrease to
	// `total_network_bandwidth`.
	TotalVolumeBandwidth *int64 `json:"total_volume_bandwidth,omitempty"`
}

// Constants associated with the InstancePatch.ConfidentialComputeMode property.
// The confidential compute mode to use for this virtual server instance.
//
// For this property to be changed, the virtual server instance `status` must be
// `stopping` or `stopped`.
const (
	InstancePatchConfidentialComputeModeDisabledConst = "disabled"
	InstancePatchConfidentialComputeModeSgxConst      = "sgx"
	InstancePatchConfidentialComputeModeTdxConst      = "tdx"
)

// UnmarshalInstancePatch unmarshals an instance of InstancePatch from the specified map of raw messages.
func UnmarshalInstancePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstancePatch)
	err = core.UnmarshalModel(m, "availability_policy", &obj.AvailabilityPolicy, UnmarshalInstanceAvailabilityPolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "availability_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "confidential_compute_mode", &obj.ConfidentialComputeMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "confidential_compute_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "metadata_service", &obj.MetadataService, UnmarshalInstanceMetadataServicePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "metadata_service-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "placement_target", &obj.PlacementTarget, UnmarshalInstancePlacementTargetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "placement_target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalInstancePatchProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalInstanceReservationAffinityPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_volume_bandwidth", &obj.TotalVolumeBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_volume_bandwidth-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstancePatch
func (instancePatch *InstancePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instancePatch.AvailabilityPolicy) {
		_patch["availability_policy"] = instancePatch.AvailabilityPolicy.asPatch()
	}
	if !core.IsNil(instancePatch.ConfidentialComputeMode) {
		_patch["confidential_compute_mode"] = instancePatch.ConfidentialComputeMode
	}
	if !core.IsNil(instancePatch.EnableSecureBoot) {
		_patch["enable_secure_boot"] = instancePatch.EnableSecureBoot
	}
	if !core.IsNil(instancePatch.MetadataService) {
		_patch["metadata_service"] = instancePatch.MetadataService.asPatch()
	}
	if !core.IsNil(instancePatch.Name) {
		_patch["name"] = instancePatch.Name
	}
	if !core.IsNil(instancePatch.PlacementTarget) {
		_patch["placement_target"] = instancePatch.PlacementTarget.asPatch()
	}
	if !core.IsNil(instancePatch.Profile) {
		_patch["profile"] = instancePatch.Profile.asPatch()
	}
	if !core.IsNil(instancePatch.ReservationAffinity) {
		_patch["reservation_affinity"] = instancePatch.ReservationAffinity.asPatch()
	}
	if !core.IsNil(instancePatch.TotalVolumeBandwidth) {
		_patch["total_volume_bandwidth"] = instancePatch.TotalVolumeBandwidth
	}

	return
}

// InstancePatchProfile : The profile to use for this virtual server instance. Any disks associated with the current profile will be deleted,
// and any disks associated with the requested profile will be created.
//
// For the profile to be changed, the instance `status` must be `stopping` or `stopped`. In addition, the requested
// profile must:
//   - Be compatible with any `placement_target` constraints. For example, if the
//     instance is placed on a dedicated host, the requested profile `family` must be
//     the same as the dedicated host `family`.
//   - Have the same `vcpu.architecture`.
//   - Support the number of network attachments or network interfaces the instance
//     currently has.
//
// Models which "extend" this model:
// - InstancePatchProfileInstanceProfileIdentityByName
// - InstancePatchProfileInstanceProfileIdentityByHref
type InstancePatchProfile struct {
	// The globally unique name for this virtual server instance profile.
	Name *string `json:"name,omitempty"`

	// The URL for this virtual server instance profile.
	Href *string `json:"href,omitempty"`
}

func (*InstancePatchProfile) isaInstancePatchProfile() bool {
	return true
}

type InstancePatchProfileIntf interface {
	isaInstancePatchProfile() bool
	asPatch() map[string]interface{}
}

// UnmarshalInstancePatchProfile unmarshals an instance of InstancePatchProfile from the specified map of raw messages.
func UnmarshalInstancePatchProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstancePatchProfile)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstancePatchProfile
func (instancePatchProfile *InstancePatchProfile) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instancePatchProfile.Name) {
		_patch["name"] = instancePatchProfile.Name
	}
	if !core.IsNil(instancePatchProfile.Href) {
		_patch["href"] = instancePatchProfile.Href
	}

	return
}

// InstancePlacementTarget : The placement restrictions for the virtual server instance.
// Models which "extend" this model:
// - InstancePlacementTargetDedicatedHostGroupReference
// - InstancePlacementTargetDedicatedHostReference
// - InstancePlacementTargetPlacementGroupReference
type InstancePlacementTarget struct {
	// The CRN for this dedicated host group.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this dedicated host group.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this dedicated host group.
	ID *string `json:"id,omitempty"`

	// The name for this dedicated host group. The name is unique across all dedicated host groups in the region.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the InstancePlacementTarget.ResourceType property.
// The resource type.
const (
	InstancePlacementTargetResourceTypeDedicatedHostGroupConst = "dedicated_host_group"
)

func (*InstancePlacementTarget) isaInstancePlacementTarget() bool {
	return true
}

type InstancePlacementTargetIntf interface {
	isaInstancePlacementTarget() bool
}

// UnmarshalInstancePlacementTarget unmarshals an instance of InstancePlacementTarget from the specified map of raw messages.
func UnmarshalInstancePlacementTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstancePlacementTarget)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstancePlacementTargetPatch : The placement restrictions to use for the virtual server instance. For the placement restrictions to be changed, the
// instance `status` must be `stopping` or
// `stopped`.
//
// If set, `reservation_affinity.policy` must be `disabled`.
// Models which "extend" this model:
// - InstancePlacementTargetPatchDedicatedHostIdentity
// - InstancePlacementTargetPatchDedicatedHostGroupIdentity
type InstancePlacementTargetPatch struct {
	// The unique identifier for this dedicated host.
	ID *string `json:"id,omitempty"`

	// The CRN for this dedicated host.
	CRN *string `json:"crn,omitempty"`

	// The URL for this dedicated host.
	Href *string `json:"href,omitempty"`
}

func (*InstancePlacementTargetPatch) isaInstancePlacementTargetPatch() bool {
	return true
}

type InstancePlacementTargetPatchIntf interface {
	isaInstancePlacementTargetPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalInstancePlacementTargetPatch unmarshals an instance of InstancePlacementTargetPatch from the specified map of raw messages.
func UnmarshalInstancePlacementTargetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstancePlacementTargetPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstancePlacementTargetPatch
func (instancePlacementTargetPatch *InstancePlacementTargetPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instancePlacementTargetPatch.ID) {
		_patch["id"] = instancePlacementTargetPatch.ID
	}
	if !core.IsNil(instancePlacementTargetPatch.CRN) {
		_patch["crn"] = instancePlacementTargetPatch.CRN
	}
	if !core.IsNil(instancePlacementTargetPatch.Href) {
		_patch["href"] = instancePlacementTargetPatch.Href
	}

	return
}

// InstancePlacementTargetPrototype : The placement restrictions to use for the virtual server instance.
//
// If specified, `reservation_affinity.policy` must be `disabled`.
// Models which "extend" this model:
// - InstancePlacementTargetPrototypeDedicatedHostIdentity
// - InstancePlacementTargetPrototypeDedicatedHostGroupIdentity
// - InstancePlacementTargetPrototypePlacementGroupIdentity
type InstancePlacementTargetPrototype struct {
	// The unique identifier for this dedicated host.
	ID *string `json:"id,omitempty"`

	// The CRN for this dedicated host.
	CRN *string `json:"crn,omitempty"`

	// The URL for this dedicated host.
	Href *string `json:"href,omitempty"`
}

func (*InstancePlacementTargetPrototype) isaInstancePlacementTargetPrototype() bool {
	return true
}

type InstancePlacementTargetPrototypeIntf interface {
	isaInstancePlacementTargetPrototype() bool
}

// UnmarshalInstancePlacementTargetPrototype unmarshals an instance of InstancePlacementTargetPrototype from the specified map of raw messages.
func UnmarshalInstancePlacementTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstancePlacementTargetPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfile : InstanceProfile struct
type InstanceProfile struct {
	Bandwidth InstanceProfileBandwidthIntf `json:"bandwidth" validate:"required"`

	ClusterNetworkAttachmentCount InstanceProfileClusterNetworkAttachmentCountIntf `json:"cluster_network_attachment_count" validate:"required"`

	ConfidentialComputeModes *InstanceProfileSupportedConfidentialComputeModes `json:"confidential_compute_modes" validate:"required"`

	// The disks for an instance with this profile.
	Disks []InstanceProfileDisk `json:"disks" validate:"required"`

	// The product family this virtual server instance profile belongs to.
	Family *string `json:"family" validate:"required"`

	GpuCount InstanceProfileGpuIntf `json:"gpu_count,omitempty"`

	GpuManufacturer *InstanceProfileGpuManufacturer `json:"gpu_manufacturer,omitempty"`

	GpuMemory InstanceProfileGpuMemoryIntf `json:"gpu_memory,omitempty"`

	GpuModel *InstanceProfileGpuModel `json:"gpu_model,omitempty"`

	// The URL for this virtual server instance profile.
	Href *string `json:"href" validate:"required"`

	Memory InstanceProfileMemoryIntf `json:"memory" validate:"required"`

	// The globally unique name for this virtual server instance profile.
	Name *string `json:"name" validate:"required"`

	NetworkAttachmentCount InstanceProfileNetworkAttachmentCountIntf `json:"network_attachment_count" validate:"required"`

	NetworkInterfaceCount InstanceProfileNetworkInterfaceCountIntf `json:"network_interface_count" validate:"required"`

	NumaCount InstanceProfileNumaCountIntf `json:"numa_count,omitempty"`

	OsArchitecture *InstanceProfileOsArchitecture `json:"os_architecture" validate:"required"`

	PortSpeed InstanceProfilePortSpeedIntf `json:"port_speed" validate:"required"`

	ReservationTerms *InstanceProfileReservationTerms `json:"reservation_terms" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	SecureBootModes *InstanceProfileSupportedSecureBootModes `json:"secure_boot_modes" validate:"required"`

	// The status of the instance profile:
	// - `previous`:  This instance profile is an older revision, but remains provisionable and
	//   usable.
	// - `current`:  This profile is the latest revision.
	//
	// Revisions are indicated by the generation of an instance profile. Refer to the [profile naming
	// conventions](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles&interface=ui#profiles-naming-rule) for information on
	// how generations are defined within an instance profile.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The cluster network profiles that support this instance profile.
	SupportedClusterNetworkProfiles []ClusterNetworkProfileReference `json:"supported_cluster_network_profiles" validate:"required"`

	TotalVolumeBandwidth InstanceProfileVolumeBandwidthIntf `json:"total_volume_bandwidth" validate:"required"`

	VcpuArchitecture *InstanceProfileVcpuArchitecture `json:"vcpu_architecture" validate:"required"`

	VcpuCount InstanceProfileVcpuIntf `json:"vcpu_count" validate:"required"`

	VcpuManufacturer InstanceProfileVcpuManufacturerIntf `json:"vcpu_manufacturer" validate:"required"`
}

// Constants associated with the InstanceProfile.ResourceType property.
// The resource type.
const (
	InstanceProfileResourceTypeInstanceProfileConst = "instance_profile"
)

// Constants associated with the InstanceProfile.Status property.
// The status of the instance profile:
//   - `previous`:  This instance profile is an older revision, but remains provisionable and
//     usable.
//   - `current`:  This profile is the latest revision.
//
// Revisions are indicated by the generation of an instance profile. Refer to the [profile naming
// conventions](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles&interface=ui#profiles-naming-rule) for information on
// how generations are defined within an instance profile.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceProfileStatusCurrentConst  = "current"
	InstanceProfileStatusPreviousConst = "previous"
)

// UnmarshalInstanceProfile unmarshals an instance of InstanceProfile from the specified map of raw messages.
func UnmarshalInstanceProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfile)
	err = core.UnmarshalModel(m, "bandwidth", &obj.Bandwidth, UnmarshalInstanceProfileBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cluster_network_attachment_count", &obj.ClusterNetworkAttachmentCount, UnmarshalInstanceProfileClusterNetworkAttachmentCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_attachment_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "confidential_compute_modes", &obj.ConfidentialComputeModes, UnmarshalInstanceProfileSupportedConfidentialComputeModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "confidential_compute_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "disks", &obj.Disks, UnmarshalInstanceProfileDisk)
	if err != nil {
		err = core.SDKErrorf(err, "", "disks-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "gpu_count", &obj.GpuCount, UnmarshalInstanceProfileGpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "gpu_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "gpu_manufacturer", &obj.GpuManufacturer, UnmarshalInstanceProfileGpuManufacturer)
	if err != nil {
		err = core.SDKErrorf(err, "", "gpu_manufacturer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "gpu_memory", &obj.GpuMemory, UnmarshalInstanceProfileGpuMemory)
	if err != nil {
		err = core.SDKErrorf(err, "", "gpu_memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "gpu_model", &obj.GpuModel, UnmarshalInstanceProfileGpuModel)
	if err != nil {
		err = core.SDKErrorf(err, "", "gpu_model-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "memory", &obj.Memory, UnmarshalInstanceProfileMemory)
	if err != nil {
		err = core.SDKErrorf(err, "", "memory-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachment_count", &obj.NetworkAttachmentCount, UnmarshalInstanceProfileNetworkAttachmentCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachment_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interface_count", &obj.NetworkInterfaceCount, UnmarshalInstanceProfileNetworkInterfaceCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interface_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "numa_count", &obj.NumaCount, UnmarshalInstanceProfileNumaCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "numa_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "os_architecture", &obj.OsArchitecture, UnmarshalInstanceProfileOsArchitecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "os_architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "port_speed", &obj.PortSpeed, UnmarshalInstanceProfilePortSpeed)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_speed-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_terms", &obj.ReservationTerms, UnmarshalInstanceProfileReservationTerms)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_terms-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "secure_boot_modes", &obj.SecureBootModes, UnmarshalInstanceProfileSupportedSecureBootModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "secure_boot_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_cluster_network_profiles", &obj.SupportedClusterNetworkProfiles, UnmarshalClusterNetworkProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_cluster_network_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "total_volume_bandwidth", &obj.TotalVolumeBandwidth, UnmarshalInstanceProfileVolumeBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_volume_bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu_architecture", &obj.VcpuArchitecture, UnmarshalInstanceProfileVcpuArchitecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu_architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu_count", &obj.VcpuCount, UnmarshalInstanceProfileVcpu)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vcpu_manufacturer", &obj.VcpuManufacturer, UnmarshalInstanceProfileVcpuManufacturer)
	if err != nil {
		err = core.SDKErrorf(err, "", "vcpu_manufacturer-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileBandwidth : InstanceProfileBandwidth struct
// Models which "extend" this model:
// - InstanceProfileBandwidthFixed
// - InstanceProfileBandwidthRange
// - InstanceProfileBandwidthEnum
// - InstanceProfileBandwidthDependent
type InstanceProfileBandwidth struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileBandwidth.Type property.
// The type for this profile field.
const (
	InstanceProfileBandwidthTypeFixedConst = "fixed"
)

func (*InstanceProfileBandwidth) isaInstanceProfileBandwidth() bool {
	return true
}

type InstanceProfileBandwidthIntf interface {
	isaInstanceProfileBandwidth() bool
}

// UnmarshalInstanceProfileBandwidth unmarshals an instance of InstanceProfileBandwidth from the specified map of raw messages.
func UnmarshalInstanceProfileBandwidth(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileBandwidth)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileClusterNetworkAttachmentCount : InstanceProfileClusterNetworkAttachmentCount struct
// Models which "extend" this model:
// - InstanceProfileClusterNetworkAttachmentCountDependent
// - InstanceProfileClusterNetworkAttachmentCountEnum
// - InstanceProfileClusterNetworkAttachmentCountRange
type InstanceProfileClusterNetworkAttachmentCount struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	Default *int64 `json:"default,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	Step *int64 `json:"step,omitempty"`
}

// Constants associated with the InstanceProfileClusterNetworkAttachmentCount.Type property.
// The type for this profile field.
const (
	InstanceProfileClusterNetworkAttachmentCountTypeDependentConst = "dependent"
)

func (*InstanceProfileClusterNetworkAttachmentCount) isaInstanceProfileClusterNetworkAttachmentCount() bool {
	return true
}

type InstanceProfileClusterNetworkAttachmentCountIntf interface {
	isaInstanceProfileClusterNetworkAttachmentCount() bool
}

// UnmarshalInstanceProfileClusterNetworkAttachmentCount unmarshals an instance of InstanceProfileClusterNetworkAttachmentCount from the specified map of raw messages.
func UnmarshalInstanceProfileClusterNetworkAttachmentCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileClusterNetworkAttachmentCount)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileCollection : InstanceProfileCollection struct
type InstanceProfileCollection struct {
	// A page of virtual server instance profiles.
	Profiles []InstanceProfile `json:"profiles" validate:"required"`
}

// UnmarshalInstanceProfileCollection unmarshals an instance of InstanceProfileCollection from the specified map of raw messages.
func UnmarshalInstanceProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileCollection)
	err = core.UnmarshalModel(m, "profiles", &obj.Profiles, UnmarshalInstanceProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profiles-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileDisk : Disks provided by this profile.
type InstanceProfileDisk struct {
	Quantity InstanceProfileDiskQuantityIntf `json:"quantity" validate:"required"`

	Size InstanceProfileDiskSizeIntf `json:"size" validate:"required"`

	SupportedInterfaceTypes *InstanceProfileDiskSupportedInterfaces `json:"supported_interface_types" validate:"required"`
}

// UnmarshalInstanceProfileDisk unmarshals an instance of InstanceProfileDisk from the specified map of raw messages.
func UnmarshalInstanceProfileDisk(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileDisk)
	err = core.UnmarshalModel(m, "quantity", &obj.Quantity, UnmarshalInstanceProfileDiskQuantity)
	if err != nil {
		err = core.SDKErrorf(err, "", "quantity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "size", &obj.Size, UnmarshalInstanceProfileDiskSize)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "supported_interface_types", &obj.SupportedInterfaceTypes, UnmarshalInstanceProfileDiskSupportedInterfaces)
	if err != nil {
		err = core.SDKErrorf(err, "", "supported_interface_types-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileDiskQuantity : InstanceProfileDiskQuantity struct
// Models which "extend" this model:
// - InstanceProfileDiskQuantityFixed
// - InstanceProfileDiskQuantityRange
// - InstanceProfileDiskQuantityEnum
// - InstanceProfileDiskQuantityDependent
type InstanceProfileDiskQuantity struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileDiskQuantity.Type property.
// The type for this profile field.
const (
	InstanceProfileDiskQuantityTypeFixedConst = "fixed"
)

func (*InstanceProfileDiskQuantity) isaInstanceProfileDiskQuantity() bool {
	return true
}

type InstanceProfileDiskQuantityIntf interface {
	isaInstanceProfileDiskQuantity() bool
}

// UnmarshalInstanceProfileDiskQuantity unmarshals an instance of InstanceProfileDiskQuantity from the specified map of raw messages.
func UnmarshalInstanceProfileDiskQuantity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileDiskQuantity)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileDiskSize : InstanceProfileDiskSize struct
// Models which "extend" this model:
// - InstanceProfileDiskSizeFixed
// - InstanceProfileDiskSizeRange
// - InstanceProfileDiskSizeEnum
// - InstanceProfileDiskSizeDependent
type InstanceProfileDiskSize struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileDiskSize.Type property.
// The type for this profile field.
const (
	InstanceProfileDiskSizeTypeFixedConst = "fixed"
)

func (*InstanceProfileDiskSize) isaInstanceProfileDiskSize() bool {
	return true
}

type InstanceProfileDiskSizeIntf interface {
	isaInstanceProfileDiskSize() bool
}

// UnmarshalInstanceProfileDiskSize unmarshals an instance of InstanceProfileDiskSize from the specified map of raw messages.
func UnmarshalInstanceProfileDiskSize(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileDiskSize)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileDiskSupportedInterfaces : InstanceProfileDiskSupportedInterfaces struct
type InstanceProfileDiskSupportedInterfaces struct {
	// The disk interface used for attaching the disk.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Default *string `json:"default" validate:"required"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported disk interfaces used for attaching the disk.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileDiskSupportedInterfaces.Default property.
// The disk interface used for attaching the disk.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceProfileDiskSupportedInterfacesDefaultNvmeConst      = "nvme"
	InstanceProfileDiskSupportedInterfacesDefaultVirtioBlkConst = "virtio_blk"
)

// Constants associated with the InstanceProfileDiskSupportedInterfaces.Type property.
// The type for this profile field.
const (
	InstanceProfileDiskSupportedInterfacesTypeEnumConst = "enum"
)

// Constants associated with the InstanceProfileDiskSupportedInterfaces.Values property.
// The disk interface used for attaching the disk.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceProfileDiskSupportedInterfacesValuesNvmeConst      = "nvme"
	InstanceProfileDiskSupportedInterfacesValuesVirtioBlkConst = "virtio_blk"
)

// UnmarshalInstanceProfileDiskSupportedInterfaces unmarshals an instance of InstanceProfileDiskSupportedInterfaces from the specified map of raw messages.
func UnmarshalInstanceProfileDiskSupportedInterfaces(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileDiskSupportedInterfaces)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileGpu : InstanceProfileGpu struct
// Models which "extend" this model:
// - InstanceProfileGpuFixed
// - InstanceProfileGpuRange
// - InstanceProfileGpuEnum
// - InstanceProfileGpuDependent
type InstanceProfileGpu struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileGpu.Type property.
// The type for this profile field.
const (
	InstanceProfileGpuTypeFixedConst = "fixed"
)

func (*InstanceProfileGpu) isaInstanceProfileGpu() bool {
	return true
}

type InstanceProfileGpuIntf interface {
	isaInstanceProfileGpu() bool
}

// UnmarshalInstanceProfileGpu unmarshals an instance of InstanceProfileGpu from the specified map of raw messages.
func UnmarshalInstanceProfileGpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileGpu)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileGpuManufacturer : InstanceProfileGpuManufacturer struct
type InstanceProfileGpuManufacturer struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The possible GPU manufacturer(s) for an instance with this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileGpuManufacturer.Type property.
// The type for this profile field.
const (
	InstanceProfileGpuManufacturerTypeEnumConst = "enum"
)

// Constants associated with the InstanceProfileGpuManufacturer.Values property.
// The GPU manufacturer.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceProfileGpuManufacturerValuesAmdConst    = "amd"
	InstanceProfileGpuManufacturerValuesIntelConst  = "intel"
	InstanceProfileGpuManufacturerValuesNvidiaConst = "nvidia"
)

// UnmarshalInstanceProfileGpuManufacturer unmarshals an instance of InstanceProfileGpuManufacturer from the specified map of raw messages.
func UnmarshalInstanceProfileGpuManufacturer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileGpuManufacturer)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileGpuMemory : InstanceProfileGpuMemory struct
// Models which "extend" this model:
// - InstanceProfileGpuMemoryFixed
// - InstanceProfileGpuMemoryRange
// - InstanceProfileGpuMemoryEnum
// - InstanceProfileGpuMemoryDependent
type InstanceProfileGpuMemory struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileGpuMemory.Type property.
// The type for this profile field.
const (
	InstanceProfileGpuMemoryTypeFixedConst = "fixed"
)

func (*InstanceProfileGpuMemory) isaInstanceProfileGpuMemory() bool {
	return true
}

type InstanceProfileGpuMemoryIntf interface {
	isaInstanceProfileGpuMemory() bool
}

// UnmarshalInstanceProfileGpuMemory unmarshals an instance of InstanceProfileGpuMemory from the specified map of raw messages.
func UnmarshalInstanceProfileGpuMemory(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileGpuMemory)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileGpuModel : InstanceProfileGpuModel struct
type InstanceProfileGpuModel struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The possible GPU model(s) for an instance with this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileGpuModel.Type property.
// The type for this profile field.
const (
	InstanceProfileGpuModelTypeEnumConst = "enum"
)

// UnmarshalInstanceProfileGpuModel unmarshals an instance of InstanceProfileGpuModel from the specified map of raw messages.
func UnmarshalInstanceProfileGpuModel(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileGpuModel)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileIdentity : Identifies an instance profile by a unique property.
// Models which "extend" this model:
// - InstanceProfileIdentityByName
// - InstanceProfileIdentityByHref
type InstanceProfileIdentity struct {
	// The globally unique name for this virtual server instance profile.
	Name *string `json:"name,omitempty"`

	// The URL for this virtual server instance profile.
	Href *string `json:"href,omitempty"`
}

func (*InstanceProfileIdentity) isaInstanceProfileIdentity() bool {
	return true
}

type InstanceProfileIdentityIntf interface {
	isaInstanceProfileIdentity() bool
}

// UnmarshalInstanceProfileIdentity unmarshals an instance of InstanceProfileIdentity from the specified map of raw messages.
func UnmarshalInstanceProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileMemory : InstanceProfileMemory struct
// Models which "extend" this model:
// - InstanceProfileMemoryFixed
// - InstanceProfileMemoryRange
// - InstanceProfileMemoryEnum
// - InstanceProfileMemoryDependent
type InstanceProfileMemory struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileMemory.Type property.
// The type for this profile field.
const (
	InstanceProfileMemoryTypeFixedConst = "fixed"
)

func (*InstanceProfileMemory) isaInstanceProfileMemory() bool {
	return true
}

type InstanceProfileMemoryIntf interface {
	isaInstanceProfileMemory() bool
}

// UnmarshalInstanceProfileMemory unmarshals an instance of InstanceProfileMemory from the specified map of raw messages.
func UnmarshalInstanceProfileMemory(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileMemory)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileNumaCount : InstanceProfileNumaCount struct
// Models which "extend" this model:
// - InstanceProfileNumaCountFixed
// - InstanceProfileNumaCountDependent
type InstanceProfileNumaCount struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`
}

// Constants associated with the InstanceProfileNumaCount.Type property.
// The type for this profile field.
const (
	InstanceProfileNumaCountTypeFixedConst = "fixed"
)

func (*InstanceProfileNumaCount) isaInstanceProfileNumaCount() bool {
	return true
}

type InstanceProfileNumaCountIntf interface {
	isaInstanceProfileNumaCount() bool
}

// UnmarshalInstanceProfileNumaCount unmarshals an instance of InstanceProfileNumaCount from the specified map of raw messages.
func UnmarshalInstanceProfileNumaCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileNumaCount)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileNetworkAttachmentCount : InstanceProfileNetworkAttachmentCount struct
// Models which "extend" this model:
// - InstanceProfileNetworkAttachmentCountRange
// - InstanceProfileNetworkAttachmentCountDependent
type InstanceProfileNetworkAttachmentCount struct {
	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The type for this profile field.
	Type *string `json:"type,omitempty"`
}

// Constants associated with the InstanceProfileNetworkAttachmentCount.Type property.
// The type for this profile field.
const (
	InstanceProfileNetworkAttachmentCountTypeRangeConst = "range"
)

func (*InstanceProfileNetworkAttachmentCount) isaInstanceProfileNetworkAttachmentCount() bool {
	return true
}

type InstanceProfileNetworkAttachmentCountIntf interface {
	isaInstanceProfileNetworkAttachmentCount() bool
}

// UnmarshalInstanceProfileNetworkAttachmentCount unmarshals an instance of InstanceProfileNetworkAttachmentCount from the specified map of raw messages.
func UnmarshalInstanceProfileNetworkAttachmentCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileNetworkAttachmentCount)
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileNetworkInterfaceCount : InstanceProfileNetworkInterfaceCount struct
// Models which "extend" this model:
// - InstanceProfileNetworkInterfaceCountRange
// - InstanceProfileNetworkInterfaceCountDependent
type InstanceProfileNetworkInterfaceCount struct {
	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The type for this profile field.
	Type *string `json:"type,omitempty"`
}

// Constants associated with the InstanceProfileNetworkInterfaceCount.Type property.
// The type for this profile field.
const (
	InstanceProfileNetworkInterfaceCountTypeRangeConst = "range"
)

func (*InstanceProfileNetworkInterfaceCount) isaInstanceProfileNetworkInterfaceCount() bool {
	return true
}

type InstanceProfileNetworkInterfaceCountIntf interface {
	isaInstanceProfileNetworkInterfaceCount() bool
}

// UnmarshalInstanceProfileNetworkInterfaceCount unmarshals an instance of InstanceProfileNetworkInterfaceCount from the specified map of raw messages.
func UnmarshalInstanceProfileNetworkInterfaceCount(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileNetworkInterfaceCount)
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileOsArchitecture : InstanceProfileOsArchitecture struct
type InstanceProfileOsArchitecture struct {
	// The default OS architecture for an instance with this profile.
	Default *string `json:"default" validate:"required"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported OS architecture(s) for an instance with this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileOsArchitecture.Type property.
// The type for this profile field.
const (
	InstanceProfileOsArchitectureTypeEnumConst = "enum"
)

// UnmarshalInstanceProfileOsArchitecture unmarshals an instance of InstanceProfileOsArchitecture from the specified map of raw messages.
func UnmarshalInstanceProfileOsArchitecture(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileOsArchitecture)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfilePortSpeed : InstanceProfilePortSpeed struct
// Models which "extend" this model:
// - InstanceProfilePortSpeedFixed
// - InstanceProfilePortSpeedDependent
type InstanceProfilePortSpeed struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`
}

// Constants associated with the InstanceProfilePortSpeed.Type property.
// The type for this profile field.
const (
	InstanceProfilePortSpeedTypeFixedConst = "fixed"
)

func (*InstanceProfilePortSpeed) isaInstanceProfilePortSpeed() bool {
	return true
}

type InstanceProfilePortSpeedIntf interface {
	isaInstanceProfilePortSpeed() bool
}

// UnmarshalInstanceProfilePortSpeed unmarshals an instance of InstanceProfilePortSpeed from the specified map of raw messages.
func UnmarshalInstanceProfilePortSpeed(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfilePortSpeed)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileReference : InstanceProfileReference struct
type InstanceProfileReference struct {
	// The URL for this virtual server instance profile.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this virtual server instance profile.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the InstanceProfileReference.ResourceType property.
// The resource type.
const (
	InstanceProfileReferenceResourceTypeInstanceProfileConst = "instance_profile"
)

// UnmarshalInstanceProfileReference unmarshals an instance of InstanceProfileReference from the specified map of raw messages.
func UnmarshalInstanceProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileReservationTerms : InstanceProfileReservationTerms struct
type InstanceProfileReservationTerms struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported committed use terms for a reservation using this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileReservationTerms.Type property.
// The type for this profile field.
const (
	InstanceProfileReservationTermsTypeEnumConst = "enum"
)

// Constants associated with the InstanceProfileReservationTerms.Values property.
const (
	InstanceProfileReservationTermsValuesOneYearConst   = "one_year"
	InstanceProfileReservationTermsValuesThreeYearConst = "three_year"
)

// UnmarshalInstanceProfileReservationTerms unmarshals an instance of InstanceProfileReservationTerms from the specified map of raw messages.
func UnmarshalInstanceProfileReservationTerms(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileReservationTerms)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileSupportedConfidentialComputeModes : InstanceProfileSupportedConfidentialComputeModes struct
type InstanceProfileSupportedConfidentialComputeModes struct {
	// The default confidential compute mode for this profile.
	Default *string `json:"default" validate:"required"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported confidential compute modes.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileSupportedConfidentialComputeModes.Default property.
// The default confidential compute mode for this profile.
const (
	InstanceProfileSupportedConfidentialComputeModesDefaultDisabledConst = "disabled"
	InstanceProfileSupportedConfidentialComputeModesDefaultSgxConst      = "sgx"
	InstanceProfileSupportedConfidentialComputeModesDefaultTdxConst      = "tdx"
)

// Constants associated with the InstanceProfileSupportedConfidentialComputeModes.Type property.
// The type for this profile field.
const (
	InstanceProfileSupportedConfidentialComputeModesTypeEnumConst = "enum"
)

// Constants associated with the InstanceProfileSupportedConfidentialComputeModes.Values property.
// The confidential compute modes:
// - `disabled`: No confidential compute functionality
// - `sgx`: Intel Software Guard Extensions
// - `tdx`: Intel Trust Domain Extensions
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceProfileSupportedConfidentialComputeModesValuesDisabledConst = "disabled"
	InstanceProfileSupportedConfidentialComputeModesValuesSgxConst      = "sgx"
	InstanceProfileSupportedConfidentialComputeModesValuesTdxConst      = "tdx"
)

// UnmarshalInstanceProfileSupportedConfidentialComputeModes unmarshals an instance of InstanceProfileSupportedConfidentialComputeModes from the specified map of raw messages.
func UnmarshalInstanceProfileSupportedConfidentialComputeModes(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileSupportedConfidentialComputeModes)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileSupportedSecureBootModes : InstanceProfileSupportedSecureBootModes struct
type InstanceProfileSupportedSecureBootModes struct {
	// The default secure boot mode for this profile.
	Default *bool `json:"default" validate:"required"`

	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported `enable_secure_boot` values for an instance using this profile.
	Values []bool `json:"values" validate:"required"`
}

// Constants associated with the InstanceProfileSupportedSecureBootModes.Type property.
// The type for this profile field.
const (
	InstanceProfileSupportedSecureBootModesTypeEnumConst = "enum"
)

// UnmarshalInstanceProfileSupportedSecureBootModes unmarshals an instance of InstanceProfileSupportedSecureBootModes from the specified map of raw messages.
func UnmarshalInstanceProfileSupportedSecureBootModes(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileSupportedSecureBootModes)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileVcpu : InstanceProfileVcpu struct
// Models which "extend" this model:
// - InstanceProfileVcpuFixed
// - InstanceProfileVcpuRange
// - InstanceProfileVcpuEnum
// - InstanceProfileVcpuDependent
type InstanceProfileVcpu struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileVcpu.Type property.
// The type for this profile field.
const (
	InstanceProfileVcpuTypeFixedConst = "fixed"
)

func (*InstanceProfileVcpu) isaInstanceProfileVcpu() bool {
	return true
}

type InstanceProfileVcpuIntf interface {
	isaInstanceProfileVcpu() bool
}

// UnmarshalInstanceProfileVcpu unmarshals an instance of InstanceProfileVcpu from the specified map of raw messages.
func UnmarshalInstanceProfileVcpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileVcpu)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileVcpuArchitecture : InstanceProfileVcpuArchitecture struct
type InstanceProfileVcpuArchitecture struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The VCPU architecture for an instance with this profile.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the InstanceProfileVcpuArchitecture.Type property.
// The type for this profile field.
const (
	InstanceProfileVcpuArchitectureTypeFixedConst = "fixed"
)

// Constants associated with the InstanceProfileVcpuArchitecture.Value property.
// The VCPU architecture for an instance with this profile.
const (
	InstanceProfileVcpuArchitectureValueAmd64Const = "amd64"
	InstanceProfileVcpuArchitectureValueS390xConst = "s390x"
)

// UnmarshalInstanceProfileVcpuArchitecture unmarshals an instance of InstanceProfileVcpuArchitecture from the specified map of raw messages.
func UnmarshalInstanceProfileVcpuArchitecture(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileVcpuArchitecture)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileVcpuManufacturer : InstanceProfileVcpuManufacturer struct
// Models which "extend" this model:
// - InstanceProfileVcpuManufacturerFixed
// - InstanceProfileVcpuManufacturerDependent
type InstanceProfileVcpuManufacturer struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The VCPU manufacturer for an instance with this profile.
	Value *string `json:"value,omitempty"`
}

// Constants associated with the InstanceProfileVcpuManufacturer.Type property.
// The type for this profile field.
const (
	InstanceProfileVcpuManufacturerTypeFixedConst = "fixed"
)

// Constants associated with the InstanceProfileVcpuManufacturer.Value property.
// The VCPU manufacturer for an instance with this profile.
const (
	InstanceProfileVcpuManufacturerValueAmdConst   = "amd"
	InstanceProfileVcpuManufacturerValueIBMConst   = "ibm"
	InstanceProfileVcpuManufacturerValueIntelConst = "intel"
)

func (*InstanceProfileVcpuManufacturer) isaInstanceProfileVcpuManufacturer() bool {
	return true
}

type InstanceProfileVcpuManufacturerIntf interface {
	isaInstanceProfileVcpuManufacturer() bool
}

// UnmarshalInstanceProfileVcpuManufacturer unmarshals an instance of InstanceProfileVcpuManufacturer from the specified map of raw messages.
func UnmarshalInstanceProfileVcpuManufacturer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileVcpuManufacturer)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceProfileVolumeBandwidth : InstanceProfileVolumeBandwidth struct
// Models which "extend" this model:
// - InstanceProfileVolumeBandwidthFixed
// - InstanceProfileVolumeBandwidthRange
// - InstanceProfileVolumeBandwidthEnum
// - InstanceProfileVolumeBandwidthDependent
type InstanceProfileVolumeBandwidth struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the InstanceProfileVolumeBandwidth.Type property.
// The type for this profile field.
const (
	InstanceProfileVolumeBandwidthTypeFixedConst = "fixed"
)

func (*InstanceProfileVolumeBandwidth) isaInstanceProfileVolumeBandwidth() bool {
	return true
}

type InstanceProfileVolumeBandwidthIntf interface {
	isaInstanceProfileVolumeBandwidth() bool
}

// UnmarshalInstanceProfileVolumeBandwidth unmarshals an instance of InstanceProfileVolumeBandwidth from the specified map of raw messages.
func UnmarshalInstanceProfileVolumeBandwidth(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceProfileVolumeBandwidth)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstancePrototype : InstancePrototype struct
// Models which "extend" this model:
// - InstancePrototypeInstanceByImage
// - InstancePrototypeInstanceByCatalogOffering
// - InstancePrototypeInstanceByVolume
// - InstancePrototypeInstanceBySourceSnapshot
// - InstancePrototypeInstanceBySourceTemplate
type InstancePrototype struct {
	// The availability policy to use for this virtual server instance.
	AvailabilityPolicy *InstanceAvailabilityPolicyPrototype `json:"availability_policy,omitempty"`

	// The cluster network attachments to create for this virtual server instance. A cluster network attachment represents
	// a device that is connected to a cluster network. The number of network attachments must match one of the values from
	// the instance profile's `cluster_network_attachment_count` before the instance can be started.
	ClusterNetworkAttachments []InstanceClusterNetworkAttachmentPrototypeInstanceContext `json:"cluster_network_attachments,omitempty"`

	// The confidential compute mode to use for this virtual server instance.
	//
	// If unspecified, the default confidential compute mode from the profile will be used.
	ConfidentialComputeMode *string `json:"confidential_compute_mode,omitempty"`

	// The default trusted profile configuration to use for this virtual server instance
	//
	// This property's value is used when provisioning the virtual server instance, but not
	// subsequently managed. Accordingly, it is reflected as an [instance
	// initialization](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization)
	// property.
	DefaultTrustedProfile *InstanceDefaultTrustedProfilePrototype `json:"default_trusted_profile,omitempty"`

	// Indicates whether secure boot is enabled for this virtual server instance.
	//
	// If unspecified, the default secure boot mode from the profile will be used.
	EnableSecureBoot *bool `json:"enable_secure_boot,omitempty"`

	// The public SSH keys for this virtual server instance. Keys will be made available to the virtual server instance as
	// cloud-init vendor data. For cloud-init enabled images, these keys will also be added as SSH authorized keys for the
	// [default user](https://cloud.ibm.com/docs/vpc?topic=vpc-vsi_is_connecting_linux#determining-default-user-account).
	//
	// For Windows images, the keys of type `rsa` must be specified, and one will be selected to encrypt [the administrator
	// password](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization). Keys are optional for other images, but if
	// no keys are specified, the instance will be inaccessible unless the specified image provides another means of
	// access.
	//
	// This property's value is used when provisioning the virtual server instance, but not subsequently managed.
	// Accordingly, it is reflected as an [instance
	// initialization](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization) property.
	Keys []KeyIdentityIntf `json:"keys,omitempty"`

	// The metadata service configuration.
	MetadataService *InstanceMetadataServicePrototype `json:"metadata_service,omitempty"`

	// The name for this virtual server instance. The name must not be used by another virtual server instance in the
	// region. If unspecified, the name will be a hyphenated list of randomly-selected words.
	//
	// The system hostname will be based on this name.
	Name *string `json:"name,omitempty"`

	// The placement restrictions to use for the virtual server instance.
	//
	// If specified, `reservation_affinity.policy` must be `disabled`.
	PlacementTarget InstancePlacementTargetPrototypeIntf `json:"placement_target,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) to use for this
	// virtual server instance.
	//
	// If unspecified, `bx2-2x8` will be used, but this default value is expected to change
	// in the future.
	Profile InstanceProfileIdentityIntf `json:"profile,omitempty"`

	// The reservation affinity settings for this virtual server instance. If specified,
	// `vcpu.tenancy` must be `dedicated`, and `vcpu.percentage` must be `100`.
	ReservationAffinity *InstanceReservationAffinityPrototype `json:"reservation_affinity,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The amount of bandwidth (in megabits per second) allocated exclusively to instance storage volumes. An increase in
	// this value will result in a corresponding decrease to
	// `total_network_bandwidth`.
	TotalVolumeBandwidth *int64 `json:"total_volume_bandwidth,omitempty"`

	// The [user data](https://cloud.ibm.com/docs/vpc?topic=vpc-user-data) to make available when setting up the virtual
	// server instance.
	UserData *string `json:"user_data,omitempty"`

	// The additional volume attachments to create for the virtual server instance.
	VolumeAttachments []VolumeAttachmentPrototype `json:"volume_attachments,omitempty"`

	// The VPC this virtual server instance will reside in.
	//
	// If specified, it must match the VPC for the subnets of the instance network
	// attachments or instance network interfaces.
	VPC VPCIdentityIntf `json:"vpc,omitempty"`

	// The boot volume attachment to create for the virtual server instance.
	BootVolumeAttachment *VolumeAttachmentPrototypeInstanceByImageContext `json:"boot_volume_attachment,omitempty"`

	// The image to use when provisioning the virtual server instance.
	Image ImageIdentityIntf `json:"image,omitempty"`

	// The zone this virtual server instance will reside in.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`

	// The additional network attachments to create for the virtual server instance.
	NetworkAttachments []InstanceNetworkAttachmentPrototype `json:"network_attachments,omitempty"`

	// The primary network attachment to create for the virtual server instance.
	PrimaryNetworkAttachment *InstanceNetworkAttachmentPrototype `json:"primary_network_attachment,omitempty"`

	// The additional instance network interfaces to create.
	NetworkInterfaces []NetworkInterfacePrototype `json:"network_interfaces,omitempty"`

	// The primary instance network interface to create.
	PrimaryNetworkInterface *NetworkInterfacePrototype `json:"primary_network_interface,omitempty"`

	// The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering
	// or offering version to use when provisioning this virtual server instance.
	//
	// If an offering is specified, the latest version of that offering will be used.
	//
	// The specified offering or offering version may be in a different account, subject
	// to IAM policies.
	CatalogOffering InstanceCatalogOfferingPrototypeIntf `json:"catalog_offering,omitempty"`

	// The template to create this virtual server instance from.
	SourceTemplate InstanceTemplateIdentityIntf `json:"source_template,omitempty"`
}

// Constants associated with the InstancePrototype.ConfidentialComputeMode property.
// The confidential compute mode to use for this virtual server instance.
//
// If unspecified, the default confidential compute mode from the profile will be used.
const (
	InstancePrototypeConfidentialComputeModeDisabledConst = "disabled"
	InstancePrototypeConfidentialComputeModeSgxConst      = "sgx"
	InstancePrototypeConfidentialComputeModeTdxConst      = "tdx"
)

func (*InstancePrototype) isaInstancePrototype() bool {
	return true
}

type InstancePrototypeIntf interface {
	isaInstancePrototype() bool
}

// UnmarshalInstancePrototype unmarshals an instance of InstancePrototype from the specified map of raw messages.
func UnmarshalInstancePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstancePrototype)
	err = core.UnmarshalModel(m, "availability_policy", &obj.AvailabilityPolicy, UnmarshalInstanceAvailabilityPolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "availability_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cluster_network_attachments", &obj.ClusterNetworkAttachments, UnmarshalInstanceClusterNetworkAttachmentPrototypeInstanceContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "confidential_compute_mode", &obj.ConfidentialComputeMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "confidential_compute_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_trusted_profile", &obj.DefaultTrustedProfile, UnmarshalInstanceDefaultTrustedProfilePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_trusted_profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "metadata_service", &obj.MetadataService, UnmarshalInstanceMetadataServicePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "metadata_service-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "placement_target", &obj.PlacementTarget, UnmarshalInstancePlacementTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "placement_target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalInstanceProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalInstanceReservationAffinityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_volume_bandwidth", &obj.TotalVolumeBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_volume_bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_data", &obj.UserData)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_data-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "volume_attachments", &obj.VolumeAttachments, UnmarshalVolumeAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "volume_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "boot_volume_attachment", &obj.BootVolumeAttachment, UnmarshalVolumeAttachmentPrototypeInstanceByImageContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "boot_volume_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "image", &obj.Image, UnmarshalImageIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "image-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalInstanceNetworkAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_attachment", &obj.PrimaryNetworkAttachment, UnmarshalInstanceNetworkAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_interface", &obj.PrimaryNetworkInterface, UnmarshalNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "catalog_offering", &obj.CatalogOffering, UnmarshalInstanceCatalogOfferingPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "catalog_offering-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_template", &obj.SourceTemplate, UnmarshalInstanceTemplateIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_template-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceReference : InstanceReference struct
type InstanceReference struct {
	// The CRN for this virtual server instance.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this virtual server instance.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this virtual server instance.
	ID *string `json:"id" validate:"required"`

	// The name for this virtual server instance. The name is unique across all virtual server instances in the region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalInstanceReference unmarshals an instance of InstanceReference from the specified map of raw messages.
func UnmarshalInstanceReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceReservationAffinity : InstanceReservationAffinity struct
type InstanceReservationAffinity struct {
	// The reservation affinity policy to use for this virtual server instance:
	// - `automatic`: Any reservations with an `affinity_policy` of `automatic`
	//   that have the same `profile` and `zone` as this virtual server instance
	//   are available for use.
	// - `disabled`: Reservations will not be used
	// - `manual`: Reservations in `pool` are available for use.
	Policy *string `json:"policy" validate:"required"`

	// The pool of reservations available for use by this virtual server instance when the `policy` is `manual`. This must
	// be empty if the `policy` is `automatic` or
	// `disabled`.
	Pool []ReservationReference `json:"pool" validate:"required"`
}

// Constants associated with the InstanceReservationAffinity.Policy property.
// The reservation affinity policy to use for this virtual server instance:
//   - `automatic`: Any reservations with an `affinity_policy` of `automatic`
//     that have the same `profile` and `zone` as this virtual server instance
//     are available for use.
//   - `disabled`: Reservations will not be used
//   - `manual`: Reservations in `pool` are available for use.
const (
	InstanceReservationAffinityPolicyAutomaticConst = "automatic"
	InstanceReservationAffinityPolicyDisabledConst  = "disabled"
	InstanceReservationAffinityPolicyManualConst    = "manual"
)

// UnmarshalInstanceReservationAffinity unmarshals an instance of InstanceReservationAffinity from the specified map of raw messages.
func UnmarshalInstanceReservationAffinity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceReservationAffinity)
	err = core.UnmarshalPrimitive(m, "policy", &obj.Policy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool", &obj.Pool, UnmarshalReservationReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceReservationAffinityPatch : InstanceReservationAffinityPatch struct
type InstanceReservationAffinityPatch struct {
	// The reservation affinity policy to use for this virtual server instance:
	// - `automatic`: Any reservations with an `affinity_policy` of `automatic`
	//   that have the same `profile` and `zone` as this virtual server instance
	//   are available for use.
	// - `disabled`: Reservations will not be used
	// - `manual`: Reservations in `pool` will be available for use
	//
	// The policy must be `disabled` if `placement_target` is set.
	Policy *string `json:"policy,omitempty"`

	// The pool of reservations available for use by this virtual server instance, replacing the existing pool of
	// reservations.
	//
	// Specified reservations must have a `status` of `active`, and have the same `profile` and `zone` as this virtual
	// server instance.
	//
	// If `policy` is `manual`, `pool` must have one reservation. If `policy` is `disabled` or `automatic`, `pool` must be
	// empty. If `policy` is `manual`, the `pool` must contain a reservation with available capacity.
	Pool []ReservationIdentityIntf `json:"pool,omitempty"`
}

// Constants associated with the InstanceReservationAffinityPatch.Policy property.
// The reservation affinity policy to use for this virtual server instance:
//   - `automatic`: Any reservations with an `affinity_policy` of `automatic`
//     that have the same `profile` and `zone` as this virtual server instance
//     are available for use.
//   - `disabled`: Reservations will not be used
//   - `manual`: Reservations in `pool` will be available for use
//
// The policy must be `disabled` if `placement_target` is set.
const (
	InstanceReservationAffinityPatchPolicyAutomaticConst = "automatic"
	InstanceReservationAffinityPatchPolicyDisabledConst  = "disabled"
	InstanceReservationAffinityPatchPolicyManualConst    = "manual"
)

// UnmarshalInstanceReservationAffinityPatch unmarshals an instance of InstanceReservationAffinityPatch from the specified map of raw messages.
func UnmarshalInstanceReservationAffinityPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceReservationAffinityPatch)
	err = core.UnmarshalPrimitive(m, "policy", &obj.Policy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool", &obj.Pool, UnmarshalReservationIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstanceReservationAffinityPatch
func (instanceReservationAffinityPatch *InstanceReservationAffinityPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceReservationAffinityPatch.Policy) {
		_patch["policy"] = instanceReservationAffinityPatch.Policy
	}
	if !core.IsNil(instanceReservationAffinityPatch.Pool) {
		var poolPatches []map[string]interface{}
		for _, pool := range instanceReservationAffinityPatch.Pool {
			poolPatches = append(poolPatches, pool.asPatch())
		}
		_patch["pool"] = poolPatches
	}

	return
}

// InstanceReservationAffinityPrototype : The reservation affinity settings for this virtual server instance. If specified,
// `vcpu.tenancy` must be `dedicated`, and `vcpu.percentage` must be `100`.
type InstanceReservationAffinityPrototype struct {
	// The reservation affinity policy to use for this virtual server instance:
	// - `disabled`: Reservations will not be used
	// - `manual`: Reservations in `pool` will be available for use
	// - `automatic`: Reservations with an `affinity_policy` of `automatic` that have the same
	//   `profile` and `zone` as this virtual server instance will be available for use.
	//
	// The policy will default to `manual` if `pool` is not empty. The policy will default to
	// `disabled` if a `placement_target` is set. The policy will default to `automatic` in all other cases.
	//
	// The policy must be `disabled` if `placement_target` is specified.
	Policy *string `json:"policy,omitempty"`

	// The pool of reservations available for use by this virtual server instance.
	//
	// Specified reservations must have a `status` of `active`, and have the same `profile` and `zone` as this virtual
	// server instance.
	//
	// If `policy` is `manual`, `pool` must be specified with one reservation. If `policy` is `disabled` or `automatic` and
	// `pool` is specified, it must be empty. If `policy` is `manual`, the `pool` must contain a reservation with available
	// capacity.
	Pool []ReservationIdentityIntf `json:"pool,omitempty"`
}

// Constants associated with the InstanceReservationAffinityPrototype.Policy property.
// The reservation affinity policy to use for this virtual server instance:
//   - `disabled`: Reservations will not be used
//   - `manual`: Reservations in `pool` will be available for use
//   - `automatic`: Reservations with an `affinity_policy` of `automatic` that have the same
//     `profile` and `zone` as this virtual server instance will be available for use.
//
// The policy will default to `manual` if `pool` is not empty. The policy will default to
// `disabled` if a `placement_target` is set. The policy will default to `automatic` in all other cases.
//
// The policy must be `disabled` if `placement_target` is specified.
const (
	InstanceReservationAffinityPrototypePolicyAutomaticConst = "automatic"
	InstanceReservationAffinityPrototypePolicyDisabledConst  = "disabled"
	InstanceReservationAffinityPrototypePolicyManualConst    = "manual"
)

// UnmarshalInstanceReservationAffinityPrototype unmarshals an instance of InstanceReservationAffinityPrototype from the specified map of raw messages.
func UnmarshalInstanceReservationAffinityPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceReservationAffinityPrototype)
	err = core.UnmarshalPrimitive(m, "policy", &obj.Policy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pool", &obj.Pool, UnmarshalReservationIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "pool-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceStatusReason : InstanceStatusReason struct
type InstanceStatusReason struct {
	// A snake case string succinctly identifying the status reason.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the InstanceStatusReason.Code property.
// A snake case string succinctly identifying the status reason.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceStatusReasonCodeCannotStartConst                    = "cannot_start"
	InstanceStatusReasonCodeCannotStartCapacityConst            = "cannot_start_capacity"
	InstanceStatusReasonCodeCannotStartComputeConst             = "cannot_start_compute"
	InstanceStatusReasonCodeCannotStartIPAddressConst           = "cannot_start_ip_address"
	InstanceStatusReasonCodeCannotStartNetworkConst             = "cannot_start_network"
	InstanceStatusReasonCodeCannotStartPlacementGroupConst      = "cannot_start_placement_group"
	InstanceStatusReasonCodeCannotStartReservationCapacityConst = "cannot_start_reservation_capacity"
	InstanceStatusReasonCodeCannotStartReservationExpiredConst  = "cannot_start_reservation_expired"
	InstanceStatusReasonCodeCannotStartStorageConst             = "cannot_start_storage"
	InstanceStatusReasonCodeEncryptionKeyDeletedConst           = "encryption_key_deleted"
	InstanceStatusReasonCodeStoppedByHostFailureConst           = "stopped_by_host_failure"
	InstanceStatusReasonCodeStoppedForImageCreationConst        = "stopped_for_image_creation"
)

// UnmarshalInstanceStatusReason unmarshals an instance of InstanceStatusReason from the specified map of raw messages.
func UnmarshalInstanceStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceTemplate : InstanceTemplate struct
// Models which "extend" this model:
// - InstanceTemplateInstanceByImageInstanceTemplateContext
// - InstanceTemplateInstanceBySourceSnapshotInstanceTemplateContext
// - InstanceTemplateInstanceByCatalogOfferingInstanceTemplateContext
type InstanceTemplate struct {
	// The availability policy to use for this virtual server instance.
	AvailabilityPolicy *InstanceAvailabilityPolicyPrototype `json:"availability_policy,omitempty"`

	// The cluster network attachments to create for this virtual server instance. A cluster network attachment represents
	// a device that is connected to a cluster network. The number of network attachments must match one of the values from
	// the instance profile's `cluster_network_attachment_count` before the instance can be started.
	ClusterNetworkAttachments []InstanceClusterNetworkAttachmentPrototypeInstanceContext `json:"cluster_network_attachments,omitempty"`

	// The confidential compute mode to use for this virtual server instance.
	//
	// If unspecified, the default confidential compute mode from the profile will be used.
	ConfidentialComputeMode *string `json:"confidential_compute_mode,omitempty"`

	// The date and time that the instance template was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this instance template.
	CRN *string `json:"crn" validate:"required"`

	// The default trusted profile configuration to use for this virtual server instance
	//
	// This property's value is used when provisioning the virtual server instance, but not
	// subsequently managed. Accordingly, it is reflected as an [instance
	// initialization](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization)
	// property.
	DefaultTrustedProfile *InstanceDefaultTrustedProfilePrototype `json:"default_trusted_profile,omitempty"`

	// Indicates whether secure boot is enabled for this virtual server instance.
	//
	// If unspecified, the default secure boot mode from the profile will be used.
	EnableSecureBoot *bool `json:"enable_secure_boot,omitempty"`

	// The URL for this instance template.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance template.
	ID *string `json:"id" validate:"required"`

	// The public SSH keys for this virtual server instance. Keys will be made available to the virtual server instance as
	// cloud-init vendor data. For cloud-init enabled images, these keys will also be added as SSH authorized keys for the
	// [default user](https://cloud.ibm.com/docs/vpc?topic=vpc-vsi_is_connecting_linux#determining-default-user-account).
	//
	// For Windows images, the keys of type `rsa` must be specified, and one will be selected to encrypt [the administrator
	// password](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization). Keys are optional for other images, but if
	// no keys are specified, the instance will be inaccessible unless the specified image provides another means of
	// access.
	//
	// This property's value is used when provisioning the virtual server instance, but not subsequently managed.
	// Accordingly, it is reflected as an [instance
	// initialization](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization) property.
	Keys []KeyIdentityIntf `json:"keys,omitempty"`

	// The metadata service configuration.
	MetadataService *InstanceMetadataServicePrototype `json:"metadata_service,omitempty"`

	// The name for this instance template. The name is unique across all instance templates in the region.
	Name *string `json:"name" validate:"required"`

	// The placement restrictions to use for the virtual server instance.
	//
	// If specified, `reservation_affinity.policy` must be `disabled`.
	PlacementTarget InstancePlacementTargetPrototypeIntf `json:"placement_target,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) to use for this
	// virtual server instance.
	//
	// If unspecified, `bx2-2x8` will be used, but this default value is expected to change
	// in the future.
	Profile InstanceProfileIdentityIntf `json:"profile,omitempty"`

	// The reservation affinity settings for this virtual server instance. If specified,
	// `vcpu.tenancy` must be `dedicated`, and `vcpu.percentage` must be `100`.
	ReservationAffinity *InstanceReservationAffinityPrototype `json:"reservation_affinity,omitempty"`

	// The resource group for this instance template.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The amount of bandwidth (in megabits per second) allocated exclusively to instance storage volumes. An increase in
	// this value will result in a corresponding decrease to
	// `total_network_bandwidth`.
	TotalVolumeBandwidth *int64 `json:"total_volume_bandwidth,omitempty"`

	// The [user data](https://cloud.ibm.com/docs/vpc?topic=vpc-user-data) to make available when setting up the virtual
	// server instance.
	UserData *string `json:"user_data,omitempty"`

	// The additional volume attachments to create for the virtual server instance.
	VolumeAttachments []VolumeAttachmentPrototype `json:"volume_attachments,omitempty"`

	// The VPC this virtual server instance will reside in.
	//
	// If specified, it must match the VPC for the subnets of the instance network
	// attachments or instance network interfaces.
	VPC VPCIdentityIntf `json:"vpc,omitempty"`

	// The boot volume attachment to create for the virtual server instance.
	BootVolumeAttachment *VolumeAttachmentPrototypeInstanceByImageContext `json:"boot_volume_attachment,omitempty"`

	// The image to use when provisioning the virtual server instance.
	Image ImageIdentityIntf `json:"image,omitempty"`

	// The zone this virtual server instance will reside in.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`

	// The additional network attachments to create for the virtual server instance.
	NetworkAttachments []InstanceNetworkAttachmentPrototype `json:"network_attachments,omitempty"`

	// The primary network attachment to create for the virtual server instance.
	PrimaryNetworkAttachment *InstanceNetworkAttachmentPrototype `json:"primary_network_attachment,omitempty"`

	// The additional instance network interfaces to create.
	NetworkInterfaces []NetworkInterfacePrototype `json:"network_interfaces,omitempty"`

	// The primary instance network interface to create.
	PrimaryNetworkInterface *NetworkInterfacePrototype `json:"primary_network_interface,omitempty"`

	// The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user) offering
	// or offering version to use when provisioning this virtual server instance.
	//
	// If an offering is specified, the latest version of that offering will be used.
	//
	// The specified offering or offering version may be in a different account, subject
	// to IAM policies.
	CatalogOffering InstanceCatalogOfferingPrototypeIntf `json:"catalog_offering,omitempty"`
}

// Constants associated with the InstanceTemplate.ConfidentialComputeMode property.
// The confidential compute mode to use for this virtual server instance.
//
// If unspecified, the default confidential compute mode from the profile will be used.
const (
	InstanceTemplateConfidentialComputeModeDisabledConst = "disabled"
	InstanceTemplateConfidentialComputeModeSgxConst      = "sgx"
	InstanceTemplateConfidentialComputeModeTdxConst      = "tdx"
)

func (*InstanceTemplate) isaInstanceTemplate() bool {
	return true
}

type InstanceTemplateIntf interface {
	isaInstanceTemplate() bool
}

// UnmarshalInstanceTemplate unmarshals an instance of InstanceTemplate from the specified map of raw messages.
func UnmarshalInstanceTemplate(m map[string]json.RawMessage, result interface{}) (err error) {

	// Check for source_snapshot presence to determine object type
	var isSourceSnapshot bool
	if bootVolumeRaw, exists := m["boot_volume_attachment"]; exists && len(bootVolumeRaw) > 0 && string(bootVolumeRaw) != "null" {
		var bootVolumeMap map[string]json.RawMessage
		if err = json.Unmarshal(bootVolumeRaw, &bootVolumeMap); err == nil {
			if volumeRaw, volumeExists := bootVolumeMap["volume"]; volumeExists && len(volumeRaw) > 0 && string(volumeRaw) != "null" {
				var volumeMap map[string]json.RawMessage
				if err = json.Unmarshal(volumeRaw, &volumeMap); err == nil {
					if _, snapshotExists := volumeMap["source_snapshot"]; snapshotExists {
						isSourceSnapshot = true
					}
				}
			}
		}
	}
	if isSourceSnapshot {
		err = core.UnmarshalModel(m, "", result, UnmarshalInstanceTemplateInstanceBySourceSnapshotInstanceTemplateContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-InstanceTemplateInstanceBySourceSnapshotInstanceTemplateContext-error", common.GetComponentInfo())
		}
		return
	} else {
		obj := new(InstanceTemplate)
		err = core.UnmarshalModel(m, "availability_policy", &obj.AvailabilityPolicy, UnmarshalInstanceAvailabilityPolicyPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "availability_policy-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "cluster_network_attachments", &obj.ClusterNetworkAttachments, UnmarshalInstanceClusterNetworkAttachmentPrototypeInstanceContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "cluster_network_attachments-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "confidential_compute_mode", &obj.ConfidentialComputeMode)
		if err != nil {
			err = core.SDKErrorf(err, "", "confidential_compute_mode-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
		if err != nil {
			err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
		if err != nil {
			err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "default_trusted_profile", &obj.DefaultTrustedProfile, UnmarshalInstanceDefaultTrustedProfilePrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "default_trusted_profile-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
		if err != nil {
			err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "href", &obj.Href)
		if err != nil {
			err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "id", &obj.ID)
		if err != nil {
			err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKeyIdentity)
		if err != nil {
			err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "metadata_service", &obj.MetadataService, UnmarshalInstanceMetadataServicePrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "metadata_service-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "name", &obj.Name)
		if err != nil {
			err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "placement_target", &obj.PlacementTarget, UnmarshalInstancePlacementTargetPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "placement_target-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalInstanceProfileIdentity)
		if err != nil {
			err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalInstanceReservationAffinityPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
		if err != nil {
			err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "total_volume_bandwidth", &obj.TotalVolumeBandwidth)
		if err != nil {
			err = core.SDKErrorf(err, "", "total_volume_bandwidth-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalPrimitive(m, "user_data", &obj.UserData)
		if err != nil {
			err = core.SDKErrorf(err, "", "user_data-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "volume_attachments", &obj.VolumeAttachments, UnmarshalVolumeAttachmentPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "volume_attachments-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
		if err != nil {
			err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "boot_volume_attachment", &obj.BootVolumeAttachment, UnmarshalVolumeAttachmentPrototypeInstanceByImageContext)
		if err != nil {
			err = core.SDKErrorf(err, "", "boot_volume_attachment-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "image", &obj.Image, UnmarshalImageIdentity)
		if err != nil {
			err = core.SDKErrorf(err, "", "image-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
		if err != nil {
			err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalInstanceNetworkAttachmentPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "primary_network_attachment", &obj.PrimaryNetworkAttachment, UnmarshalInstanceNetworkAttachmentPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "primary_network_attachment-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalNetworkInterfacePrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "primary_network_interface", &obj.PrimaryNetworkInterface, UnmarshalNetworkInterfacePrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "primary_network_interface-error", common.GetComponentInfo())
			return
		}
		err = core.UnmarshalModel(m, "catalog_offering", &obj.CatalogOffering, UnmarshalInstanceCatalogOfferingPrototype)
		if err != nil {
			err = core.SDKErrorf(err, "", "catalog_offering-error", common.GetComponentInfo())
			return
		}
		reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
		return
	}
}

// InstanceTemplateCollection : InstanceTemplateCollection struct
type InstanceTemplateCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of instance templates.
	Templates []InstanceTemplateIntf `json:"templates" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalInstanceTemplateCollection unmarshals an instance of InstanceTemplateCollection from the specified map of raw messages.
func UnmarshalInstanceTemplateCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceTemplateCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "templates", &obj.Templates, UnmarshalInstanceTemplate)
	if err != nil {
		err = core.SDKErrorf(err, "", "templates-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceTemplateIdentity : Identifies an instance template by a unique property.
// Models which "extend" this model:
// - InstanceTemplateIdentityByID
// - InstanceTemplateIdentityByHref
// - InstanceTemplateIdentityByCRN
type InstanceTemplateIdentity struct {
	// The unique identifier for this instance template.
	ID *string `json:"id,omitempty"`

	// The URL for this instance template.
	Href *string `json:"href,omitempty"`

	// The CRN for this instance template.
	CRN *string `json:"crn,omitempty"`
}

func (*InstanceTemplateIdentity) isaInstanceTemplateIdentity() bool {
	return true
}

type InstanceTemplateIdentityIntf interface {
	isaInstanceTemplateIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalInstanceTemplateIdentity unmarshals an instance of InstanceTemplateIdentity from the specified map of raw messages.
func UnmarshalInstanceTemplateIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceTemplateIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the InstanceTemplateIdentity
func (instanceTemplateIdentity *InstanceTemplateIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceTemplateIdentity.ID) {
		_patch["id"] = instanceTemplateIdentity.ID
	}
	if !core.IsNil(instanceTemplateIdentity.Href) {
		_patch["href"] = instanceTemplateIdentity.Href
	}
	if !core.IsNil(instanceTemplateIdentity.CRN) {
		_patch["crn"] = instanceTemplateIdentity.CRN
	}

	return
}

// InstanceTemplatePatch : InstanceTemplatePatch struct
type InstanceTemplatePatch struct {
	// The name for this instance template. The name must not be used by another instance template in the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalInstanceTemplatePatch unmarshals an instance of InstanceTemplatePatch from the specified map of raw messages.
func UnmarshalInstanceTemplatePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceTemplatePatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the InstanceTemplatePatch
func (instanceTemplatePatch *InstanceTemplatePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(instanceTemplatePatch.Name) {
		_patch["name"] = instanceTemplatePatch.Name
	}

	return
}

// InstanceTemplatePrototype : InstanceTemplatePrototype struct
// Models which "extend" this model:
// - InstanceTemplatePrototypeInstanceTemplateByImage
// - InstanceTemplatePrototypeInstanceTemplateBySourceTemplate
// - InstanceTemplatePrototypeInstanceTemplateBySourceSnapshot
// - InstanceTemplatePrototypeInstanceTemplateByCatalogOffering
type InstanceTemplatePrototype struct {
	// The availability policy to use for this virtual server instance.
	AvailabilityPolicy *InstanceAvailabilityPolicyPrototype `json:"availability_policy,omitempty"`

	// The cluster network attachments to create for this virtual server instance. A cluster network attachment represents
	// a device that is connected to a cluster network. The number of network attachments must match one of the values from
	// the instance profile's `cluster_network_attachment_count` before the instance can be started.
	ClusterNetworkAttachments []InstanceClusterNetworkAttachmentPrototypeInstanceContext `json:"cluster_network_attachments,omitempty"`

	// The confidential compute mode to use for this virtual server instance.
	//
	// If unspecified, the default confidential compute mode from the profile will be used.
	ConfidentialComputeMode *string `json:"confidential_compute_mode,omitempty"`

	// The default trusted profile configuration to use for this virtual server instance
	//
	// This property's value is used when provisioning the virtual server instance, but not
	// subsequently managed. Accordingly, it is reflected as an [instance
	// initialization](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization)
	// property.
	DefaultTrustedProfile *InstanceDefaultTrustedProfilePrototype `json:"default_trusted_profile,omitempty"`

	// Indicates whether secure boot is enabled for this virtual server instance.
	//
	// If unspecified, the default secure boot mode from the profile will be used.
	EnableSecureBoot *bool `json:"enable_secure_boot,omitempty"`

	// The public SSH keys for this virtual server instance. Keys will be made available to the virtual server instance as
	// cloud-init vendor data. For cloud-init enabled images, these keys will also be added as SSH authorized keys for the
	// [default user](https://cloud.ibm.com/docs/vpc?topic=vpc-vsi_is_connecting_linux#determining-default-user-account).
	//
	// For Windows images, the keys of type `rsa` must be specified, and one will be selected to encrypt [the administrator
	// password](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization). Keys are optional for other images, but if
	// no keys are specified, the instance will be inaccessible unless the specified image provides another means of
	// access.
	//
	// This property's value is used when provisioning the virtual server instance, but not subsequently managed.
	// Accordingly, it is reflected as an [instance
	// initialization](https://cloud.ibm.com/apidocs/vpc#get-instance-initialization) property.
	Keys []KeyIdentityIntf `json:"keys,omitempty"`

	// The metadata service configuration.
	MetadataService *InstanceMetadataServicePrototype `json:"metadata_service,omitempty"`

	// The name for this instance template. The name must not be used by another instance template in the region. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The placement restrictions to use for the virtual server instance.
	//
	// If specified, `reservation_affinity.policy` must be `disabled`.
	PlacementTarget InstancePlacementTargetPrototypeIntf `json:"placement_target,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) to use for this
	// virtual server instance.
	//
	// If unspecified, `bx2-2x8` will be used, but this default value is expected to change
	// in the future.
	Profile InstanceProfileIdentityIntf `json:"profile,omitempty"`

	// The reservation affinity settings for this virtual server instance. If specified,
	// `vcpu.tenancy` must be `dedicated`, and `vcpu.percentage` must be `100`.
	ReservationAffinity *InstanceReservationAffinityPrototype `json:"reservation_affinity,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The amount of bandwidth (in megabits per second) allocated exclusively to instance storage volumes. An increase in
	// this value will result in a corresponding decrease to
	// `total_network_bandwidth`.
	TotalVolumeBandwidth *int64 `json:"total_volume_bandwidth,omitempty"`

	// The [user data](https://cloud.ibm.com/docs/vpc?topic=vpc-user-data) to make available when setting up the virtual
	// server instance.
	UserData *string `json:"user_data,omitempty"`

	// The additional volume attachments to create for the virtual server instance.
	VolumeAttachments []VolumeAttachmentPrototype `json:"volume_attachments,omitempty"`

	// The VPC this virtual server instance will reside in.
	//
	// If specified, it must match the VPC for the subnets of the instance network
	// attachments or instance network interfaces.
	VPC VPCIdentityIntf `json:"vpc,omitempty"`

	// The boot volume attachment to create for the virtual server instance.
	BootVolumeAttachment *VolumeAttachmentPrototypeInstanceByImageContext `json:"boot_volume_attachment,omitempty"`

	// The image to use when provisioning the virtual server instance.
	Image ImageIdentityIntf `json:"image,omitempty"`

	// The zone this virtual server instance will reside in.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`

	// The additional network attachments to create for the virtual server instance.
	NetworkAttachments []InstanceNetworkAttachmentPrototype `json:"network_attachments,omitempty"`

	// The primary network attachment to create for the virtual server instance.
	PrimaryNetworkAttachment *InstanceNetworkAttachmentPrototype `json:"primary_network_attachment,omitempty"`

	// The additional instance network interfaces to create.
	NetworkInterfaces []NetworkInterfacePrototype `json:"network_interfaces,omitempty"`

	// The primary instance network interface to create.
	PrimaryNetworkInterface *NetworkInterfacePrototype `json:"primary_network_interface,omitempty"`

	// The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user)
	// offering version to use when provisioning this virtual server instance.
	// If an offering is specified, the latest version of that offering will be used.
	//
	// The specified offering or offering version may be in a different account, subject to
	// IAM policies.
	//
	// If specified, `image` must not be specified, and `source_template` must not have
	// `image` specified.
	CatalogOffering InstanceCatalogOfferingPrototypeIntf `json:"catalog_offering,omitempty"`

	// The template to create this virtual server instance from.
	SourceTemplate InstanceTemplateIdentityIntf `json:"source_template,omitempty"`
}

// Constants associated with the InstanceTemplatePrototype.ConfidentialComputeMode property.
// The confidential compute mode to use for this virtual server instance.
//
// If unspecified, the default confidential compute mode from the profile will be used.
const (
	InstanceTemplatePrototypeConfidentialComputeModeDisabledConst = "disabled"
	InstanceTemplatePrototypeConfidentialComputeModeSgxConst      = "sgx"
	InstanceTemplatePrototypeConfidentialComputeModeTdxConst      = "tdx"
)

func (*InstanceTemplatePrototype) isaInstanceTemplatePrototype() bool {
	return true
}

type InstanceTemplatePrototypeIntf interface {
	isaInstanceTemplatePrototype() bool
}

// UnmarshalInstanceTemplatePrototype unmarshals an instance of InstanceTemplatePrototype from the specified map of raw messages.
func UnmarshalInstanceTemplatePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceTemplatePrototype)
	err = core.UnmarshalModel(m, "availability_policy", &obj.AvailabilityPolicy, UnmarshalInstanceAvailabilityPolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "availability_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cluster_network_attachments", &obj.ClusterNetworkAttachments, UnmarshalInstanceClusterNetworkAttachmentPrototypeInstanceContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "cluster_network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "confidential_compute_mode", &obj.ConfidentialComputeMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "confidential_compute_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_trusted_profile", &obj.DefaultTrustedProfile, UnmarshalInstanceDefaultTrustedProfilePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_trusted_profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_secure_boot", &obj.EnableSecureBoot)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_secure_boot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "metadata_service", &obj.MetadataService, UnmarshalInstanceMetadataServicePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "metadata_service-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "placement_target", &obj.PlacementTarget, UnmarshalInstancePlacementTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "placement_target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalInstanceProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservation_affinity", &obj.ReservationAffinity, UnmarshalInstanceReservationAffinityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservation_affinity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_volume_bandwidth", &obj.TotalVolumeBandwidth)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_volume_bandwidth-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_data", &obj.UserData)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_data-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "volume_attachments", &obj.VolumeAttachments, UnmarshalVolumeAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "volume_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "boot_volume_attachment", &obj.BootVolumeAttachment, UnmarshalVolumeAttachmentPrototypeInstanceByImageContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "boot_volume_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "image", &obj.Image, UnmarshalImageIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "image-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_attachments", &obj.NetworkAttachments, UnmarshalInstanceNetworkAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_attachments-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_attachment", &obj.PrimaryNetworkAttachment, UnmarshalInstanceNetworkAttachmentPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_attachment-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_network_interface", &obj.PrimaryNetworkInterface, UnmarshalNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "catalog_offering", &obj.CatalogOffering, UnmarshalInstanceCatalogOfferingPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "catalog_offering-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_template", &obj.SourceTemplate, UnmarshalInstanceTemplateIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_template-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceTemplateReference : InstanceTemplateReference struct
type InstanceTemplateReference struct {
	// The CRN for this instance template.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance template.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance template.
	ID *string `json:"id" validate:"required"`

	// The name for this instance template. The name is unique across all instance templates in the region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalInstanceTemplateReference unmarshals an instance of InstanceTemplateReference from the specified map of raw messages.
func UnmarshalInstanceTemplateReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceTemplateReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// InstanceVcpu : The virtual server instance VCPU configuration.
type InstanceVcpu struct {
	// The VCPU architecture.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Architecture *string `json:"architecture" validate:"required"`

	// The number of VCPUs assigned.
	Count *int64 `json:"count" validate:"required"`

	// The VCPU manufacturer.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Manufacturer *string `json:"manufacturer" validate:"required"`
}

// Constants associated with the InstanceVcpu.Architecture property.
// The VCPU architecture.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceVcpuArchitectureAmd64Const = "amd64"
	InstanceVcpuArchitectureS390xConst = "s390x"
)

// Constants associated with the InstanceVcpu.Manufacturer property.
// The VCPU manufacturer.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	InstanceVcpuManufacturerAmdConst   = "amd"
	InstanceVcpuManufacturerIBMConst   = "ibm"
	InstanceVcpuManufacturerIntelConst = "intel"
)

// UnmarshalInstanceVcpu unmarshals an instance of InstanceVcpu from the specified map of raw messages.
func UnmarshalInstanceVcpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(InstanceVcpu)
	err = core.UnmarshalPrimitive(m, "architecture", &obj.Architecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "count", &obj.Count)
	if err != nil {
		err = core.SDKErrorf(err, "", "count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "manufacturer", &obj.Manufacturer)
	if err != nil {
		err = core.SDKErrorf(err, "", "manufacturer-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Key : Key struct
type Key struct {
	// The date and time that the key was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this key.
	CRN *string `json:"crn" validate:"required"`

	// The fingerprint for this key.  The value is returned base64-encoded and prefixed with the hash algorithm (such as
	// `SHA256`).
	//
	// The length of this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Fingerprint *string `json:"fingerprint" validate:"required"`

	// The URL for this key.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this key.
	ID *string `json:"id" validate:"required"`

	// The length of this key (in bits).
	Length *int64 `json:"length" validate:"required"`

	// The name for this key. The name must not be used by another key in the region. If unspecified, the name will be a
	// hyphenated list of randomly-selected words.
	Name *string `json:"name" validate:"required"`

	// The public SSH key, consisting of two space-separated fields: the algorithm name, and the base64-encoded key.
	PublicKey *string `json:"public_key" validate:"required"`

	// The resource group for this key.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The crypto-system for this key.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`
}

// Constants associated with the Key.Type property.
// The crypto-system for this key.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	KeyTypeEd25519Const = "ed25519"
	KeyTypeRsaConst     = "rsa"
)

// UnmarshalKey unmarshals an instance of Key from the specified map of raw messages.
func UnmarshalKey(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Key)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fingerprint", &obj.Fingerprint)
	if err != nil {
		err = core.SDKErrorf(err, "", "fingerprint-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "length", &obj.Length)
	if err != nil {
		err = core.SDKErrorf(err, "", "length-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "public_key", &obj.PublicKey)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// KeyCollection : KeyCollection struct
type KeyCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of keys.
	Keys []Key `json:"keys" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalKeyCollection unmarshals an instance of KeyCollection from the specified map of raw messages.
func UnmarshalKeyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(KeyCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "keys", &obj.Keys, UnmarshalKey)
	if err != nil {
		err = core.SDKErrorf(err, "", "keys-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *KeyCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// KeyIdentity : Identifies a key by a unique property.
// Models which "extend" this model:
// - KeyIdentityByID
// - KeyIdentityByCRN
// - KeyIdentityByHref
// - KeyIdentityByFingerprint
type KeyIdentity struct {
	// The unique identifier for this key.
	ID *string `json:"id,omitempty"`

	// The CRN for this key.
	CRN *string `json:"crn,omitempty"`

	// The URL for this key.
	Href *string `json:"href,omitempty"`

	// The fingerprint for this key.  The value is returned base64-encoded and prefixed with the hash algorithm (such as
	// `SHA256`).
	//
	// The length of this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Fingerprint *string `json:"fingerprint,omitempty"`
}

func (*KeyIdentity) isaKeyIdentity() bool {
	return true
}

type KeyIdentityIntf interface {
	isaKeyIdentity() bool
}

// UnmarshalKeyIdentity unmarshals an instance of KeyIdentity from the specified map of raw messages.
func UnmarshalKeyIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(KeyIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fingerprint", &obj.Fingerprint)
	if err != nil {
		err = core.SDKErrorf(err, "", "fingerprint-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// KeyPatch : KeyPatch struct
type KeyPatch struct {
	// The name for this key. The name must not be used by another key in the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalKeyPatch unmarshals an instance of KeyPatch from the specified map of raw messages.
func UnmarshalKeyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(KeyPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the KeyPatch
func (keyPatch *KeyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(keyPatch.Name) {
		_patch["name"] = keyPatch.Name
	}

	return
}

// KeyReference : KeyReference struct
type KeyReference struct {
	// The CRN for this key.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The fingerprint for this key.  The value is returned base64-encoded and prefixed with the hash algorithm (such as
	// `SHA256`).
	//
	// The length of this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Fingerprint *string `json:"fingerprint" validate:"required"`

	// The URL for this key.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this key.
	ID *string `json:"id" validate:"required"`

	// The name for this key. The name is unique across all keys in the region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalKeyReference unmarshals an instance of KeyReference from the specified map of raw messages.
func UnmarshalKeyReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(KeyReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fingerprint", &obj.Fingerprint)
	if err != nil {
		err = core.SDKErrorf(err, "", "fingerprint-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LegacyCloudObjectStorageBucketIdentity : Identifies a Cloud Object Storage bucket by a unique property.
// Models which "extend" this model:
// - LegacyCloudObjectStorageBucketIdentityCloudObjectStorageBucketIdentityByName
type LegacyCloudObjectStorageBucketIdentity struct {
	// The globally unique name of this Cloud Object Storage bucket.
	Name *string `json:"name,omitempty"`
}

func (*LegacyCloudObjectStorageBucketIdentity) isaLegacyCloudObjectStorageBucketIdentity() bool {
	return true
}

type LegacyCloudObjectStorageBucketIdentityIntf interface {
	isaLegacyCloudObjectStorageBucketIdentity() bool
}

// UnmarshalLegacyCloudObjectStorageBucketIdentity unmarshals an instance of LegacyCloudObjectStorageBucketIdentity from the specified map of raw messages.
func UnmarshalLegacyCloudObjectStorageBucketIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LegacyCloudObjectStorageBucketIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LegacyCloudObjectStorageBucketReference : LegacyCloudObjectStorageBucketReference struct
type LegacyCloudObjectStorageBucketReference struct {
	// The globally unique name of this Cloud Object Storage bucket.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalLegacyCloudObjectStorageBucketReference unmarshals an instance of LegacyCloudObjectStorageBucketReference from the specified map of raw messages.
func UnmarshalLegacyCloudObjectStorageBucketReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LegacyCloudObjectStorageBucketReference)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ListBackupPoliciesOptions : The ListBackupPolicies options.
type ListBackupPoliciesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to resources with an item in the `tags` property matching the exact specified tag.
	Tag *string `json:"tag,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBackupPoliciesOptions : Instantiate ListBackupPoliciesOptions
func (*VpcV1) NewListBackupPoliciesOptions() *ListBackupPoliciesOptions {
	return &ListBackupPoliciesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListBackupPoliciesOptions) SetStart(start string) *ListBackupPoliciesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListBackupPoliciesOptions) SetLimit(limit int64) *ListBackupPoliciesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListBackupPoliciesOptions) SetResourceGroupID(resourceGroupID string) *ListBackupPoliciesOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListBackupPoliciesOptions) SetName(name string) *ListBackupPoliciesOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetTag : Allow user to set Tag
func (_options *ListBackupPoliciesOptions) SetTag(tag string) *ListBackupPoliciesOptions {
	_options.Tag = core.StringPtr(tag)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBackupPoliciesOptions) SetHeaders(param map[string]string) *ListBackupPoliciesOptions {
	options.Headers = param
	return options
}

// ListBackupPolicyJobsOptions : The ListBackupPolicyJobs options.
type ListBackupPolicyJobsOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// Filters the collection to backup policy jobs with a `status` property matching the specified value.
	Status *string `json:"status,omitempty"`

	// Filters the collection to backup policy jobs with a `backup_policy_plan.id` property matching the specified
	// identifier.
	BackupPolicyPlanID *string `json:"backup_policy_plan.id,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to backup policy jobs with a `source.id` property matching the specified identifier.
	SourceID *string `json:"source.id,omitempty"`

	// Filters the collection to backup policy jobs with an item in the `target_snapshots` property with an `id` property
	// matching the specified identifier.
	TargetSnapshotsID *string `json:"target_snapshots[].id,omitempty"`

	// Filters the collection to backup policy jobs with an item in the `target_snapshots` property with a `crn` property
	// matching the specified CRN.
	TargetSnapshotsCRN *string `json:"target_snapshots[].crn,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListBackupPolicyJobsOptions.Status property.
// Filters the collection to backup policy jobs with a `status` property matching the specified value.
const (
	ListBackupPolicyJobsOptionsStatusFailedConst    = "failed"
	ListBackupPolicyJobsOptionsStatusRunningConst   = "running"
	ListBackupPolicyJobsOptionsStatusSucceededConst = "succeeded"
)

// Constants associated with the ListBackupPolicyJobsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListBackupPolicyJobsOptionsSortCreatedAtConst = "created_at"
	ListBackupPolicyJobsOptionsSortNameConst      = "name"
)

// NewListBackupPolicyJobsOptions : Instantiate ListBackupPolicyJobsOptions
func (*VpcV1) NewListBackupPolicyJobsOptions(backupPolicyID string) *ListBackupPolicyJobsOptions {
	return &ListBackupPolicyJobsOptions{
		BackupPolicyID: core.StringPtr(backupPolicyID),
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *ListBackupPolicyJobsOptions) SetBackupPolicyID(backupPolicyID string) *ListBackupPolicyJobsOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetStatus : Allow user to set Status
func (_options *ListBackupPolicyJobsOptions) SetStatus(status string) *ListBackupPolicyJobsOptions {
	_options.Status = core.StringPtr(status)
	return _options
}

// SetBackupPolicyPlanID : Allow user to set BackupPolicyPlanID
func (_options *ListBackupPolicyJobsOptions) SetBackupPolicyPlanID(backupPolicyPlanID string) *ListBackupPolicyJobsOptions {
	_options.BackupPolicyPlanID = core.StringPtr(backupPolicyPlanID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListBackupPolicyJobsOptions) SetStart(start string) *ListBackupPolicyJobsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListBackupPolicyJobsOptions) SetLimit(limit int64) *ListBackupPolicyJobsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListBackupPolicyJobsOptions) SetSort(sort string) *ListBackupPolicyJobsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetSourceID : Allow user to set SourceID
func (_options *ListBackupPolicyJobsOptions) SetSourceID(sourceID string) *ListBackupPolicyJobsOptions {
	_options.SourceID = core.StringPtr(sourceID)
	return _options
}

// SetTargetSnapshotsID : Allow user to set TargetSnapshotsID
func (_options *ListBackupPolicyJobsOptions) SetTargetSnapshotsID(targetSnapshotsID string) *ListBackupPolicyJobsOptions {
	_options.TargetSnapshotsID = core.StringPtr(targetSnapshotsID)
	return _options
}

// SetTargetSnapshotsCRN : Allow user to set TargetSnapshotsCRN
func (_options *ListBackupPolicyJobsOptions) SetTargetSnapshotsCRN(targetSnapshotsCRN string) *ListBackupPolicyJobsOptions {
	_options.TargetSnapshotsCRN = core.StringPtr(targetSnapshotsCRN)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBackupPolicyJobsOptions) SetHeaders(param map[string]string) *ListBackupPolicyJobsOptions {
	options.Headers = param
	return options
}

// ListBackupPolicyPlansOptions : The ListBackupPolicyPlans options.
type ListBackupPolicyPlansOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBackupPolicyPlansOptions : Instantiate ListBackupPolicyPlansOptions
func (*VpcV1) NewListBackupPolicyPlansOptions(backupPolicyID string) *ListBackupPolicyPlansOptions {
	return &ListBackupPolicyPlansOptions{
		BackupPolicyID: core.StringPtr(backupPolicyID),
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *ListBackupPolicyPlansOptions) SetBackupPolicyID(backupPolicyID string) *ListBackupPolicyPlansOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListBackupPolicyPlansOptions) SetName(name string) *ListBackupPolicyPlansOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBackupPolicyPlansOptions) SetHeaders(param map[string]string) *ListBackupPolicyPlansOptions {
	options.Headers = param
	return options
}

// ListBareMetalServerDisksOptions : The ListBareMetalServerDisks options.
type ListBareMetalServerDisksOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServerDisksOptions : Instantiate ListBareMetalServerDisksOptions
func (*VpcV1) NewListBareMetalServerDisksOptions(bareMetalServerID string) *ListBareMetalServerDisksOptions {
	return &ListBareMetalServerDisksOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *ListBareMetalServerDisksOptions) SetBareMetalServerID(bareMetalServerID string) *ListBareMetalServerDisksOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServerDisksOptions) SetHeaders(param map[string]string) *ListBareMetalServerDisksOptions {
	options.Headers = param
	return options
}

// ListBareMetalServerNetworkAttachmentsOptions : The ListBareMetalServerNetworkAttachments options.
type ListBareMetalServerNetworkAttachmentsOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServerNetworkAttachmentsOptions : Instantiate ListBareMetalServerNetworkAttachmentsOptions
func (*VpcV1) NewListBareMetalServerNetworkAttachmentsOptions(bareMetalServerID string) *ListBareMetalServerNetworkAttachmentsOptions {
	return &ListBareMetalServerNetworkAttachmentsOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *ListBareMetalServerNetworkAttachmentsOptions) SetBareMetalServerID(bareMetalServerID string) *ListBareMetalServerNetworkAttachmentsOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListBareMetalServerNetworkAttachmentsOptions) SetStart(start string) *ListBareMetalServerNetworkAttachmentsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListBareMetalServerNetworkAttachmentsOptions) SetLimit(limit int64) *ListBareMetalServerNetworkAttachmentsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServerNetworkAttachmentsOptions) SetHeaders(param map[string]string) *ListBareMetalServerNetworkAttachmentsOptions {
	options.Headers = param
	return options
}

// ListBareMetalServerNetworkInterfaceFloatingIpsOptions : The ListBareMetalServerNetworkInterfaceFloatingIps options.
type ListBareMetalServerNetworkInterfaceFloatingIpsOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServerNetworkInterfaceFloatingIpsOptions : Instantiate ListBareMetalServerNetworkInterfaceFloatingIpsOptions
func (*VpcV1) NewListBareMetalServerNetworkInterfaceFloatingIpsOptions(bareMetalServerID string, networkInterfaceID string) *ListBareMetalServerNetworkInterfaceFloatingIpsOptions {
	return &ListBareMetalServerNetworkInterfaceFloatingIpsOptions{
		BareMetalServerID:  core.StringPtr(bareMetalServerID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *ListBareMetalServerNetworkInterfaceFloatingIpsOptions) SetBareMetalServerID(bareMetalServerID string) *ListBareMetalServerNetworkInterfaceFloatingIpsOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *ListBareMetalServerNetworkInterfaceFloatingIpsOptions) SetNetworkInterfaceID(networkInterfaceID string) *ListBareMetalServerNetworkInterfaceFloatingIpsOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServerNetworkInterfaceFloatingIpsOptions) SetHeaders(param map[string]string) *ListBareMetalServerNetworkInterfaceFloatingIpsOptions {
	options.Headers = param
	return options
}

// ListBareMetalServerNetworkInterfaceIpsOptions : The ListBareMetalServerNetworkInterfaceIps options.
type ListBareMetalServerNetworkInterfaceIpsOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServerNetworkInterfaceIpsOptions : Instantiate ListBareMetalServerNetworkInterfaceIpsOptions
func (*VpcV1) NewListBareMetalServerNetworkInterfaceIpsOptions(bareMetalServerID string, networkInterfaceID string) *ListBareMetalServerNetworkInterfaceIpsOptions {
	return &ListBareMetalServerNetworkInterfaceIpsOptions{
		BareMetalServerID:  core.StringPtr(bareMetalServerID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *ListBareMetalServerNetworkInterfaceIpsOptions) SetBareMetalServerID(bareMetalServerID string) *ListBareMetalServerNetworkInterfaceIpsOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *ListBareMetalServerNetworkInterfaceIpsOptions) SetNetworkInterfaceID(networkInterfaceID string) *ListBareMetalServerNetworkInterfaceIpsOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServerNetworkInterfaceIpsOptions) SetHeaders(param map[string]string) *ListBareMetalServerNetworkInterfaceIpsOptions {
	options.Headers = param
	return options
}

// ListBareMetalServerNetworkInterfacesOptions : The ListBareMetalServerNetworkInterfaces options.
type ListBareMetalServerNetworkInterfacesOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServerNetworkInterfacesOptions : Instantiate ListBareMetalServerNetworkInterfacesOptions
func (*VpcV1) NewListBareMetalServerNetworkInterfacesOptions(bareMetalServerID string) *ListBareMetalServerNetworkInterfacesOptions {
	return &ListBareMetalServerNetworkInterfacesOptions{
		BareMetalServerID: core.StringPtr(bareMetalServerID),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *ListBareMetalServerNetworkInterfacesOptions) SetBareMetalServerID(bareMetalServerID string) *ListBareMetalServerNetworkInterfacesOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListBareMetalServerNetworkInterfacesOptions) SetStart(start string) *ListBareMetalServerNetworkInterfacesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListBareMetalServerNetworkInterfacesOptions) SetLimit(limit int64) *ListBareMetalServerNetworkInterfacesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServerNetworkInterfacesOptions) SetHeaders(param map[string]string) *ListBareMetalServerNetworkInterfacesOptions {
	options.Headers = param
	return options
}

// ListBareMetalServerProfilesOptions : The ListBareMetalServerProfiles options.
type ListBareMetalServerProfilesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServerProfilesOptions : Instantiate ListBareMetalServerProfilesOptions
func (*VpcV1) NewListBareMetalServerProfilesOptions() *ListBareMetalServerProfilesOptions {
	return &ListBareMetalServerProfilesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListBareMetalServerProfilesOptions) SetStart(start string) *ListBareMetalServerProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListBareMetalServerProfilesOptions) SetLimit(limit int64) *ListBareMetalServerProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServerProfilesOptions) SetHeaders(param map[string]string) *ListBareMetalServerProfilesOptions {
	options.Headers = param
	return options
}

// ListBareMetalServersOptions : The ListBareMetalServers options.
type ListBareMetalServersOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to resources with a `reservation.id` property matching the specified identifier.
	ReservationID *string `json:"reservation.id,omitempty"`

	// Filters the collection to resources with a `reservation.crn` property matching the specified identifier.
	ReservationCRN *string `json:"reservation.crn,omitempty"`

	// Filters the collection to resources with a `reservation.name` property matching the specified identifier.
	ReservationName *string `json:"reservation.name,omitempty"`

	// Filters the collection to resources with a `vpc.id` property matching the specified identifier.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListBareMetalServersOptions : Instantiate ListBareMetalServersOptions
func (*VpcV1) NewListBareMetalServersOptions() *ListBareMetalServersOptions {
	return &ListBareMetalServersOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListBareMetalServersOptions) SetStart(start string) *ListBareMetalServersOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListBareMetalServersOptions) SetLimit(limit int64) *ListBareMetalServersOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListBareMetalServersOptions) SetResourceGroupID(resourceGroupID string) *ListBareMetalServersOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListBareMetalServersOptions) SetName(name string) *ListBareMetalServersOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetReservationID : Allow user to set ReservationID
func (_options *ListBareMetalServersOptions) SetReservationID(reservationID string) *ListBareMetalServersOptions {
	_options.ReservationID = core.StringPtr(reservationID)
	return _options
}

// SetReservationCRN : Allow user to set ReservationCRN
func (_options *ListBareMetalServersOptions) SetReservationCRN(reservationCRN string) *ListBareMetalServersOptions {
	_options.ReservationCRN = core.StringPtr(reservationCRN)
	return _options
}

// SetReservationName : Allow user to set ReservationName
func (_options *ListBareMetalServersOptions) SetReservationName(reservationName string) *ListBareMetalServersOptions {
	_options.ReservationName = core.StringPtr(reservationName)
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListBareMetalServersOptions) SetVPCID(vpcID string) *ListBareMetalServersOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListBareMetalServersOptions) SetVPCCRN(vpcCRN string) *ListBareMetalServersOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListBareMetalServersOptions) SetVPCName(vpcName string) *ListBareMetalServersOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListBareMetalServersOptions) SetHeaders(param map[string]string) *ListBareMetalServersOptions {
	options.Headers = param
	return options
}

// ListClusterNetworkInterfacesOptions : The ListClusterNetworkInterfaces options.
type ListClusterNetworkInterfacesOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListClusterNetworkInterfacesOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListClusterNetworkInterfacesOptionsSortCreatedAtConst = "created_at"
	ListClusterNetworkInterfacesOptionsSortNameConst      = "name"
)

// NewListClusterNetworkInterfacesOptions : Instantiate ListClusterNetworkInterfacesOptions
func (*VpcV1) NewListClusterNetworkInterfacesOptions(clusterNetworkID string) *ListClusterNetworkInterfacesOptions {
	return &ListClusterNetworkInterfacesOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *ListClusterNetworkInterfacesOptions) SetClusterNetworkID(clusterNetworkID string) *ListClusterNetworkInterfacesOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListClusterNetworkInterfacesOptions) SetStart(start string) *ListClusterNetworkInterfacesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListClusterNetworkInterfacesOptions) SetLimit(limit int64) *ListClusterNetworkInterfacesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListClusterNetworkInterfacesOptions) SetName(name string) *ListClusterNetworkInterfacesOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListClusterNetworkInterfacesOptions) SetSort(sort string) *ListClusterNetworkInterfacesOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListClusterNetworkInterfacesOptions) SetHeaders(param map[string]string) *ListClusterNetworkInterfacesOptions {
	options.Headers = param
	return options
}

// ListClusterNetworkProfilesOptions : The ListClusterNetworkProfiles options.
type ListClusterNetworkProfilesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListClusterNetworkProfilesOptions : Instantiate ListClusterNetworkProfilesOptions
func (*VpcV1) NewListClusterNetworkProfilesOptions() *ListClusterNetworkProfilesOptions {
	return &ListClusterNetworkProfilesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListClusterNetworkProfilesOptions) SetStart(start string) *ListClusterNetworkProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListClusterNetworkProfilesOptions) SetLimit(limit int64) *ListClusterNetworkProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListClusterNetworkProfilesOptions) SetHeaders(param map[string]string) *ListClusterNetworkProfilesOptions {
	options.Headers = param
	return options
}

// ListClusterNetworkSubnetReservedIpsOptions : The ListClusterNetworkSubnetReservedIps options.
type ListClusterNetworkSubnetReservedIpsOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ClusterNetworkSubnetID *string `json:"cluster_network_subnet_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListClusterNetworkSubnetReservedIpsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListClusterNetworkSubnetReservedIpsOptionsSortAddressConst   = "address"
	ListClusterNetworkSubnetReservedIpsOptionsSortCreatedAtConst = "created_at"
	ListClusterNetworkSubnetReservedIpsOptionsSortNameConst      = "name"
)

// NewListClusterNetworkSubnetReservedIpsOptions : Instantiate ListClusterNetworkSubnetReservedIpsOptions
func (*VpcV1) NewListClusterNetworkSubnetReservedIpsOptions(clusterNetworkID string, clusterNetworkSubnetID string) *ListClusterNetworkSubnetReservedIpsOptions {
	return &ListClusterNetworkSubnetReservedIpsOptions{
		ClusterNetworkID:       core.StringPtr(clusterNetworkID),
		ClusterNetworkSubnetID: core.StringPtr(clusterNetworkSubnetID),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *ListClusterNetworkSubnetReservedIpsOptions) SetClusterNetworkID(clusterNetworkID string) *ListClusterNetworkSubnetReservedIpsOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkSubnetID : Allow user to set ClusterNetworkSubnetID
func (_options *ListClusterNetworkSubnetReservedIpsOptions) SetClusterNetworkSubnetID(clusterNetworkSubnetID string) *ListClusterNetworkSubnetReservedIpsOptions {
	_options.ClusterNetworkSubnetID = core.StringPtr(clusterNetworkSubnetID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListClusterNetworkSubnetReservedIpsOptions) SetStart(start string) *ListClusterNetworkSubnetReservedIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListClusterNetworkSubnetReservedIpsOptions) SetLimit(limit int64) *ListClusterNetworkSubnetReservedIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListClusterNetworkSubnetReservedIpsOptions) SetName(name string) *ListClusterNetworkSubnetReservedIpsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListClusterNetworkSubnetReservedIpsOptions) SetSort(sort string) *ListClusterNetworkSubnetReservedIpsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListClusterNetworkSubnetReservedIpsOptions) SetHeaders(param map[string]string) *ListClusterNetworkSubnetReservedIpsOptions {
	options.Headers = param
	return options
}

// ListClusterNetworkSubnetsOptions : The ListClusterNetworkSubnets options.
type ListClusterNetworkSubnetsOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListClusterNetworkSubnetsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListClusterNetworkSubnetsOptionsSortCreatedAtConst = "created_at"
	ListClusterNetworkSubnetsOptionsSortNameConst      = "name"
)

// NewListClusterNetworkSubnetsOptions : Instantiate ListClusterNetworkSubnetsOptions
func (*VpcV1) NewListClusterNetworkSubnetsOptions(clusterNetworkID string) *ListClusterNetworkSubnetsOptions {
	return &ListClusterNetworkSubnetsOptions{
		ClusterNetworkID: core.StringPtr(clusterNetworkID),
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *ListClusterNetworkSubnetsOptions) SetClusterNetworkID(clusterNetworkID string) *ListClusterNetworkSubnetsOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListClusterNetworkSubnetsOptions) SetStart(start string) *ListClusterNetworkSubnetsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListClusterNetworkSubnetsOptions) SetLimit(limit int64) *ListClusterNetworkSubnetsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListClusterNetworkSubnetsOptions) SetName(name string) *ListClusterNetworkSubnetsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListClusterNetworkSubnetsOptions) SetSort(sort string) *ListClusterNetworkSubnetsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListClusterNetworkSubnetsOptions) SetHeaders(param map[string]string) *ListClusterNetworkSubnetsOptions {
	options.Headers = param
	return options
}

// ListClusterNetworksOptions : The ListClusterNetworks options.
type ListClusterNetworksOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to cluster networks with a `vpc.id` property matching the specified id.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to cluster networks with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to cluster networks with a `vpc.name` property matching the specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListClusterNetworksOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListClusterNetworksOptionsSortCreatedAtConst = "created_at"
	ListClusterNetworksOptionsSortNameConst      = "name"
)

// NewListClusterNetworksOptions : Instantiate ListClusterNetworksOptions
func (*VpcV1) NewListClusterNetworksOptions() *ListClusterNetworksOptions {
	return &ListClusterNetworksOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListClusterNetworksOptions) SetStart(start string) *ListClusterNetworksOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListClusterNetworksOptions) SetLimit(limit int64) *ListClusterNetworksOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListClusterNetworksOptions) SetResourceGroupID(resourceGroupID string) *ListClusterNetworksOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListClusterNetworksOptions) SetName(name string) *ListClusterNetworksOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListClusterNetworksOptions) SetSort(sort string) *ListClusterNetworksOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListClusterNetworksOptions) SetVPCID(vpcID string) *ListClusterNetworksOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListClusterNetworksOptions) SetVPCCRN(vpcCRN string) *ListClusterNetworksOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListClusterNetworksOptions) SetVPCName(vpcName string) *ListClusterNetworksOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListClusterNetworksOptions) SetHeaders(param map[string]string) *ListClusterNetworksOptions {
	options.Headers = param
	return options
}

// ListDedicatedHostDisksOptions : The ListDedicatedHostDisks options.
type ListDedicatedHostDisksOptions struct {
	// The dedicated host identifier.
	DedicatedHostID *string `json:"dedicated_host_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListDedicatedHostDisksOptions : Instantiate ListDedicatedHostDisksOptions
func (*VpcV1) NewListDedicatedHostDisksOptions(dedicatedHostID string) *ListDedicatedHostDisksOptions {
	return &ListDedicatedHostDisksOptions{
		DedicatedHostID: core.StringPtr(dedicatedHostID),
	}
}

// SetDedicatedHostID : Allow user to set DedicatedHostID
func (_options *ListDedicatedHostDisksOptions) SetDedicatedHostID(dedicatedHostID string) *ListDedicatedHostDisksOptions {
	_options.DedicatedHostID = core.StringPtr(dedicatedHostID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListDedicatedHostDisksOptions) SetHeaders(param map[string]string) *ListDedicatedHostDisksOptions {
	options.Headers = param
	return options
}

// ListDedicatedHostGroupsOptions : The ListDedicatedHostGroups options.
type ListDedicatedHostGroupsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `zone.name` property matching the exact specified name.
	ZoneName *string `json:"zone.name,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListDedicatedHostGroupsOptions : Instantiate ListDedicatedHostGroupsOptions
func (*VpcV1) NewListDedicatedHostGroupsOptions() *ListDedicatedHostGroupsOptions {
	return &ListDedicatedHostGroupsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListDedicatedHostGroupsOptions) SetStart(start string) *ListDedicatedHostGroupsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListDedicatedHostGroupsOptions) SetLimit(limit int64) *ListDedicatedHostGroupsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListDedicatedHostGroupsOptions) SetResourceGroupID(resourceGroupID string) *ListDedicatedHostGroupsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *ListDedicatedHostGroupsOptions) SetZoneName(zoneName string) *ListDedicatedHostGroupsOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListDedicatedHostGroupsOptions) SetName(name string) *ListDedicatedHostGroupsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListDedicatedHostGroupsOptions) SetHeaders(param map[string]string) *ListDedicatedHostGroupsOptions {
	options.Headers = param
	return options
}

// ListDedicatedHostProfilesOptions : The ListDedicatedHostProfiles options.
type ListDedicatedHostProfilesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListDedicatedHostProfilesOptions : Instantiate ListDedicatedHostProfilesOptions
func (*VpcV1) NewListDedicatedHostProfilesOptions() *ListDedicatedHostProfilesOptions {
	return &ListDedicatedHostProfilesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListDedicatedHostProfilesOptions) SetStart(start string) *ListDedicatedHostProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListDedicatedHostProfilesOptions) SetLimit(limit int64) *ListDedicatedHostProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListDedicatedHostProfilesOptions) SetHeaders(param map[string]string) *ListDedicatedHostProfilesOptions {
	options.Headers = param
	return options
}

// ListDedicatedHostsOptions : The ListDedicatedHosts options.
type ListDedicatedHostsOptions struct {
	// Filters the collection to dedicated hosts with a `group.id` property matching the specified identifier.
	DedicatedHostGroupID *string `json:"dedicated_host_group.id,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `zone.name` property matching the exact specified name.
	ZoneName *string `json:"zone.name,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListDedicatedHostsOptions : Instantiate ListDedicatedHostsOptions
func (*VpcV1) NewListDedicatedHostsOptions() *ListDedicatedHostsOptions {
	return &ListDedicatedHostsOptions{}
}

// SetDedicatedHostGroupID : Allow user to set DedicatedHostGroupID
func (_options *ListDedicatedHostsOptions) SetDedicatedHostGroupID(dedicatedHostGroupID string) *ListDedicatedHostsOptions {
	_options.DedicatedHostGroupID = core.StringPtr(dedicatedHostGroupID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListDedicatedHostsOptions) SetStart(start string) *ListDedicatedHostsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListDedicatedHostsOptions) SetLimit(limit int64) *ListDedicatedHostsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListDedicatedHostsOptions) SetResourceGroupID(resourceGroupID string) *ListDedicatedHostsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *ListDedicatedHostsOptions) SetZoneName(zoneName string) *ListDedicatedHostsOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListDedicatedHostsOptions) SetName(name string) *ListDedicatedHostsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListDedicatedHostsOptions) SetHeaders(param map[string]string) *ListDedicatedHostsOptions {
	options.Headers = param
	return options
}

// ListEndpointGatewayIpsOptions : The ListEndpointGatewayIps options.
type ListEndpointGatewayIpsOptions struct {
	// The endpoint gateway identifier.
	EndpointGatewayID *string `json:"endpoint_gateway_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListEndpointGatewayIpsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListEndpointGatewayIpsOptionsSortAddressConst   = "address"
	ListEndpointGatewayIpsOptionsSortCreatedAtConst = "created_at"
	ListEndpointGatewayIpsOptionsSortNameConst      = "name"
)

// NewListEndpointGatewayIpsOptions : Instantiate ListEndpointGatewayIpsOptions
func (*VpcV1) NewListEndpointGatewayIpsOptions(endpointGatewayID string) *ListEndpointGatewayIpsOptions {
	return &ListEndpointGatewayIpsOptions{
		EndpointGatewayID: core.StringPtr(endpointGatewayID),
	}
}

// SetEndpointGatewayID : Allow user to set EndpointGatewayID
func (_options *ListEndpointGatewayIpsOptions) SetEndpointGatewayID(endpointGatewayID string) *ListEndpointGatewayIpsOptions {
	_options.EndpointGatewayID = core.StringPtr(endpointGatewayID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListEndpointGatewayIpsOptions) SetStart(start string) *ListEndpointGatewayIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListEndpointGatewayIpsOptions) SetLimit(limit int64) *ListEndpointGatewayIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListEndpointGatewayIpsOptions) SetSort(sort string) *ListEndpointGatewayIpsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListEndpointGatewayIpsOptions) SetHeaders(param map[string]string) *ListEndpointGatewayIpsOptions {
	options.Headers = param
	return options
}

// ListEndpointGatewaysOptions : The ListEndpointGateways options.
type ListEndpointGatewaysOptions struct {
	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `lifecycle_state` property matching one of the specified comma-separated
	// values.
	LifecycleState []string `json:"lifecycle_state,omitempty"`

	// Filters the collection to resources with a `vpc.id` property matching the specified identifier.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Filters the collection to endpoint gateways with an `allow_dns_resolution_binding` property matching the specified
	// value.
	AllowDnsResolutionBinding *bool `json:"allow_dns_resolution_binding,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListEndpointGatewaysOptions.LifecycleState property.
const (
	ListEndpointGatewaysOptionsLifecycleStateDeletingConst  = "deleting"
	ListEndpointGatewaysOptionsLifecycleStateFailedConst    = "failed"
	ListEndpointGatewaysOptionsLifecycleStatePendingConst   = "pending"
	ListEndpointGatewaysOptionsLifecycleStateStableConst    = "stable"
	ListEndpointGatewaysOptionsLifecycleStateSuspendedConst = "suspended"
	ListEndpointGatewaysOptionsLifecycleStateUpdatingConst  = "updating"
	ListEndpointGatewaysOptionsLifecycleStateWaitingConst   = "waiting"
)

// NewListEndpointGatewaysOptions : Instantiate ListEndpointGatewaysOptions
func (*VpcV1) NewListEndpointGatewaysOptions() *ListEndpointGatewaysOptions {
	return &ListEndpointGatewaysOptions{}
}

// SetName : Allow user to set Name
func (_options *ListEndpointGatewaysOptions) SetName(name string) *ListEndpointGatewaysOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListEndpointGatewaysOptions) SetStart(start string) *ListEndpointGatewaysOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListEndpointGatewaysOptions) SetLimit(limit int64) *ListEndpointGatewaysOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListEndpointGatewaysOptions) SetResourceGroupID(resourceGroupID string) *ListEndpointGatewaysOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetLifecycleState : Allow user to set LifecycleState
func (_options *ListEndpointGatewaysOptions) SetLifecycleState(lifecycleState []string) *ListEndpointGatewaysOptions {
	_options.LifecycleState = lifecycleState
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListEndpointGatewaysOptions) SetVPCID(vpcID string) *ListEndpointGatewaysOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListEndpointGatewaysOptions) SetVPCCRN(vpcCRN string) *ListEndpointGatewaysOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListEndpointGatewaysOptions) SetVPCName(vpcName string) *ListEndpointGatewaysOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetAllowDnsResolutionBinding : Allow user to set AllowDnsResolutionBinding
func (_options *ListEndpointGatewaysOptions) SetAllowDnsResolutionBinding(allowDnsResolutionBinding bool) *ListEndpointGatewaysOptions {
	_options.AllowDnsResolutionBinding = core.BoolPtr(allowDnsResolutionBinding)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListEndpointGatewaysOptions) SetHeaders(param map[string]string) *ListEndpointGatewaysOptions {
	options.Headers = param
	return options
}

// ListFloatingIpsOptions : The ListFloatingIps options.
type ListFloatingIpsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to resources with a `target.id` property matching the specified identifier.
	TargetID *string `json:"target.id,omitempty"`

	// Filters the collection to resources with a `target.crn` property matching the specified CRN.
	TargetCRN *string `json:"target.crn,omitempty"`

	// Filters the collection to resources with a `target.name` property matching the exact specified name.
	TargetName *string `json:"target.name,omitempty"`

	// Filters the collection to resources with a `target.resource_type` property matching the specified value.
	TargetResourceType *string `json:"target.resource_type,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListFloatingIpsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListFloatingIpsOptionsSortCreatedAtConst = "created_at"
	ListFloatingIpsOptionsSortNameConst      = "name"
)

// NewListFloatingIpsOptions : Instantiate ListFloatingIpsOptions
func (*VpcV1) NewListFloatingIpsOptions() *ListFloatingIpsOptions {
	return &ListFloatingIpsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListFloatingIpsOptions) SetStart(start string) *ListFloatingIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListFloatingIpsOptions) SetLimit(limit int64) *ListFloatingIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListFloatingIpsOptions) SetResourceGroupID(resourceGroupID string) *ListFloatingIpsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListFloatingIpsOptions) SetSort(sort string) *ListFloatingIpsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetTargetID : Allow user to set TargetID
func (_options *ListFloatingIpsOptions) SetTargetID(targetID string) *ListFloatingIpsOptions {
	_options.TargetID = core.StringPtr(targetID)
	return _options
}

// SetTargetCRN : Allow user to set TargetCRN
func (_options *ListFloatingIpsOptions) SetTargetCRN(targetCRN string) *ListFloatingIpsOptions {
	_options.TargetCRN = core.StringPtr(targetCRN)
	return _options
}

// SetTargetName : Allow user to set TargetName
func (_options *ListFloatingIpsOptions) SetTargetName(targetName string) *ListFloatingIpsOptions {
	_options.TargetName = core.StringPtr(targetName)
	return _options
}

// SetTargetResourceType : Allow user to set TargetResourceType
func (_options *ListFloatingIpsOptions) SetTargetResourceType(targetResourceType string) *ListFloatingIpsOptions {
	_options.TargetResourceType = core.StringPtr(targetResourceType)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListFloatingIpsOptions) SetHeaders(param map[string]string) *ListFloatingIpsOptions {
	options.Headers = param
	return options
}

// ListFlowLogCollectorsOptions : The ListFlowLogCollectors options.
type ListFlowLogCollectorsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to resources with a `vpc.id` property matching the specified identifier.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Filters the collection to resources with a `target.id` property matching the specified identifier.
	TargetID *string `json:"target.id,omitempty"`

	// Filters the collection to resources with a `target.resource_type` property matching the specified value.
	TargetResourceType *string `json:"target.resource_type,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListFlowLogCollectorsOptions : Instantiate ListFlowLogCollectorsOptions
func (*VpcV1) NewListFlowLogCollectorsOptions() *ListFlowLogCollectorsOptions {
	return &ListFlowLogCollectorsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListFlowLogCollectorsOptions) SetStart(start string) *ListFlowLogCollectorsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListFlowLogCollectorsOptions) SetLimit(limit int64) *ListFlowLogCollectorsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListFlowLogCollectorsOptions) SetResourceGroupID(resourceGroupID string) *ListFlowLogCollectorsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListFlowLogCollectorsOptions) SetName(name string) *ListFlowLogCollectorsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListFlowLogCollectorsOptions) SetVPCID(vpcID string) *ListFlowLogCollectorsOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListFlowLogCollectorsOptions) SetVPCCRN(vpcCRN string) *ListFlowLogCollectorsOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListFlowLogCollectorsOptions) SetVPCName(vpcName string) *ListFlowLogCollectorsOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetTargetID : Allow user to set TargetID
func (_options *ListFlowLogCollectorsOptions) SetTargetID(targetID string) *ListFlowLogCollectorsOptions {
	_options.TargetID = core.StringPtr(targetID)
	return _options
}

// SetTargetResourceType : Allow user to set TargetResourceType
func (_options *ListFlowLogCollectorsOptions) SetTargetResourceType(targetResourceType string) *ListFlowLogCollectorsOptions {
	_options.TargetResourceType = core.StringPtr(targetResourceType)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListFlowLogCollectorsOptions) SetHeaders(param map[string]string) *ListFlowLogCollectorsOptions {
	options.Headers = param
	return options
}

// ListIkePoliciesOptions : The ListIkePolicies options.
type ListIkePoliciesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListIkePoliciesOptions : Instantiate ListIkePoliciesOptions
func (*VpcV1) NewListIkePoliciesOptions() *ListIkePoliciesOptions {
	return &ListIkePoliciesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListIkePoliciesOptions) SetStart(start string) *ListIkePoliciesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListIkePoliciesOptions) SetLimit(limit int64) *ListIkePoliciesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListIkePoliciesOptions) SetHeaders(param map[string]string) *ListIkePoliciesOptions {
	options.Headers = param
	return options
}

// ListIkePolicyConnectionsOptions : The ListIkePolicyConnections options.
type ListIkePolicyConnectionsOptions struct {
	// The IKE policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListIkePolicyConnectionsOptions : Instantiate ListIkePolicyConnectionsOptions
func (*VpcV1) NewListIkePolicyConnectionsOptions(id string) *ListIkePolicyConnectionsOptions {
	return &ListIkePolicyConnectionsOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListIkePolicyConnectionsOptions) SetID(id string) *ListIkePolicyConnectionsOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListIkePolicyConnectionsOptions) SetStart(start string) *ListIkePolicyConnectionsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListIkePolicyConnectionsOptions) SetLimit(limit int64) *ListIkePolicyConnectionsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListIkePolicyConnectionsOptions) SetHeaders(param map[string]string) *ListIkePolicyConnectionsOptions {
	options.Headers = param
	return options
}

// ListImageBareMetalServerProfilesOptions : The ListImageBareMetalServerProfiles options.
type ListImageBareMetalServerProfilesOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListImageBareMetalServerProfilesOptions : Instantiate ListImageBareMetalServerProfilesOptions
func (*VpcV1) NewListImageBareMetalServerProfilesOptions(id string) *ListImageBareMetalServerProfilesOptions {
	return &ListImageBareMetalServerProfilesOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListImageBareMetalServerProfilesOptions) SetID(id string) *ListImageBareMetalServerProfilesOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListImageBareMetalServerProfilesOptions) SetStart(start string) *ListImageBareMetalServerProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListImageBareMetalServerProfilesOptions) SetLimit(limit int64) *ListImageBareMetalServerProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListImageBareMetalServerProfilesOptions) SetHeaders(param map[string]string) *ListImageBareMetalServerProfilesOptions {
	options.Headers = param
	return options
}

// ListImageExportJobsOptions : The ListImageExportJobs options.
type ListImageExportJobsOptions struct {
	// The image identifier.
	ImageID *string `json:"image_id" validate:"required,ne="`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListImageExportJobsOptions : Instantiate ListImageExportJobsOptions
func (*VpcV1) NewListImageExportJobsOptions(imageID string) *ListImageExportJobsOptions {
	return &ListImageExportJobsOptions{
		ImageID: core.StringPtr(imageID),
	}
}

// SetImageID : Allow user to set ImageID
func (_options *ListImageExportJobsOptions) SetImageID(imageID string) *ListImageExportJobsOptions {
	_options.ImageID = core.StringPtr(imageID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListImageExportJobsOptions) SetName(name string) *ListImageExportJobsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListImageExportJobsOptions) SetHeaders(param map[string]string) *ListImageExportJobsOptions {
	options.Headers = param
	return options
}

// ListImageInstanceProfilesOptions : The ListImageInstanceProfiles options.
type ListImageInstanceProfilesOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListImageInstanceProfilesOptions : Instantiate ListImageInstanceProfilesOptions
func (*VpcV1) NewListImageInstanceProfilesOptions(id string) *ListImageInstanceProfilesOptions {
	return &ListImageInstanceProfilesOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListImageInstanceProfilesOptions) SetID(id string) *ListImageInstanceProfilesOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListImageInstanceProfilesOptions) SetStart(start string) *ListImageInstanceProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListImageInstanceProfilesOptions) SetLimit(limit int64) *ListImageInstanceProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListImageInstanceProfilesOptions) SetHeaders(param map[string]string) *ListImageInstanceProfilesOptions {
	options.Headers = param
	return options
}

// ListImagesOptions : The ListImages options.
type ListImagesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to images with a `status` property matching one of the specified comma-separated values.
	Status []string `json:"status,omitempty"`

	// Filters the collection to images with a `visibility` property matching the specified value.
	Visibility *string `json:"visibility,omitempty"`

	// Filters the collection to images with a `user_data_format` property matching one of the specified comma-separated
	// values.
	UserDataFormat []string `json:"user_data_format,omitempty"`

	// Filters the collection to images with a `remote.account.id` property matching the specified account identifier.
	//
	// This parameter also supports the values null and not:null which filter the collection to resources which have no
	// remote account identifier or any remote account identifier, respectively.
	RemoteAccountID *string `json:"remote.account.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListImagesOptions.Status property.
const (
	ListImagesOptionsStatusAvailableConst  = "available"
	ListImagesOptionsStatusDeletingConst   = "deleting"
	ListImagesOptionsStatusDeprecatedConst = "deprecated"
	ListImagesOptionsStatusFailedConst     = "failed"
	ListImagesOptionsStatusObsoleteConst   = "obsolete"
	ListImagesOptionsStatusPendingConst    = "pending"
	ListImagesOptionsStatusUnusableConst   = "unusable"
)

// Constants associated with the ListImagesOptions.Visibility property.
// Filters the collection to images with a `visibility` property matching the specified value.
const (
	ListImagesOptionsVisibilityPrivateConst = "private"
	ListImagesOptionsVisibilityPublicConst  = "public"
)

// Constants associated with the ListImagesOptions.UserDataFormat property.
const (
	ListImagesOptionsUserDataFormatCloudInitConst     = "cloud_init"
	ListImagesOptionsUserDataFormatEsxiKickstartConst = "esxi_kickstart"
	ListImagesOptionsUserDataFormatIpxeConst          = "ipxe"
)

// NewListImagesOptions : Instantiate ListImagesOptions
func (*VpcV1) NewListImagesOptions() *ListImagesOptions {
	return &ListImagesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListImagesOptions) SetStart(start string) *ListImagesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListImagesOptions) SetLimit(limit int64) *ListImagesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListImagesOptions) SetResourceGroupID(resourceGroupID string) *ListImagesOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListImagesOptions) SetName(name string) *ListImagesOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetStatus : Allow user to set Status
func (_options *ListImagesOptions) SetStatus(status []string) *ListImagesOptions {
	_options.Status = status
	return _options
}

// SetVisibility : Allow user to set Visibility
func (_options *ListImagesOptions) SetVisibility(visibility string) *ListImagesOptions {
	_options.Visibility = core.StringPtr(visibility)
	return _options
}

// SetUserDataFormat : Allow user to set UserDataFormat
func (_options *ListImagesOptions) SetUserDataFormat(userDataFormat []string) *ListImagesOptions {
	_options.UserDataFormat = userDataFormat
	return _options
}

// SetRemoteAccountID : Allow user to set RemoteAccountID
func (_options *ListImagesOptions) SetRemoteAccountID(remoteAccountID string) *ListImagesOptions {
	_options.RemoteAccountID = core.StringPtr(remoteAccountID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListImagesOptions) SetHeaders(param map[string]string) *ListImagesOptions {
	options.Headers = param
	return options
}

// ListInstanceClusterNetworkAttachmentsOptions : The ListInstanceClusterNetworkAttachments options.
type ListInstanceClusterNetworkAttachmentsOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceClusterNetworkAttachmentsOptions : Instantiate ListInstanceClusterNetworkAttachmentsOptions
func (*VpcV1) NewListInstanceClusterNetworkAttachmentsOptions(instanceID string) *ListInstanceClusterNetworkAttachmentsOptions {
	return &ListInstanceClusterNetworkAttachmentsOptions{
		InstanceID: core.StringPtr(instanceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceClusterNetworkAttachmentsOptions) SetInstanceID(instanceID string) *ListInstanceClusterNetworkAttachmentsOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListInstanceClusterNetworkAttachmentsOptions) SetStart(start string) *ListInstanceClusterNetworkAttachmentsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceClusterNetworkAttachmentsOptions) SetLimit(limit int64) *ListInstanceClusterNetworkAttachmentsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceClusterNetworkAttachmentsOptions) SetHeaders(param map[string]string) *ListInstanceClusterNetworkAttachmentsOptions {
	options.Headers = param
	return options
}

// ListInstanceDisksOptions : The ListInstanceDisks options.
type ListInstanceDisksOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceDisksOptions : Instantiate ListInstanceDisksOptions
func (*VpcV1) NewListInstanceDisksOptions(instanceID string) *ListInstanceDisksOptions {
	return &ListInstanceDisksOptions{
		InstanceID: core.StringPtr(instanceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceDisksOptions) SetInstanceID(instanceID string) *ListInstanceDisksOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceDisksOptions) SetHeaders(param map[string]string) *ListInstanceDisksOptions {
	options.Headers = param
	return options
}

// ListInstanceGroupManagerActionsOptions : The ListInstanceGroupManagerActions options.
type ListInstanceGroupManagerActionsOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceGroupManagerActionsOptions : Instantiate ListInstanceGroupManagerActionsOptions
func (*VpcV1) NewListInstanceGroupManagerActionsOptions(instanceGroupID string, instanceGroupManagerID string) *ListInstanceGroupManagerActionsOptions {
	return &ListInstanceGroupManagerActionsOptions{
		InstanceGroupID:        core.StringPtr(instanceGroupID),
		InstanceGroupManagerID: core.StringPtr(instanceGroupManagerID),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *ListInstanceGroupManagerActionsOptions) SetInstanceGroupID(instanceGroupID string) *ListInstanceGroupManagerActionsOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *ListInstanceGroupManagerActionsOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *ListInstanceGroupManagerActionsOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListInstanceGroupManagerActionsOptions) SetStart(start string) *ListInstanceGroupManagerActionsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceGroupManagerActionsOptions) SetLimit(limit int64) *ListInstanceGroupManagerActionsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceGroupManagerActionsOptions) SetHeaders(param map[string]string) *ListInstanceGroupManagerActionsOptions {
	options.Headers = param
	return options
}

// ListInstanceGroupManagerPoliciesOptions : The ListInstanceGroupManagerPolicies options.
type ListInstanceGroupManagerPoliciesOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceGroupManagerPoliciesOptions : Instantiate ListInstanceGroupManagerPoliciesOptions
func (*VpcV1) NewListInstanceGroupManagerPoliciesOptions(instanceGroupID string, instanceGroupManagerID string) *ListInstanceGroupManagerPoliciesOptions {
	return &ListInstanceGroupManagerPoliciesOptions{
		InstanceGroupID:        core.StringPtr(instanceGroupID),
		InstanceGroupManagerID: core.StringPtr(instanceGroupManagerID),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *ListInstanceGroupManagerPoliciesOptions) SetInstanceGroupID(instanceGroupID string) *ListInstanceGroupManagerPoliciesOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *ListInstanceGroupManagerPoliciesOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *ListInstanceGroupManagerPoliciesOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListInstanceGroupManagerPoliciesOptions) SetStart(start string) *ListInstanceGroupManagerPoliciesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceGroupManagerPoliciesOptions) SetLimit(limit int64) *ListInstanceGroupManagerPoliciesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceGroupManagerPoliciesOptions) SetHeaders(param map[string]string) *ListInstanceGroupManagerPoliciesOptions {
	options.Headers = param
	return options
}

// ListInstanceGroupManagersOptions : The ListInstanceGroupManagers options.
type ListInstanceGroupManagersOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceGroupManagersOptions : Instantiate ListInstanceGroupManagersOptions
func (*VpcV1) NewListInstanceGroupManagersOptions(instanceGroupID string) *ListInstanceGroupManagersOptions {
	return &ListInstanceGroupManagersOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *ListInstanceGroupManagersOptions) SetInstanceGroupID(instanceGroupID string) *ListInstanceGroupManagersOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListInstanceGroupManagersOptions) SetStart(start string) *ListInstanceGroupManagersOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceGroupManagersOptions) SetLimit(limit int64) *ListInstanceGroupManagersOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceGroupManagersOptions) SetHeaders(param map[string]string) *ListInstanceGroupManagersOptions {
	options.Headers = param
	return options
}

// ListInstanceGroupMembershipsOptions : The ListInstanceGroupMemberships options.
type ListInstanceGroupMembershipsOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceGroupMembershipsOptions : Instantiate ListInstanceGroupMembershipsOptions
func (*VpcV1) NewListInstanceGroupMembershipsOptions(instanceGroupID string) *ListInstanceGroupMembershipsOptions {
	return &ListInstanceGroupMembershipsOptions{
		InstanceGroupID: core.StringPtr(instanceGroupID),
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *ListInstanceGroupMembershipsOptions) SetInstanceGroupID(instanceGroupID string) *ListInstanceGroupMembershipsOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListInstanceGroupMembershipsOptions) SetStart(start string) *ListInstanceGroupMembershipsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceGroupMembershipsOptions) SetLimit(limit int64) *ListInstanceGroupMembershipsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceGroupMembershipsOptions) SetHeaders(param map[string]string) *ListInstanceGroupMembershipsOptions {
	options.Headers = param
	return options
}

// ListInstanceGroupsOptions : The ListInstanceGroups options.
type ListInstanceGroupsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceGroupsOptions : Instantiate ListInstanceGroupsOptions
func (*VpcV1) NewListInstanceGroupsOptions() *ListInstanceGroupsOptions {
	return &ListInstanceGroupsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListInstanceGroupsOptions) SetStart(start string) *ListInstanceGroupsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceGroupsOptions) SetLimit(limit int64) *ListInstanceGroupsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceGroupsOptions) SetHeaders(param map[string]string) *ListInstanceGroupsOptions {
	options.Headers = param
	return options
}

// ListInstanceNetworkAttachmentsOptions : The ListInstanceNetworkAttachments options.
type ListInstanceNetworkAttachmentsOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceNetworkAttachmentsOptions : Instantiate ListInstanceNetworkAttachmentsOptions
func (*VpcV1) NewListInstanceNetworkAttachmentsOptions(instanceID string) *ListInstanceNetworkAttachmentsOptions {
	return &ListInstanceNetworkAttachmentsOptions{
		InstanceID: core.StringPtr(instanceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceNetworkAttachmentsOptions) SetInstanceID(instanceID string) *ListInstanceNetworkAttachmentsOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceNetworkAttachmentsOptions) SetHeaders(param map[string]string) *ListInstanceNetworkAttachmentsOptions {
	options.Headers = param
	return options
}

// ListInstanceNetworkInterfaceFloatingIpsOptions : The ListInstanceNetworkInterfaceFloatingIps options.
type ListInstanceNetworkInterfaceFloatingIpsOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceNetworkInterfaceFloatingIpsOptions : Instantiate ListInstanceNetworkInterfaceFloatingIpsOptions
func (*VpcV1) NewListInstanceNetworkInterfaceFloatingIpsOptions(instanceID string, networkInterfaceID string) *ListInstanceNetworkInterfaceFloatingIpsOptions {
	return &ListInstanceNetworkInterfaceFloatingIpsOptions{
		InstanceID:         core.StringPtr(instanceID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceNetworkInterfaceFloatingIpsOptions) SetInstanceID(instanceID string) *ListInstanceNetworkInterfaceFloatingIpsOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *ListInstanceNetworkInterfaceFloatingIpsOptions) SetNetworkInterfaceID(networkInterfaceID string) *ListInstanceNetworkInterfaceFloatingIpsOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceNetworkInterfaceFloatingIpsOptions) SetHeaders(param map[string]string) *ListInstanceNetworkInterfaceFloatingIpsOptions {
	options.Headers = param
	return options
}

// ListInstanceNetworkInterfaceIpsOptions : The ListInstanceNetworkInterfaceIps options.
type ListInstanceNetworkInterfaceIpsOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceNetworkInterfaceIpsOptions : Instantiate ListInstanceNetworkInterfaceIpsOptions
func (*VpcV1) NewListInstanceNetworkInterfaceIpsOptions(instanceID string, networkInterfaceID string) *ListInstanceNetworkInterfaceIpsOptions {
	return &ListInstanceNetworkInterfaceIpsOptions{
		InstanceID:         core.StringPtr(instanceID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceNetworkInterfaceIpsOptions) SetInstanceID(instanceID string) *ListInstanceNetworkInterfaceIpsOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *ListInstanceNetworkInterfaceIpsOptions) SetNetworkInterfaceID(networkInterfaceID string) *ListInstanceNetworkInterfaceIpsOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListInstanceNetworkInterfaceIpsOptions) SetStart(start string) *ListInstanceNetworkInterfaceIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstanceNetworkInterfaceIpsOptions) SetLimit(limit int64) *ListInstanceNetworkInterfaceIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceNetworkInterfaceIpsOptions) SetHeaders(param map[string]string) *ListInstanceNetworkInterfaceIpsOptions {
	options.Headers = param
	return options
}

// ListInstanceNetworkInterfacesOptions : The ListInstanceNetworkInterfaces options.
type ListInstanceNetworkInterfacesOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceNetworkInterfacesOptions : Instantiate ListInstanceNetworkInterfacesOptions
func (*VpcV1) NewListInstanceNetworkInterfacesOptions(instanceID string) *ListInstanceNetworkInterfacesOptions {
	return &ListInstanceNetworkInterfacesOptions{
		InstanceID: core.StringPtr(instanceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceNetworkInterfacesOptions) SetInstanceID(instanceID string) *ListInstanceNetworkInterfacesOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceNetworkInterfacesOptions) SetHeaders(param map[string]string) *ListInstanceNetworkInterfacesOptions {
	options.Headers = param
	return options
}

// ListInstanceProfilesOptions : The ListInstanceProfiles options.
type ListInstanceProfilesOptions struct {

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceProfilesOptions : Instantiate ListInstanceProfilesOptions
func (*VpcV1) NewListInstanceProfilesOptions() *ListInstanceProfilesOptions {
	return &ListInstanceProfilesOptions{}
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceProfilesOptions) SetHeaders(param map[string]string) *ListInstanceProfilesOptions {
	options.Headers = param
	return options
}

// ListInstanceTemplatesOptions : The ListInstanceTemplates options.
type ListInstanceTemplatesOptions struct {

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceTemplatesOptions : Instantiate ListInstanceTemplatesOptions
func (*VpcV1) NewListInstanceTemplatesOptions() *ListInstanceTemplatesOptions {
	return &ListInstanceTemplatesOptions{}
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceTemplatesOptions) SetHeaders(param map[string]string) *ListInstanceTemplatesOptions {
	options.Headers = param
	return options
}

// ListInstanceVolumeAttachmentsOptions : The ListInstanceVolumeAttachments options.
type ListInstanceVolumeAttachmentsOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListInstanceVolumeAttachmentsOptions : Instantiate ListInstanceVolumeAttachmentsOptions
func (*VpcV1) NewListInstanceVolumeAttachmentsOptions(instanceID string) *ListInstanceVolumeAttachmentsOptions {
	return &ListInstanceVolumeAttachmentsOptions{
		InstanceID: core.StringPtr(instanceID),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *ListInstanceVolumeAttachmentsOptions) SetInstanceID(instanceID string) *ListInstanceVolumeAttachmentsOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstanceVolumeAttachmentsOptions) SetHeaders(param map[string]string) *ListInstanceVolumeAttachmentsOptions {
	options.Headers = param
	return options
}

// ListInstancesOptions : The ListInstances options.
type ListInstancesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to instances with a `cluster_network.id` property matching the specified identifier.
	ClusterNetworkID *string `json:"cluster_network.id,omitempty"`

	// Filters the collection to instances with a `cluster_network.crn` property matching the specified CRN.
	ClusterNetworkCRN *string `json:"cluster_network.crn,omitempty"`

	// Filters the collection to resources with a `cluster_network.name` property matching the exact specified name.
	ClusterNetworkName *string `json:"cluster_network.name,omitempty"`

	// Filters the collection to resources with a `dedicated_host.id` property matching the specified identifier.
	DedicatedHostID *string `json:"dedicated_host.id,omitempty"`

	// Filters the collection to resources with a `dedicated_host.crn` property matching the specified CRN.
	DedicatedHostCRN *string `json:"dedicated_host.crn,omitempty"`

	// Filters the collection to resources with a `dedicated_host.name` property matching the exact specified name.
	DedicatedHostName *string `json:"dedicated_host.name,omitempty"`

	// Filters the collection to resources with a `placement_target.id` property matching the specified placement group
	// identifier.
	PlacementGroupID *string `json:"placement_group.id,omitempty"`

	// Filters the collection to resources with a `placement_target.crn` property matching the specified placement group
	// CRN.
	PlacementGroupCRN *string `json:"placement_group.crn,omitempty"`

	// Filters the collection to resources with a `placement_target.name` property matching the exact specified placement
	// group name.
	PlacementGroupName *string `json:"placement_group.name,omitempty"`

	// Filters the collection to instances with a `reservation_affinity.policy` property matching the specified value.
	ReservationAffinityPolicy *string `json:"reservation_affinity.policy,omitempty"`

	// Filters the collection to resources with a `reservation.id` property matching the specified identifier.
	ReservationID *string `json:"reservation.id,omitempty"`

	// Filters the collection to resources with a `reservation.crn` property matching the specified identifier.
	ReservationCRN *string `json:"reservation.crn,omitempty"`

	// Filters the collection to resources with a `reservation.name` property matching the specified identifier.
	ReservationName *string `json:"reservation.name,omitempty"`

	// Filters the collection to resources with a `vpc.id` property matching the specified identifier.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListInstancesOptions.ReservationAffinityPolicy property.
// Filters the collection to instances with a `reservation_affinity.policy` property matching the specified value.
const (
	ListInstancesOptionsReservationAffinityPolicyAutomaticConst = "automatic"
	ListInstancesOptionsReservationAffinityPolicyDisabledConst  = "disabled"
	ListInstancesOptionsReservationAffinityPolicyManualConst    = "manual"
)

// NewListInstancesOptions : Instantiate ListInstancesOptions
func (*VpcV1) NewListInstancesOptions() *ListInstancesOptions {
	return &ListInstancesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListInstancesOptions) SetStart(start string) *ListInstancesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListInstancesOptions) SetLimit(limit int64) *ListInstancesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListInstancesOptions) SetResourceGroupID(resourceGroupID string) *ListInstancesOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListInstancesOptions) SetName(name string) *ListInstancesOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *ListInstancesOptions) SetClusterNetworkID(clusterNetworkID string) *ListInstancesOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkCRN : Allow user to set ClusterNetworkCRN
func (_options *ListInstancesOptions) SetClusterNetworkCRN(clusterNetworkCRN string) *ListInstancesOptions {
	_options.ClusterNetworkCRN = core.StringPtr(clusterNetworkCRN)
	return _options
}

// SetClusterNetworkName : Allow user to set ClusterNetworkName
func (_options *ListInstancesOptions) SetClusterNetworkName(clusterNetworkName string) *ListInstancesOptions {
	_options.ClusterNetworkName = core.StringPtr(clusterNetworkName)
	return _options
}

// SetDedicatedHostID : Allow user to set DedicatedHostID
func (_options *ListInstancesOptions) SetDedicatedHostID(dedicatedHostID string) *ListInstancesOptions {
	_options.DedicatedHostID = core.StringPtr(dedicatedHostID)
	return _options
}

// SetDedicatedHostCRN : Allow user to set DedicatedHostCRN
func (_options *ListInstancesOptions) SetDedicatedHostCRN(dedicatedHostCRN string) *ListInstancesOptions {
	_options.DedicatedHostCRN = core.StringPtr(dedicatedHostCRN)
	return _options
}

// SetDedicatedHostName : Allow user to set DedicatedHostName
func (_options *ListInstancesOptions) SetDedicatedHostName(dedicatedHostName string) *ListInstancesOptions {
	_options.DedicatedHostName = core.StringPtr(dedicatedHostName)
	return _options
}

// SetPlacementGroupID : Allow user to set PlacementGroupID
func (_options *ListInstancesOptions) SetPlacementGroupID(placementGroupID string) *ListInstancesOptions {
	_options.PlacementGroupID = core.StringPtr(placementGroupID)
	return _options
}

// SetPlacementGroupCRN : Allow user to set PlacementGroupCRN
func (_options *ListInstancesOptions) SetPlacementGroupCRN(placementGroupCRN string) *ListInstancesOptions {
	_options.PlacementGroupCRN = core.StringPtr(placementGroupCRN)
	return _options
}

// SetPlacementGroupName : Allow user to set PlacementGroupName
func (_options *ListInstancesOptions) SetPlacementGroupName(placementGroupName string) *ListInstancesOptions {
	_options.PlacementGroupName = core.StringPtr(placementGroupName)
	return _options
}

// SetReservationAffinityPolicy : Allow user to set ReservationAffinityPolicy
func (_options *ListInstancesOptions) SetReservationAffinityPolicy(reservationAffinityPolicy string) *ListInstancesOptions {
	_options.ReservationAffinityPolicy = core.StringPtr(reservationAffinityPolicy)
	return _options
}

// SetReservationID : Allow user to set ReservationID
func (_options *ListInstancesOptions) SetReservationID(reservationID string) *ListInstancesOptions {
	_options.ReservationID = core.StringPtr(reservationID)
	return _options
}

// SetReservationCRN : Allow user to set ReservationCRN
func (_options *ListInstancesOptions) SetReservationCRN(reservationCRN string) *ListInstancesOptions {
	_options.ReservationCRN = core.StringPtr(reservationCRN)
	return _options
}

// SetReservationName : Allow user to set ReservationName
func (_options *ListInstancesOptions) SetReservationName(reservationName string) *ListInstancesOptions {
	_options.ReservationName = core.StringPtr(reservationName)
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListInstancesOptions) SetVPCID(vpcID string) *ListInstancesOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListInstancesOptions) SetVPCCRN(vpcCRN string) *ListInstancesOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListInstancesOptions) SetVPCName(vpcName string) *ListInstancesOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListInstancesOptions) SetHeaders(param map[string]string) *ListInstancesOptions {
	options.Headers = param
	return options
}

// ListIpsecPoliciesOptions : The ListIpsecPolicies options.
type ListIpsecPoliciesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListIpsecPoliciesOptions : Instantiate ListIpsecPoliciesOptions
func (*VpcV1) NewListIpsecPoliciesOptions() *ListIpsecPoliciesOptions {
	return &ListIpsecPoliciesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListIpsecPoliciesOptions) SetStart(start string) *ListIpsecPoliciesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListIpsecPoliciesOptions) SetLimit(limit int64) *ListIpsecPoliciesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListIpsecPoliciesOptions) SetHeaders(param map[string]string) *ListIpsecPoliciesOptions {
	options.Headers = param
	return options
}

// ListIpsecPolicyConnectionsOptions : The ListIpsecPolicyConnections options.
type ListIpsecPolicyConnectionsOptions struct {
	// The IPsec policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListIpsecPolicyConnectionsOptions : Instantiate ListIpsecPolicyConnectionsOptions
func (*VpcV1) NewListIpsecPolicyConnectionsOptions(id string) *ListIpsecPolicyConnectionsOptions {
	return &ListIpsecPolicyConnectionsOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListIpsecPolicyConnectionsOptions) SetID(id string) *ListIpsecPolicyConnectionsOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListIpsecPolicyConnectionsOptions) SetStart(start string) *ListIpsecPolicyConnectionsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListIpsecPolicyConnectionsOptions) SetLimit(limit int64) *ListIpsecPolicyConnectionsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListIpsecPolicyConnectionsOptions) SetHeaders(param map[string]string) *ListIpsecPolicyConnectionsOptions {
	options.Headers = param
	return options
}

// ListKeysOptions : The ListKeys options.
type ListKeysOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListKeysOptions : Instantiate ListKeysOptions
func (*VpcV1) NewListKeysOptions() *ListKeysOptions {
	return &ListKeysOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListKeysOptions) SetStart(start string) *ListKeysOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListKeysOptions) SetLimit(limit int64) *ListKeysOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListKeysOptions) SetResourceGroupID(resourceGroupID string) *ListKeysOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListKeysOptions) SetHeaders(param map[string]string) *ListKeysOptions {
	options.Headers = param
	return options
}

// ListLoadBalancerListenerPoliciesOptions : The ListLoadBalancerListenerPolicies options.
type ListLoadBalancerListenerPoliciesOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancerListenerPoliciesOptions : Instantiate ListLoadBalancerListenerPoliciesOptions
func (*VpcV1) NewListLoadBalancerListenerPoliciesOptions(loadBalancerID string, listenerID string) *ListLoadBalancerListenerPoliciesOptions {
	return &ListLoadBalancerListenerPoliciesOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *ListLoadBalancerListenerPoliciesOptions) SetLoadBalancerID(loadBalancerID string) *ListLoadBalancerListenerPoliciesOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *ListLoadBalancerListenerPoliciesOptions) SetListenerID(listenerID string) *ListLoadBalancerListenerPoliciesOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancerListenerPoliciesOptions) SetHeaders(param map[string]string) *ListLoadBalancerListenerPoliciesOptions {
	options.Headers = param
	return options
}

// ListLoadBalancerListenerPolicyRulesOptions : The ListLoadBalancerListenerPolicyRules options.
type ListLoadBalancerListenerPolicyRulesOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	PolicyID *string `json:"policy_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancerListenerPolicyRulesOptions : Instantiate ListLoadBalancerListenerPolicyRulesOptions
func (*VpcV1) NewListLoadBalancerListenerPolicyRulesOptions(loadBalancerID string, listenerID string, policyID string) *ListLoadBalancerListenerPolicyRulesOptions {
	return &ListLoadBalancerListenerPolicyRulesOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		ListenerID:     core.StringPtr(listenerID),
		PolicyID:       core.StringPtr(policyID),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *ListLoadBalancerListenerPolicyRulesOptions) SetLoadBalancerID(loadBalancerID string) *ListLoadBalancerListenerPolicyRulesOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *ListLoadBalancerListenerPolicyRulesOptions) SetListenerID(listenerID string) *ListLoadBalancerListenerPolicyRulesOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetPolicyID : Allow user to set PolicyID
func (_options *ListLoadBalancerListenerPolicyRulesOptions) SetPolicyID(policyID string) *ListLoadBalancerListenerPolicyRulesOptions {
	_options.PolicyID = core.StringPtr(policyID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancerListenerPolicyRulesOptions) SetHeaders(param map[string]string) *ListLoadBalancerListenerPolicyRulesOptions {
	options.Headers = param
	return options
}

// ListLoadBalancerListenersOptions : The ListLoadBalancerListeners options.
type ListLoadBalancerListenersOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancerListenersOptions : Instantiate ListLoadBalancerListenersOptions
func (*VpcV1) NewListLoadBalancerListenersOptions(loadBalancerID string) *ListLoadBalancerListenersOptions {
	return &ListLoadBalancerListenersOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *ListLoadBalancerListenersOptions) SetLoadBalancerID(loadBalancerID string) *ListLoadBalancerListenersOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancerListenersOptions) SetHeaders(param map[string]string) *ListLoadBalancerListenersOptions {
	options.Headers = param
	return options
}

// ListLoadBalancerPoolMembersOptions : The ListLoadBalancerPoolMembers options.
type ListLoadBalancerPoolMembersOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	PoolID *string `json:"pool_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancerPoolMembersOptions : Instantiate ListLoadBalancerPoolMembersOptions
func (*VpcV1) NewListLoadBalancerPoolMembersOptions(loadBalancerID string, poolID string) *ListLoadBalancerPoolMembersOptions {
	return &ListLoadBalancerPoolMembersOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		PoolID:         core.StringPtr(poolID),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *ListLoadBalancerPoolMembersOptions) SetLoadBalancerID(loadBalancerID string) *ListLoadBalancerPoolMembersOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetPoolID : Allow user to set PoolID
func (_options *ListLoadBalancerPoolMembersOptions) SetPoolID(poolID string) *ListLoadBalancerPoolMembersOptions {
	_options.PoolID = core.StringPtr(poolID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancerPoolMembersOptions) SetHeaders(param map[string]string) *ListLoadBalancerPoolMembersOptions {
	options.Headers = param
	return options
}

// ListLoadBalancerPoolsOptions : The ListLoadBalancerPools options.
type ListLoadBalancerPoolsOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancerPoolsOptions : Instantiate ListLoadBalancerPoolsOptions
func (*VpcV1) NewListLoadBalancerPoolsOptions(loadBalancerID string) *ListLoadBalancerPoolsOptions {
	return &ListLoadBalancerPoolsOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *ListLoadBalancerPoolsOptions) SetLoadBalancerID(loadBalancerID string) *ListLoadBalancerPoolsOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancerPoolsOptions) SetHeaders(param map[string]string) *ListLoadBalancerPoolsOptions {
	options.Headers = param
	return options
}

// ListLoadBalancerProfilesOptions : The ListLoadBalancerProfiles options.
type ListLoadBalancerProfilesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancerProfilesOptions : Instantiate ListLoadBalancerProfilesOptions
func (*VpcV1) NewListLoadBalancerProfilesOptions() *ListLoadBalancerProfilesOptions {
	return &ListLoadBalancerProfilesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListLoadBalancerProfilesOptions) SetStart(start string) *ListLoadBalancerProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListLoadBalancerProfilesOptions) SetLimit(limit int64) *ListLoadBalancerProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancerProfilesOptions) SetHeaders(param map[string]string) *ListLoadBalancerProfilesOptions {
	options.Headers = param
	return options
}

// ListLoadBalancersOptions : The ListLoadBalancers options.
type ListLoadBalancersOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListLoadBalancersOptions : Instantiate ListLoadBalancersOptions
func (*VpcV1) NewListLoadBalancersOptions() *ListLoadBalancersOptions {
	return &ListLoadBalancersOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListLoadBalancersOptions) SetStart(start string) *ListLoadBalancersOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListLoadBalancersOptions) SetLimit(limit int64) *ListLoadBalancersOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListLoadBalancersOptions) SetHeaders(param map[string]string) *ListLoadBalancersOptions {
	options.Headers = param
	return options
}

// ListNetworkACLRulesOptions : The ListNetworkACLRules options.
type ListNetworkACLRulesOptions struct {
	// The network ACL identifier.
	NetworkACLID *string `json:"network_acl_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to rules with a `direction` property matching the specified value.
	Direction *string `json:"direction,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListNetworkACLRulesOptions.Direction property.
// Filters the collection to rules with a `direction` property matching the specified value.
const (
	ListNetworkACLRulesOptionsDirectionInboundConst  = "inbound"
	ListNetworkACLRulesOptionsDirectionOutboundConst = "outbound"
)

// NewListNetworkACLRulesOptions : Instantiate ListNetworkACLRulesOptions
func (*VpcV1) NewListNetworkACLRulesOptions(networkACLID string) *ListNetworkACLRulesOptions {
	return &ListNetworkACLRulesOptions{
		NetworkACLID: core.StringPtr(networkACLID),
	}
}

// SetNetworkACLID : Allow user to set NetworkACLID
func (_options *ListNetworkACLRulesOptions) SetNetworkACLID(networkACLID string) *ListNetworkACLRulesOptions {
	_options.NetworkACLID = core.StringPtr(networkACLID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListNetworkACLRulesOptions) SetStart(start string) *ListNetworkACLRulesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListNetworkACLRulesOptions) SetLimit(limit int64) *ListNetworkACLRulesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetDirection : Allow user to set Direction
func (_options *ListNetworkACLRulesOptions) SetDirection(direction string) *ListNetworkACLRulesOptions {
	_options.Direction = core.StringPtr(direction)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListNetworkACLRulesOptions) SetHeaders(param map[string]string) *ListNetworkACLRulesOptions {
	options.Headers = param
	return options
}

// ListNetworkAclsOptions : The ListNetworkAcls options.
type ListNetworkAclsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListNetworkAclsOptions : Instantiate ListNetworkAclsOptions
func (*VpcV1) NewListNetworkAclsOptions() *ListNetworkAclsOptions {
	return &ListNetworkAclsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListNetworkAclsOptions) SetStart(start string) *ListNetworkAclsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListNetworkAclsOptions) SetLimit(limit int64) *ListNetworkAclsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListNetworkAclsOptions) SetResourceGroupID(resourceGroupID string) *ListNetworkAclsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListNetworkAclsOptions) SetHeaders(param map[string]string) *ListNetworkAclsOptions {
	options.Headers = param
	return options
}

// ListNetworkInterfaceFloatingIpsOptions : The ListNetworkInterfaceFloatingIps options.
type ListNetworkInterfaceFloatingIpsOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value
	// `-name` sorts the collection by the `name` property in descending order, and the value `name` sorts it by the `name`
	// property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListNetworkInterfaceFloatingIpsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value
// `-name` sorts the collection by the `name` property in descending order, and the value `name` sorts it by the `name`
// property in ascending order.
const (
	ListNetworkInterfaceFloatingIpsOptionsSortAddressConst = "address"
	ListNetworkInterfaceFloatingIpsOptionsSortNameConst    = "name"
)

// NewListNetworkInterfaceFloatingIpsOptions : Instantiate ListNetworkInterfaceFloatingIpsOptions
func (*VpcV1) NewListNetworkInterfaceFloatingIpsOptions(virtualNetworkInterfaceID string) *ListNetworkInterfaceFloatingIpsOptions {
	return &ListNetworkInterfaceFloatingIpsOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *ListNetworkInterfaceFloatingIpsOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *ListNetworkInterfaceFloatingIpsOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListNetworkInterfaceFloatingIpsOptions) SetStart(start string) *ListNetworkInterfaceFloatingIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListNetworkInterfaceFloatingIpsOptions) SetLimit(limit int64) *ListNetworkInterfaceFloatingIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListNetworkInterfaceFloatingIpsOptions) SetSort(sort string) *ListNetworkInterfaceFloatingIpsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListNetworkInterfaceFloatingIpsOptions) SetHeaders(param map[string]string) *ListNetworkInterfaceFloatingIpsOptions {
	options.Headers = param
	return options
}

// ListOperatingSystemsOptions : The ListOperatingSystems options.
type ListOperatingSystemsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListOperatingSystemsOptions : Instantiate ListOperatingSystemsOptions
func (*VpcV1) NewListOperatingSystemsOptions() *ListOperatingSystemsOptions {
	return &ListOperatingSystemsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListOperatingSystemsOptions) SetStart(start string) *ListOperatingSystemsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListOperatingSystemsOptions) SetLimit(limit int64) *ListOperatingSystemsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListOperatingSystemsOptions) SetHeaders(param map[string]string) *ListOperatingSystemsOptions {
	options.Headers = param
	return options
}

// ListPlacementGroupsOptions : The ListPlacementGroups options.
type ListPlacementGroupsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListPlacementGroupsOptions : Instantiate ListPlacementGroupsOptions
func (*VpcV1) NewListPlacementGroupsOptions() *ListPlacementGroupsOptions {
	return &ListPlacementGroupsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListPlacementGroupsOptions) SetStart(start string) *ListPlacementGroupsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListPlacementGroupsOptions) SetLimit(limit int64) *ListPlacementGroupsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListPlacementGroupsOptions) SetHeaders(param map[string]string) *ListPlacementGroupsOptions {
	options.Headers = param
	return options
}

// ListPrivatePathServiceGatewayAccountPoliciesOptions : The ListPrivatePathServiceGatewayAccountPolicies options.
type ListPrivatePathServiceGatewayAccountPoliciesOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with an `account.id` property matching the specified identifier.
	AccountID *string `json:"account.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListPrivatePathServiceGatewayAccountPoliciesOptions : Instantiate ListPrivatePathServiceGatewayAccountPoliciesOptions
func (*VpcV1) NewListPrivatePathServiceGatewayAccountPoliciesOptions(privatePathServiceGatewayID string) *ListPrivatePathServiceGatewayAccountPoliciesOptions {
	return &ListPrivatePathServiceGatewayAccountPoliciesOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *ListPrivatePathServiceGatewayAccountPoliciesOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *ListPrivatePathServiceGatewayAccountPoliciesOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListPrivatePathServiceGatewayAccountPoliciesOptions) SetStart(start string) *ListPrivatePathServiceGatewayAccountPoliciesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListPrivatePathServiceGatewayAccountPoliciesOptions) SetLimit(limit int64) *ListPrivatePathServiceGatewayAccountPoliciesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetAccountID : Allow user to set AccountID
func (_options *ListPrivatePathServiceGatewayAccountPoliciesOptions) SetAccountID(accountID string) *ListPrivatePathServiceGatewayAccountPoliciesOptions {
	_options.AccountID = core.StringPtr(accountID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListPrivatePathServiceGatewayAccountPoliciesOptions) SetHeaders(param map[string]string) *ListPrivatePathServiceGatewayAccountPoliciesOptions {
	options.Headers = param
	return options
}

// ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions : The ListPrivatePathServiceGatewayEndpointGatewayBindings options.
type ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to endpoint gateway bindings with a `status` property matching the specified value.
	Status *string `json:"status,omitempty"`

	// Filters the collection to resources with an `account.id` property matching the specified identifier.
	AccountID *string `json:"account.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions.Status property.
// Filters the collection to endpoint gateway bindings with a `status` property matching the specified value.
const (
	ListPrivatePathServiceGatewayEndpointGatewayBindingsOptionsStatusAbandonedConst = "abandoned"
	ListPrivatePathServiceGatewayEndpointGatewayBindingsOptionsStatusDeniedConst    = "denied"
	ListPrivatePathServiceGatewayEndpointGatewayBindingsOptionsStatusExpiredConst   = "expired"
	ListPrivatePathServiceGatewayEndpointGatewayBindingsOptionsStatusPendingConst   = "pending"
	ListPrivatePathServiceGatewayEndpointGatewayBindingsOptionsStatusPermittedConst = "permitted"
)

// NewListPrivatePathServiceGatewayEndpointGatewayBindingsOptions : Instantiate ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions
func (*VpcV1) NewListPrivatePathServiceGatewayEndpointGatewayBindingsOptions(privatePathServiceGatewayID string) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	return &ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) SetStart(start string) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) SetLimit(limit int64) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetStatus : Allow user to set Status
func (_options *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) SetStatus(status string) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	_options.Status = core.StringPtr(status)
	return _options
}

// SetAccountID : Allow user to set AccountID
func (_options *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) SetAccountID(accountID string) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	_options.AccountID = core.StringPtr(accountID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions) SetHeaders(param map[string]string) *ListPrivatePathServiceGatewayEndpointGatewayBindingsOptions {
	options.Headers = param
	return options
}

// ListPrivatePathServiceGatewaysOptions : The ListPrivatePathServiceGateways options.
type ListPrivatePathServiceGatewaysOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListPrivatePathServiceGatewaysOptions : Instantiate ListPrivatePathServiceGatewaysOptions
func (*VpcV1) NewListPrivatePathServiceGatewaysOptions() *ListPrivatePathServiceGatewaysOptions {
	return &ListPrivatePathServiceGatewaysOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListPrivatePathServiceGatewaysOptions) SetStart(start string) *ListPrivatePathServiceGatewaysOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListPrivatePathServiceGatewaysOptions) SetLimit(limit int64) *ListPrivatePathServiceGatewaysOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListPrivatePathServiceGatewaysOptions) SetResourceGroupID(resourceGroupID string) *ListPrivatePathServiceGatewaysOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListPrivatePathServiceGatewaysOptions) SetHeaders(param map[string]string) *ListPrivatePathServiceGatewaysOptions {
	options.Headers = param
	return options
}

// ListPublicAddressRangesOptions : The ListPublicAddressRanges options.
type ListPublicAddressRangesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListPublicAddressRangesOptions : Instantiate ListPublicAddressRangesOptions
func (*VpcV1) NewListPublicAddressRangesOptions() *ListPublicAddressRangesOptions {
	return &ListPublicAddressRangesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListPublicAddressRangesOptions) SetStart(start string) *ListPublicAddressRangesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListPublicAddressRangesOptions) SetLimit(limit int64) *ListPublicAddressRangesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListPublicAddressRangesOptions) SetResourceGroupID(resourceGroupID string) *ListPublicAddressRangesOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListPublicAddressRangesOptions) SetHeaders(param map[string]string) *ListPublicAddressRangesOptions {
	options.Headers = param
	return options
}

// ListPublicGatewaysOptions : The ListPublicGateways options.
type ListPublicGatewaysOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListPublicGatewaysOptions : Instantiate ListPublicGatewaysOptions
func (*VpcV1) NewListPublicGatewaysOptions() *ListPublicGatewaysOptions {
	return &ListPublicGatewaysOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListPublicGatewaysOptions) SetStart(start string) *ListPublicGatewaysOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListPublicGatewaysOptions) SetLimit(limit int64) *ListPublicGatewaysOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListPublicGatewaysOptions) SetResourceGroupID(resourceGroupID string) *ListPublicGatewaysOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListPublicGatewaysOptions) SetHeaders(param map[string]string) *ListPublicGatewaysOptions {
	options.Headers = param
	return options
}

// ListRegionZonesOptions : The ListRegionZones options.
type ListRegionZonesOptions struct {
	// The region name.
	RegionName *string `json:"region_name" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListRegionZonesOptions : Instantiate ListRegionZonesOptions
func (*VpcV1) NewListRegionZonesOptions(regionName string) *ListRegionZonesOptions {
	return &ListRegionZonesOptions{
		RegionName: core.StringPtr(regionName),
	}
}

// SetRegionName : Allow user to set RegionName
func (_options *ListRegionZonesOptions) SetRegionName(regionName string) *ListRegionZonesOptions {
	_options.RegionName = core.StringPtr(regionName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListRegionZonesOptions) SetHeaders(param map[string]string) *ListRegionZonesOptions {
	options.Headers = param
	return options
}

// ListRegionsOptions : The ListRegions options.
type ListRegionsOptions struct {

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListRegionsOptions : Instantiate ListRegionsOptions
func (*VpcV1) NewListRegionsOptions() *ListRegionsOptions {
	return &ListRegionsOptions{}
}

// SetHeaders : Allow user to set Headers
func (options *ListRegionsOptions) SetHeaders(param map[string]string) *ListRegionsOptions {
	options.Headers = param
	return options
}

// ListReservationsOptions : The ListReservations options.
type ListReservationsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection of resources with a `profile.resource_type` property matching the specified value.
	ProfileResourceType *string `json:"profile.resource_type,omitempty"`

	// Filters the collection to reservations with an `affinity_policy` property matching the specified value.
	AffinityPolicy *string `json:"affinity_policy,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `zone.name` property matching the exact specified name.
	ZoneName *string `json:"zone.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListReservationsOptions.AffinityPolicy property.
// Filters the collection to reservations with an `affinity_policy` property matching the specified value.
const (
	ListReservationsOptionsAffinityPolicyAutomaticConst  = "automatic"
	ListReservationsOptionsAffinityPolicyRestrictedConst = "restricted"
)

// NewListReservationsOptions : Instantiate ListReservationsOptions
func (*VpcV1) NewListReservationsOptions() *ListReservationsOptions {
	return &ListReservationsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListReservationsOptions) SetStart(start string) *ListReservationsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListReservationsOptions) SetLimit(limit int64) *ListReservationsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListReservationsOptions) SetName(name string) *ListReservationsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetProfileResourceType : Allow user to set ProfileResourceType
func (_options *ListReservationsOptions) SetProfileResourceType(profileResourceType string) *ListReservationsOptions {
	_options.ProfileResourceType = core.StringPtr(profileResourceType)
	return _options
}

// SetAffinityPolicy : Allow user to set AffinityPolicy
func (_options *ListReservationsOptions) SetAffinityPolicy(affinityPolicy string) *ListReservationsOptions {
	_options.AffinityPolicy = core.StringPtr(affinityPolicy)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListReservationsOptions) SetResourceGroupID(resourceGroupID string) *ListReservationsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *ListReservationsOptions) SetZoneName(zoneName string) *ListReservationsOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListReservationsOptions) SetHeaders(param map[string]string) *ListReservationsOptions {
	options.Headers = param
	return options
}

// ListSecurityGroupRulesOptions : The ListSecurityGroupRules options.
type ListSecurityGroupRulesOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListSecurityGroupRulesOptions : Instantiate ListSecurityGroupRulesOptions
func (*VpcV1) NewListSecurityGroupRulesOptions(securityGroupID string) *ListSecurityGroupRulesOptions {
	return &ListSecurityGroupRulesOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *ListSecurityGroupRulesOptions) SetSecurityGroupID(securityGroupID string) *ListSecurityGroupRulesOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSecurityGroupRulesOptions) SetHeaders(param map[string]string) *ListSecurityGroupRulesOptions {
	options.Headers = param
	return options
}

// ListSecurityGroupTargetsOptions : The ListSecurityGroupTargets options.
type ListSecurityGroupTargetsOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListSecurityGroupTargetsOptions : Instantiate ListSecurityGroupTargetsOptions
func (*VpcV1) NewListSecurityGroupTargetsOptions(securityGroupID string) *ListSecurityGroupTargetsOptions {
	return &ListSecurityGroupTargetsOptions{
		SecurityGroupID: core.StringPtr(securityGroupID),
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *ListSecurityGroupTargetsOptions) SetSecurityGroupID(securityGroupID string) *ListSecurityGroupTargetsOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListSecurityGroupTargetsOptions) SetStart(start string) *ListSecurityGroupTargetsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSecurityGroupTargetsOptions) SetLimit(limit int64) *ListSecurityGroupTargetsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSecurityGroupTargetsOptions) SetHeaders(param map[string]string) *ListSecurityGroupTargetsOptions {
	options.Headers = param
	return options
}

// ListSecurityGroupsOptions : The ListSecurityGroups options.
type ListSecurityGroupsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `vpc.id` property matching the specified identifier.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListSecurityGroupsOptions : Instantiate ListSecurityGroupsOptions
func (*VpcV1) NewListSecurityGroupsOptions() *ListSecurityGroupsOptions {
	return &ListSecurityGroupsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListSecurityGroupsOptions) SetStart(start string) *ListSecurityGroupsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSecurityGroupsOptions) SetLimit(limit int64) *ListSecurityGroupsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListSecurityGroupsOptions) SetResourceGroupID(resourceGroupID string) *ListSecurityGroupsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListSecurityGroupsOptions) SetVPCID(vpcID string) *ListSecurityGroupsOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListSecurityGroupsOptions) SetVPCCRN(vpcCRN string) *ListSecurityGroupsOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListSecurityGroupsOptions) SetVPCName(vpcName string) *ListSecurityGroupsOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSecurityGroupsOptions) SetHeaders(param map[string]string) *ListSecurityGroupsOptions {
	options.Headers = param
	return options
}

// ListShareAccessorBindingsOptions : The ListShareAccessorBindings options.
type ListShareAccessorBindingsOptions struct {
	// The file share identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListShareAccessorBindingsOptions : Instantiate ListShareAccessorBindingsOptions
func (*VpcV1) NewListShareAccessorBindingsOptions(id string) *ListShareAccessorBindingsOptions {
	return &ListShareAccessorBindingsOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListShareAccessorBindingsOptions) SetID(id string) *ListShareAccessorBindingsOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListShareAccessorBindingsOptions) SetStart(start string) *ListShareAccessorBindingsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListShareAccessorBindingsOptions) SetLimit(limit int64) *ListShareAccessorBindingsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListShareAccessorBindingsOptions) SetHeaders(param map[string]string) *ListShareAccessorBindingsOptions {
	options.Headers = param
	return options
}

// ListShareMountTargetsOptions : The ListShareMountTargets options.
type ListShareMountTargetsOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListShareMountTargetsOptions : Instantiate ListShareMountTargetsOptions
func (*VpcV1) NewListShareMountTargetsOptions(shareID string) *ListShareMountTargetsOptions {
	return &ListShareMountTargetsOptions{
		ShareID: core.StringPtr(shareID),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *ListShareMountTargetsOptions) SetShareID(shareID string) *ListShareMountTargetsOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListShareMountTargetsOptions) SetName(name string) *ListShareMountTargetsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListShareMountTargetsOptions) SetStart(start string) *ListShareMountTargetsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListShareMountTargetsOptions) SetLimit(limit int64) *ListShareMountTargetsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListShareMountTargetsOptions) SetHeaders(param map[string]string) *ListShareMountTargetsOptions {
	options.Headers = param
	return options
}

// ListShareProfilesOptions : The ListShareProfiles options.
type ListShareProfilesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListShareProfilesOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListShareProfilesOptionsSortCreatedAtConst = "created_at"
	ListShareProfilesOptionsSortNameConst      = "name"
)

// NewListShareProfilesOptions : Instantiate ListShareProfilesOptions
func (*VpcV1) NewListShareProfilesOptions() *ListShareProfilesOptions {
	return &ListShareProfilesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListShareProfilesOptions) SetStart(start string) *ListShareProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListShareProfilesOptions) SetLimit(limit int64) *ListShareProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListShareProfilesOptions) SetSort(sort string) *ListShareProfilesOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListShareProfilesOptions) SetHeaders(param map[string]string) *ListShareProfilesOptions {
	options.Headers = param
	return options
}

// ListShareSnapshotsOptions : The ListShareSnapshots options.
type ListShareSnapshotsOptions struct {
	// The file share identifier, or `-` to wildcard all accessible file shares.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// Filters the collection to backup policy jobs with a `backup_policy_plan.id` property matching the specified
	// identifier.
	BackupPolicyPlanID *string `json:"backup_policy_plan.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListShareSnapshotsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListShareSnapshotsOptionsSortCreatedAtConst = "created_at"
	ListShareSnapshotsOptionsSortNameConst      = "name"
)

// NewListShareSnapshotsOptions : Instantiate ListShareSnapshotsOptions
func (*VpcV1) NewListShareSnapshotsOptions(shareID string) *ListShareSnapshotsOptions {
	return &ListShareSnapshotsOptions{
		ShareID: core.StringPtr(shareID),
	}
}

// SetShareID : Allow user to set ShareID
func (_options *ListShareSnapshotsOptions) SetShareID(shareID string) *ListShareSnapshotsOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetBackupPolicyPlanID : Allow user to set BackupPolicyPlanID
func (_options *ListShareSnapshotsOptions) SetBackupPolicyPlanID(backupPolicyPlanID string) *ListShareSnapshotsOptions {
	_options.BackupPolicyPlanID = core.StringPtr(backupPolicyPlanID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListShareSnapshotsOptions) SetName(name string) *ListShareSnapshotsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListShareSnapshotsOptions) SetStart(start string) *ListShareSnapshotsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListShareSnapshotsOptions) SetLimit(limit int64) *ListShareSnapshotsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListShareSnapshotsOptions) SetSort(sort string) *ListShareSnapshotsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListShareSnapshotsOptions) SetHeaders(param map[string]string) *ListShareSnapshotsOptions {
	options.Headers = param
	return options
}

// ListSharesOptions : The ListShares options.
type ListSharesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to file shares with a `replication_role` property matching the specified value.
	ReplicationRole *string `json:"replication_role,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListSharesOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListSharesOptionsSortCreatedAtConst = "created_at"
	ListSharesOptionsSortNameConst      = "name"
)

// Constants associated with the ListSharesOptions.ReplicationRole property.
// Filters the collection to file shares with a `replication_role` property matching the specified value.
const (
	ListSharesOptionsReplicationRoleNoneConst    = "none"
	ListSharesOptionsReplicationRoleReplicaConst = "replica"
	ListSharesOptionsReplicationRoleSourceConst  = "source"
)

// NewListSharesOptions : Instantiate ListSharesOptions
func (*VpcV1) NewListSharesOptions() *ListSharesOptions {
	return &ListSharesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListSharesOptions) SetStart(start string) *ListSharesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSharesOptions) SetLimit(limit int64) *ListSharesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListSharesOptions) SetResourceGroupID(resourceGroupID string) *ListSharesOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListSharesOptions) SetName(name string) *ListSharesOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListSharesOptions) SetSort(sort string) *ListSharesOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetReplicationRole : Allow user to set ReplicationRole
func (_options *ListSharesOptions) SetReplicationRole(replicationRole string) *ListSharesOptions {
	_options.ReplicationRole = core.StringPtr(replicationRole)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSharesOptions) SetHeaders(param map[string]string) *ListSharesOptions {
	options.Headers = param
	return options
}

// ListSnapshotClonesOptions : The ListSnapshotClones options.
type ListSnapshotClonesOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListSnapshotClonesOptions : Instantiate ListSnapshotClonesOptions
func (*VpcV1) NewListSnapshotClonesOptions(id string) *ListSnapshotClonesOptions {
	return &ListSnapshotClonesOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListSnapshotClonesOptions) SetID(id string) *ListSnapshotClonesOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSnapshotClonesOptions) SetHeaders(param map[string]string) *ListSnapshotClonesOptions {
	options.Headers = param
	return options
}

// ListSnapshotConsistencyGroupsOptions : The ListSnapshotConsistencyGroups options.
type ListSnapshotConsistencyGroupsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to backup policy jobs with a `backup_policy_plan.id` property matching the specified
	// identifier.
	BackupPolicyPlanID *string `json:"backup_policy_plan.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListSnapshotConsistencyGroupsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListSnapshotConsistencyGroupsOptionsSortCreatedAtConst = "created_at"
	ListSnapshotConsistencyGroupsOptionsSortNameConst      = "name"
)

// NewListSnapshotConsistencyGroupsOptions : Instantiate ListSnapshotConsistencyGroupsOptions
func (*VpcV1) NewListSnapshotConsistencyGroupsOptions() *ListSnapshotConsistencyGroupsOptions {
	return &ListSnapshotConsistencyGroupsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListSnapshotConsistencyGroupsOptions) SetStart(start string) *ListSnapshotConsistencyGroupsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSnapshotConsistencyGroupsOptions) SetLimit(limit int64) *ListSnapshotConsistencyGroupsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListSnapshotConsistencyGroupsOptions) SetResourceGroupID(resourceGroupID string) *ListSnapshotConsistencyGroupsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListSnapshotConsistencyGroupsOptions) SetName(name string) *ListSnapshotConsistencyGroupsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListSnapshotConsistencyGroupsOptions) SetSort(sort string) *ListSnapshotConsistencyGroupsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetBackupPolicyPlanID : Allow user to set BackupPolicyPlanID
func (_options *ListSnapshotConsistencyGroupsOptions) SetBackupPolicyPlanID(backupPolicyPlanID string) *ListSnapshotConsistencyGroupsOptions {
	_options.BackupPolicyPlanID = core.StringPtr(backupPolicyPlanID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSnapshotConsistencyGroupsOptions) SetHeaders(param map[string]string) *ListSnapshotConsistencyGroupsOptions {
	options.Headers = param
	return options
}

// ListSnapshotInstanceProfilesOptions : The ListSnapshotInstanceProfiles options.
type ListSnapshotInstanceProfilesOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListSnapshotInstanceProfilesOptions : Instantiate ListSnapshotInstanceProfilesOptions
func (*VpcV1) NewListSnapshotInstanceProfilesOptions(id string) *ListSnapshotInstanceProfilesOptions {
	return &ListSnapshotInstanceProfilesOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListSnapshotInstanceProfilesOptions) SetID(id string) *ListSnapshotInstanceProfilesOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListSnapshotInstanceProfilesOptions) SetStart(start string) *ListSnapshotInstanceProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSnapshotInstanceProfilesOptions) SetLimit(limit int64) *ListSnapshotInstanceProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSnapshotInstanceProfilesOptions) SetHeaders(param map[string]string) *ListSnapshotInstanceProfilesOptions {
	options.Headers = param
	return options
}

// ListSnapshotsOptions : The ListSnapshots options.
type ListSnapshotsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with an item in the `tags` property matching the exact specified tag.
	Tag *string `json:"tag,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to resources with a `source_volume.id` property matching the specified identifier.
	SourceVolumeID *string `json:"source_volume.id,omitempty"`

	// Filters the collection to resources with a `source_volume.crn` property matching the specified CRN.
	SourceVolumeCRN *string `json:"source_volume.crn,omitempty"`

	// Filters the collection to resources with a `source_image.id` property matching the specified identifier.
	//
	// This parameter also supports the values `null` and `not:null` which filter the collection to resources which have no
	// source image or any existent source image, respectively.
	SourceImageID *string `json:"source_image.id,omitempty"`

	// Filters the collection to resources with a `source_image.crn` property matching the specified CRN.
	//
	// This parameter also supports the values `null` and `not:null` which filter the collection to resources which have no
	// source image or any existent source image, respectively.
	SourceImageCRN *string `json:"source_image.crn,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to backup policy jobs with a `backup_policy_plan.id` property matching the specified
	// identifier.
	BackupPolicyPlanID *string `json:"backup_policy_plan.id,omitempty"`

	// Filters the collection to snapshots with an item in the `copies` property with an `id` property matching the
	// specified identifier.
	CopiesID *string `json:"copies[].id,omitempty"`

	// Filters the collection to snapshots with an item in the `copies` property with a `name` property matching the exact
	// specified name.
	CopiesName *string `json:"copies[].name,omitempty"`

	// Filters the collection to snapshots with an item in the `copies` property with a `crn` property matching the
	// specified CRN.
	CopiesCRN *string `json:"copies[].crn,omitempty"`

	// Filters the collection to snapshots with an item in the `copies` property with a
	// `remote.region.name` property matching the exact specified name.
	CopiesRemoteRegionName *string `json:"copies[].remote.region.name,omitempty"`

	// Filters the collection to resources with a `source_snapshot.id` property matching the specified identifier.
	SourceSnapshotID *string `json:"source_snapshot.id,omitempty"`

	// Filters the collection to resources with a `source_snapshot.remote.region.name` property matching the exact
	// specified name.
	SourceSnapshotRemoteRegionName *string `json:"source_snapshot.remote.region.name,omitempty"`

	// Filters the collection to resources with a `source_volume.remote.region.name` property matching the exact specified
	// name.
	SourceVolumeRemoteRegionName *string `json:"source_volume.remote.region.name,omitempty"`

	// Filters the collection to resources with a `source_image.remote.region.name` property matching the exact specified
	// name.
	SourceImageRemoteRegionName *string `json:"source_image.remote.region.name,omitempty"`

	// Filters the collection to snapshots with an item in the `clones` property with a `zone.name` property matching the
	// exact specified name.
	ClonesZoneName *string `json:"clones[].zone.name,omitempty"`

	// Filters the collection to resources with a `snapshot_consistency_group.id` property matching the specified
	// identifier.
	SnapshotConsistencyGroupID *string `json:"snapshot_consistency_group.id,omitempty"`

	// Filters the collection to resources with a `snapshot_consistency_group.crn` property matching the specified
	// identifier.
	SnapshotConsistencyGroupCRN *string `json:"snapshot_consistency_group.crn,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListSnapshotsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListSnapshotsOptionsSortCreatedAtConst = "created_at"
	ListSnapshotsOptionsSortNameConst      = "name"
)

// NewListSnapshotsOptions : Instantiate ListSnapshotsOptions
func (*VpcV1) NewListSnapshotsOptions() *ListSnapshotsOptions {
	return &ListSnapshotsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListSnapshotsOptions) SetStart(start string) *ListSnapshotsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSnapshotsOptions) SetLimit(limit int64) *ListSnapshotsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetTag : Allow user to set Tag
func (_options *ListSnapshotsOptions) SetTag(tag string) *ListSnapshotsOptions {
	_options.Tag = core.StringPtr(tag)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListSnapshotsOptions) SetResourceGroupID(resourceGroupID string) *ListSnapshotsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListSnapshotsOptions) SetName(name string) *ListSnapshotsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetSourceVolumeID : Allow user to set SourceVolumeID
func (_options *ListSnapshotsOptions) SetSourceVolumeID(sourceVolumeID string) *ListSnapshotsOptions {
	_options.SourceVolumeID = core.StringPtr(sourceVolumeID)
	return _options
}

// SetSourceVolumeCRN : Allow user to set SourceVolumeCRN
func (_options *ListSnapshotsOptions) SetSourceVolumeCRN(sourceVolumeCRN string) *ListSnapshotsOptions {
	_options.SourceVolumeCRN = core.StringPtr(sourceVolumeCRN)
	return _options
}

// SetSourceImageID : Allow user to set SourceImageID
func (_options *ListSnapshotsOptions) SetSourceImageID(sourceImageID string) *ListSnapshotsOptions {
	_options.SourceImageID = core.StringPtr(sourceImageID)
	return _options
}

// SetSourceImageCRN : Allow user to set SourceImageCRN
func (_options *ListSnapshotsOptions) SetSourceImageCRN(sourceImageCRN string) *ListSnapshotsOptions {
	_options.SourceImageCRN = core.StringPtr(sourceImageCRN)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListSnapshotsOptions) SetSort(sort string) *ListSnapshotsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetBackupPolicyPlanID : Allow user to set BackupPolicyPlanID
func (_options *ListSnapshotsOptions) SetBackupPolicyPlanID(backupPolicyPlanID string) *ListSnapshotsOptions {
	_options.BackupPolicyPlanID = core.StringPtr(backupPolicyPlanID)
	return _options
}

// SetCopiesID : Allow user to set CopiesID
func (_options *ListSnapshotsOptions) SetCopiesID(copiesID string) *ListSnapshotsOptions {
	_options.CopiesID = core.StringPtr(copiesID)
	return _options
}

// SetCopiesName : Allow user to set CopiesName
func (_options *ListSnapshotsOptions) SetCopiesName(copiesName string) *ListSnapshotsOptions {
	_options.CopiesName = core.StringPtr(copiesName)
	return _options
}

// SetCopiesCRN : Allow user to set CopiesCRN
func (_options *ListSnapshotsOptions) SetCopiesCRN(copiesCRN string) *ListSnapshotsOptions {
	_options.CopiesCRN = core.StringPtr(copiesCRN)
	return _options
}

// SetCopiesRemoteRegionName : Allow user to set CopiesRemoteRegionName
func (_options *ListSnapshotsOptions) SetCopiesRemoteRegionName(copiesRemoteRegionName string) *ListSnapshotsOptions {
	_options.CopiesRemoteRegionName = core.StringPtr(copiesRemoteRegionName)
	return _options
}

// SetSourceSnapshotID : Allow user to set SourceSnapshotID
func (_options *ListSnapshotsOptions) SetSourceSnapshotID(sourceSnapshotID string) *ListSnapshotsOptions {
	_options.SourceSnapshotID = core.StringPtr(sourceSnapshotID)
	return _options
}

// SetSourceSnapshotRemoteRegionName : Allow user to set SourceSnapshotRemoteRegionName
func (_options *ListSnapshotsOptions) SetSourceSnapshotRemoteRegionName(sourceSnapshotRemoteRegionName string) *ListSnapshotsOptions {
	_options.SourceSnapshotRemoteRegionName = core.StringPtr(sourceSnapshotRemoteRegionName)
	return _options
}

// SetSourceVolumeRemoteRegionName : Allow user to set SourceVolumeRemoteRegionName
func (_options *ListSnapshotsOptions) SetSourceVolumeRemoteRegionName(sourceVolumeRemoteRegionName string) *ListSnapshotsOptions {
	_options.SourceVolumeRemoteRegionName = core.StringPtr(sourceVolumeRemoteRegionName)
	return _options
}

// SetSourceImageRemoteRegionName : Allow user to set SourceImageRemoteRegionName
func (_options *ListSnapshotsOptions) SetSourceImageRemoteRegionName(sourceImageRemoteRegionName string) *ListSnapshotsOptions {
	_options.SourceImageRemoteRegionName = core.StringPtr(sourceImageRemoteRegionName)
	return _options
}

// SetClonesZoneName : Allow user to set ClonesZoneName
func (_options *ListSnapshotsOptions) SetClonesZoneName(clonesZoneName string) *ListSnapshotsOptions {
	_options.ClonesZoneName = core.StringPtr(clonesZoneName)
	return _options
}

// SetSnapshotConsistencyGroupID : Allow user to set SnapshotConsistencyGroupID
func (_options *ListSnapshotsOptions) SetSnapshotConsistencyGroupID(snapshotConsistencyGroupID string) *ListSnapshotsOptions {
	_options.SnapshotConsistencyGroupID = core.StringPtr(snapshotConsistencyGroupID)
	return _options
}

// SetSnapshotConsistencyGroupCRN : Allow user to set SnapshotConsistencyGroupCRN
func (_options *ListSnapshotsOptions) SetSnapshotConsistencyGroupCRN(snapshotConsistencyGroupCRN string) *ListSnapshotsOptions {
	_options.SnapshotConsistencyGroupCRN = core.StringPtr(snapshotConsistencyGroupCRN)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSnapshotsOptions) SetHeaders(param map[string]string) *ListSnapshotsOptions {
	options.Headers = param
	return options
}

// ListSubnetReservedIpsOptions : The ListSubnetReservedIps options.
type ListSubnetReservedIpsOptions struct {
	// The subnet identifier.
	SubnetID *string `json:"subnet_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to resources with a `target.id` property matching the specified identifier.
	TargetID *string `json:"target.id,omitempty"`

	// Filters the collection to resources with a `target.crn` property matching the specified CRN.
	TargetCRN *string `json:"target.crn,omitempty"`

	// Filters the collection to resources with a `target.name` property matching the exact specified name.
	TargetName *string `json:"target.name,omitempty"`

	// Filters the collection to resources with a `target.resource_type` property matching the specified value.
	TargetResourceType *string `json:"target.resource_type,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListSubnetReservedIpsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListSubnetReservedIpsOptionsSortAddressConst   = "address"
	ListSubnetReservedIpsOptionsSortCreatedAtConst = "created_at"
	ListSubnetReservedIpsOptionsSortNameConst      = "name"
)

// NewListSubnetReservedIpsOptions : Instantiate ListSubnetReservedIpsOptions
func (*VpcV1) NewListSubnetReservedIpsOptions(subnetID string) *ListSubnetReservedIpsOptions {
	return &ListSubnetReservedIpsOptions{
		SubnetID: core.StringPtr(subnetID),
	}
}

// SetSubnetID : Allow user to set SubnetID
func (_options *ListSubnetReservedIpsOptions) SetSubnetID(subnetID string) *ListSubnetReservedIpsOptions {
	_options.SubnetID = core.StringPtr(subnetID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListSubnetReservedIpsOptions) SetStart(start string) *ListSubnetReservedIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSubnetReservedIpsOptions) SetLimit(limit int64) *ListSubnetReservedIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListSubnetReservedIpsOptions) SetSort(sort string) *ListSubnetReservedIpsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetTargetID : Allow user to set TargetID
func (_options *ListSubnetReservedIpsOptions) SetTargetID(targetID string) *ListSubnetReservedIpsOptions {
	_options.TargetID = core.StringPtr(targetID)
	return _options
}

// SetTargetCRN : Allow user to set TargetCRN
func (_options *ListSubnetReservedIpsOptions) SetTargetCRN(targetCRN string) *ListSubnetReservedIpsOptions {
	_options.TargetCRN = core.StringPtr(targetCRN)
	return _options
}

// SetTargetName : Allow user to set TargetName
func (_options *ListSubnetReservedIpsOptions) SetTargetName(targetName string) *ListSubnetReservedIpsOptions {
	_options.TargetName = core.StringPtr(targetName)
	return _options
}

// SetTargetResourceType : Allow user to set TargetResourceType
func (_options *ListSubnetReservedIpsOptions) SetTargetResourceType(targetResourceType string) *ListSubnetReservedIpsOptions {
	_options.TargetResourceType = core.StringPtr(targetResourceType)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSubnetReservedIpsOptions) SetHeaders(param map[string]string) *ListSubnetReservedIpsOptions {
	options.Headers = param
	return options
}

// ListSubnetsOptions : The ListSubnets options.
type ListSubnetsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to resources with a `zone.name` property matching the exact specified name.
	ZoneName *string `json:"zone.name,omitempty"`

	// Filters the collection to resources with a `vpc.id` property matching the specified identifier.
	VPCID *string `json:"vpc.id,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Filters the collection to subnets with a `routing_table.id` property matching the specified identifier.
	RoutingTableID *string `json:"routing_table.id,omitempty"`

	// Filters the collection to subnets with a `routing_table.name` property matching the exact specified name.
	RoutingTableName *string `json:"routing_table.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListSubnetsOptions : Instantiate ListSubnetsOptions
func (*VpcV1) NewListSubnetsOptions() *ListSubnetsOptions {
	return &ListSubnetsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListSubnetsOptions) SetStart(start string) *ListSubnetsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListSubnetsOptions) SetLimit(limit int64) *ListSubnetsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListSubnetsOptions) SetResourceGroupID(resourceGroupID string) *ListSubnetsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *ListSubnetsOptions) SetZoneName(zoneName string) *ListSubnetsOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetVPCID : Allow user to set VPCID
func (_options *ListSubnetsOptions) SetVPCID(vpcID string) *ListSubnetsOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListSubnetsOptions) SetVPCCRN(vpcCRN string) *ListSubnetsOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListSubnetsOptions) SetVPCName(vpcName string) *ListSubnetsOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetRoutingTableID : Allow user to set RoutingTableID
func (_options *ListSubnetsOptions) SetRoutingTableID(routingTableID string) *ListSubnetsOptions {
	_options.RoutingTableID = core.StringPtr(routingTableID)
	return _options
}

// SetRoutingTableName : Allow user to set RoutingTableName
func (_options *ListSubnetsOptions) SetRoutingTableName(routingTableName string) *ListSubnetsOptions {
	_options.RoutingTableName = core.StringPtr(routingTableName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListSubnetsOptions) SetHeaders(param map[string]string) *ListSubnetsOptions {
	options.Headers = param
	return options
}

// ListVirtualNetworkInterfaceIpsOptions : The ListVirtualNetworkInterfaceIps options.
type ListVirtualNetworkInterfaceIpsOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value
	// `-name` sorts the collection by the `name` property in descending order, and the value `name` sorts it by the `name`
	// property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVirtualNetworkInterfaceIpsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value
// `-name` sorts the collection by the `name` property in descending order, and the value `name` sorts it by the `name`
// property in ascending order.
const (
	ListVirtualNetworkInterfaceIpsOptionsSortAddressConst = "address"
	ListVirtualNetworkInterfaceIpsOptionsSortNameConst    = "name"
)

// NewListVirtualNetworkInterfaceIpsOptions : Instantiate ListVirtualNetworkInterfaceIpsOptions
func (*VpcV1) NewListVirtualNetworkInterfaceIpsOptions(virtualNetworkInterfaceID string) *ListVirtualNetworkInterfaceIpsOptions {
	return &ListVirtualNetworkInterfaceIpsOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *ListVirtualNetworkInterfaceIpsOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *ListVirtualNetworkInterfaceIpsOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVirtualNetworkInterfaceIpsOptions) SetStart(start string) *ListVirtualNetworkInterfaceIpsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVirtualNetworkInterfaceIpsOptions) SetLimit(limit int64) *ListVirtualNetworkInterfaceIpsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListVirtualNetworkInterfaceIpsOptions) SetSort(sort string) *ListVirtualNetworkInterfaceIpsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVirtualNetworkInterfaceIpsOptions) SetHeaders(param map[string]string) *ListVirtualNetworkInterfaceIpsOptions {
	options.Headers = param
	return options
}

// ListVirtualNetworkInterfacesOptions : The ListVirtualNetworkInterfaces options.
type ListVirtualNetworkInterfacesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVirtualNetworkInterfacesOptions : Instantiate ListVirtualNetworkInterfacesOptions
func (*VpcV1) NewListVirtualNetworkInterfacesOptions() *ListVirtualNetworkInterfacesOptions {
	return &ListVirtualNetworkInterfacesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListVirtualNetworkInterfacesOptions) SetStart(start string) *ListVirtualNetworkInterfacesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVirtualNetworkInterfacesOptions) SetLimit(limit int64) *ListVirtualNetworkInterfacesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListVirtualNetworkInterfacesOptions) SetResourceGroupID(resourceGroupID string) *ListVirtualNetworkInterfacesOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVirtualNetworkInterfacesOptions) SetHeaders(param map[string]string) *ListVirtualNetworkInterfacesOptions {
	options.Headers = param
	return options
}

// ListVolumeInstanceProfilesOptions : The ListVolumeInstanceProfiles options.
type ListVolumeInstanceProfilesOptions struct {
	// The volume identifier.
	ID *string `json:"id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVolumeInstanceProfilesOptions : Instantiate ListVolumeInstanceProfilesOptions
func (*VpcV1) NewListVolumeInstanceProfilesOptions(id string) *ListVolumeInstanceProfilesOptions {
	return &ListVolumeInstanceProfilesOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ListVolumeInstanceProfilesOptions) SetID(id string) *ListVolumeInstanceProfilesOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVolumeInstanceProfilesOptions) SetStart(start string) *ListVolumeInstanceProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVolumeInstanceProfilesOptions) SetLimit(limit int64) *ListVolumeInstanceProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVolumeInstanceProfilesOptions) SetHeaders(param map[string]string) *ListVolumeInstanceProfilesOptions {
	options.Headers = param
	return options
}

// ListVolumeProfilesOptions : The ListVolumeProfiles options.
type ListVolumeProfilesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVolumeProfilesOptions : Instantiate ListVolumeProfilesOptions
func (*VpcV1) NewListVolumeProfilesOptions() *ListVolumeProfilesOptions {
	return &ListVolumeProfilesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListVolumeProfilesOptions) SetStart(start string) *ListVolumeProfilesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVolumeProfilesOptions) SetLimit(limit int64) *ListVolumeProfilesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVolumeProfilesOptions) SetHeaders(param map[string]string) *ListVolumeProfilesOptions {
	options.Headers = param
	return options
}

// ListVolumesOptions : The ListVolumes options.
type ListVolumesOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to volumes with an `attachment_state` property matching the specified value.
	AttachmentState *string `json:"attachment_state,omitempty"`

	// Filters the collection to resources with an `encryption` property matching the specified value.
	Encryption *string `json:"encryption,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to resources with an `operating_system.family` property matching the specified operating
	// system family.
	//
	// This parameter also supports the values `null` and `not:null` which filter the collection to resources which have no
	// operating system or any operating system, respectively.
	OperatingSystemFamily *string `json:"operating_system.family,omitempty"`

	// Filters the collection to resources with an `operating_system.architecture` property matching the specified
	// operating system architecture.
	//
	// This parameter also supports the values `null` and `not:null` which filter the collection to resources which have no
	// operating system or any operating system, respectively.
	OperatingSystemArchitecture *string `json:"operating_system.architecture,omitempty"`

	// Filters the collection to resources with an item in the `tags` property matching the exact specified tag.
	Tag *string `json:"tag,omitempty"`

	// Filters the collection to resources with a `zone.name` property matching the exact specified name.
	ZoneName *string `json:"zone.name,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVolumesOptions.AttachmentState property.
// Filters the collection to volumes with an `attachment_state` property matching the specified value.
const (
	ListVolumesOptionsAttachmentStateAttachedConst   = "attached"
	ListVolumesOptionsAttachmentStateUnattachedConst = "unattached"
	ListVolumesOptionsAttachmentStateUnusableConst   = "unusable"
)

// Constants associated with the ListVolumesOptions.Encryption property.
// Filters the collection to resources with an `encryption` property matching the specified value.
const (
	ListVolumesOptionsEncryptionProviderManagedConst = "provider_managed"
	ListVolumesOptionsEncryptionUserManagedConst     = "user_managed"
)

// NewListVolumesOptions : Instantiate ListVolumesOptions
func (*VpcV1) NewListVolumesOptions() *ListVolumesOptions {
	return &ListVolumesOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListVolumesOptions) SetStart(start string) *ListVolumesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVolumesOptions) SetLimit(limit int64) *ListVolumesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetAttachmentState : Allow user to set AttachmentState
func (_options *ListVolumesOptions) SetAttachmentState(attachmentState string) *ListVolumesOptions {
	_options.AttachmentState = core.StringPtr(attachmentState)
	return _options
}

// SetEncryption : Allow user to set Encryption
func (_options *ListVolumesOptions) SetEncryption(encryption string) *ListVolumesOptions {
	_options.Encryption = core.StringPtr(encryption)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListVolumesOptions) SetName(name string) *ListVolumesOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetOperatingSystemFamily : Allow user to set OperatingSystemFamily
func (_options *ListVolumesOptions) SetOperatingSystemFamily(operatingSystemFamily string) *ListVolumesOptions {
	_options.OperatingSystemFamily = core.StringPtr(operatingSystemFamily)
	return _options
}

// SetOperatingSystemArchitecture : Allow user to set OperatingSystemArchitecture
func (_options *ListVolumesOptions) SetOperatingSystemArchitecture(operatingSystemArchitecture string) *ListVolumesOptions {
	_options.OperatingSystemArchitecture = core.StringPtr(operatingSystemArchitecture)
	return _options
}

// SetTag : Allow user to set Tag
func (_options *ListVolumesOptions) SetTag(tag string) *ListVolumesOptions {
	_options.Tag = core.StringPtr(tag)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *ListVolumesOptions) SetZoneName(zoneName string) *ListVolumesOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVolumesOptions) SetHeaders(param map[string]string) *ListVolumesOptions {
	options.Headers = param
	return options
}

// ListVPCAddressPrefixesOptions : The ListVPCAddressPrefixes options.
type ListVPCAddressPrefixesOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVPCAddressPrefixesOptions : Instantiate ListVPCAddressPrefixesOptions
func (*VpcV1) NewListVPCAddressPrefixesOptions(vpcID string) *ListVPCAddressPrefixesOptions {
	return &ListVPCAddressPrefixesOptions{
		VPCID: core.StringPtr(vpcID),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *ListVPCAddressPrefixesOptions) SetVPCID(vpcID string) *ListVPCAddressPrefixesOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPCAddressPrefixesOptions) SetStart(start string) *ListVPCAddressPrefixesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPCAddressPrefixesOptions) SetLimit(limit int64) *ListVPCAddressPrefixesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPCAddressPrefixesOptions) SetHeaders(param map[string]string) *ListVPCAddressPrefixesOptions {
	options.Headers = param
	return options
}

// ListVPCDnsResolutionBindingsOptions : The ListVPCDnsResolutionBindings options.
type ListVPCDnsResolutionBindingsOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// Filters the collection to resources with a `vpc.crn` property matching the specified CRN.
	VPCCRN *string `json:"vpc.crn,omitempty"`

	// Filters the collection to resources with a `vpc.name` property matching the exact specified name.
	VPCName *string `json:"vpc.name,omitempty"`

	// Filters the collection to resources with a `vpc.remote.account.id` property matching the specified account
	// identifier.
	AccountID *string `json:"account.id,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVPCDnsResolutionBindingsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListVPCDnsResolutionBindingsOptionsSortCreatedAtConst = "created_at"
	ListVPCDnsResolutionBindingsOptionsSortNameConst      = "name"
)

// NewListVPCDnsResolutionBindingsOptions : Instantiate ListVPCDnsResolutionBindingsOptions
func (*VpcV1) NewListVPCDnsResolutionBindingsOptions(vpcID string) *ListVPCDnsResolutionBindingsOptions {
	return &ListVPCDnsResolutionBindingsOptions{
		VPCID: core.StringPtr(vpcID),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *ListVPCDnsResolutionBindingsOptions) SetVPCID(vpcID string) *ListVPCDnsResolutionBindingsOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListVPCDnsResolutionBindingsOptions) SetSort(sort string) *ListVPCDnsResolutionBindingsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPCDnsResolutionBindingsOptions) SetStart(start string) *ListVPCDnsResolutionBindingsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPCDnsResolutionBindingsOptions) SetLimit(limit int64) *ListVPCDnsResolutionBindingsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetName : Allow user to set Name
func (_options *ListVPCDnsResolutionBindingsOptions) SetName(name string) *ListVPCDnsResolutionBindingsOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetVPCCRN : Allow user to set VPCCRN
func (_options *ListVPCDnsResolutionBindingsOptions) SetVPCCRN(vpcCRN string) *ListVPCDnsResolutionBindingsOptions {
	_options.VPCCRN = core.StringPtr(vpcCRN)
	return _options
}

// SetVPCName : Allow user to set VPCName
func (_options *ListVPCDnsResolutionBindingsOptions) SetVPCName(vpcName string) *ListVPCDnsResolutionBindingsOptions {
	_options.VPCName = core.StringPtr(vpcName)
	return _options
}

// SetAccountID : Allow user to set AccountID
func (_options *ListVPCDnsResolutionBindingsOptions) SetAccountID(accountID string) *ListVPCDnsResolutionBindingsOptions {
	_options.AccountID = core.StringPtr(accountID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPCDnsResolutionBindingsOptions) SetHeaders(param map[string]string) *ListVPCDnsResolutionBindingsOptions {
	options.Headers = param
	return options
}

// ListVPCRoutesOptions : The ListVPCRoutes options.
type ListVPCRoutesOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// Filters the collection to resources with a `zone.name` property matching the exact specified name.
	ZoneName *string `json:"zone.name,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVPCRoutesOptions : Instantiate ListVPCRoutesOptions
func (*VpcV1) NewListVPCRoutesOptions(vpcID string) *ListVPCRoutesOptions {
	return &ListVPCRoutesOptions{
		VPCID: core.StringPtr(vpcID),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *ListVPCRoutesOptions) SetVPCID(vpcID string) *ListVPCRoutesOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetZoneName : Allow user to set ZoneName
func (_options *ListVPCRoutesOptions) SetZoneName(zoneName string) *ListVPCRoutesOptions {
	_options.ZoneName = core.StringPtr(zoneName)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPCRoutesOptions) SetStart(start string) *ListVPCRoutesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPCRoutesOptions) SetLimit(limit int64) *ListVPCRoutesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPCRoutesOptions) SetHeaders(param map[string]string) *ListVPCRoutesOptions {
	options.Headers = param
	return options
}

// ListVPCRoutingTableRoutesOptions : The ListVPCRoutingTableRoutes options.
type ListVPCRoutingTableRoutesOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	RoutingTableID *string `json:"routing_table_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVPCRoutingTableRoutesOptions : Instantiate ListVPCRoutingTableRoutesOptions
func (*VpcV1) NewListVPCRoutingTableRoutesOptions(vpcID string, routingTableID string) *ListVPCRoutingTableRoutesOptions {
	return &ListVPCRoutingTableRoutesOptions{
		VPCID:          core.StringPtr(vpcID),
		RoutingTableID: core.StringPtr(routingTableID),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *ListVPCRoutingTableRoutesOptions) SetVPCID(vpcID string) *ListVPCRoutingTableRoutesOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetRoutingTableID : Allow user to set RoutingTableID
func (_options *ListVPCRoutingTableRoutesOptions) SetRoutingTableID(routingTableID string) *ListVPCRoutingTableRoutesOptions {
	_options.RoutingTableID = core.StringPtr(routingTableID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPCRoutingTableRoutesOptions) SetStart(start string) *ListVPCRoutingTableRoutesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPCRoutingTableRoutesOptions) SetLimit(limit int64) *ListVPCRoutingTableRoutesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPCRoutingTableRoutesOptions) SetHeaders(param map[string]string) *ListVPCRoutingTableRoutesOptions {
	options.Headers = param
	return options
}

// ListVPCRoutingTablesOptions : The ListVPCRoutingTables options.
type ListVPCRoutingTablesOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to routing tables with an `is_default` property matching the specified value.
	IsDefault *bool `json:"is_default,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVPCRoutingTablesOptions : Instantiate ListVPCRoutingTablesOptions
func (*VpcV1) NewListVPCRoutingTablesOptions(vpcID string) *ListVPCRoutingTablesOptions {
	return &ListVPCRoutingTablesOptions{
		VPCID: core.StringPtr(vpcID),
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *ListVPCRoutingTablesOptions) SetVPCID(vpcID string) *ListVPCRoutingTablesOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPCRoutingTablesOptions) SetStart(start string) *ListVPCRoutingTablesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPCRoutingTablesOptions) SetLimit(limit int64) *ListVPCRoutingTablesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetIsDefault : Allow user to set IsDefault
func (_options *ListVPCRoutingTablesOptions) SetIsDefault(isDefault bool) *ListVPCRoutingTablesOptions {
	_options.IsDefault = core.BoolPtr(isDefault)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPCRoutingTablesOptions) SetHeaders(param map[string]string) *ListVPCRoutingTablesOptions {
	options.Headers = param
	return options
}

// ListVpcsOptions : The ListVpcs options.
type ListVpcsOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Filters the collection to VPCs with a `classic_access` property matching the specified value.
	ClassicAccess *bool `json:"classic_access,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVpcsOptions : Instantiate ListVpcsOptions
func (*VpcV1) NewListVpcsOptions() *ListVpcsOptions {
	return &ListVpcsOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListVpcsOptions) SetStart(start string) *ListVpcsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVpcsOptions) SetLimit(limit int64) *ListVpcsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListVpcsOptions) SetResourceGroupID(resourceGroupID string) *ListVpcsOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetClassicAccess : Allow user to set ClassicAccess
func (_options *ListVpcsOptions) SetClassicAccess(classicAccess bool) *ListVpcsOptions {
	_options.ClassicAccess = core.BoolPtr(classicAccess)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVpcsOptions) SetHeaders(param map[string]string) *ListVpcsOptions {
	options.Headers = param
	return options
}

// ListVPNGatewayConnectionsLocalCIDRsOptions : The ListVPNGatewayConnectionsLocalCIDRs options.
type ListVPNGatewayConnectionsLocalCIDRsOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVPNGatewayConnectionsLocalCIDRsOptions : Instantiate ListVPNGatewayConnectionsLocalCIDRsOptions
func (*VpcV1) NewListVPNGatewayConnectionsLocalCIDRsOptions(vpnGatewayID string, id string) *ListVPNGatewayConnectionsLocalCIDRsOptions {
	return &ListVPNGatewayConnectionsLocalCIDRsOptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *ListVPNGatewayConnectionsLocalCIDRsOptions) SetVPNGatewayID(vpnGatewayID string) *ListVPNGatewayConnectionsLocalCIDRsOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *ListVPNGatewayConnectionsLocalCIDRsOptions) SetID(id string) *ListVPNGatewayConnectionsLocalCIDRsOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNGatewayConnectionsLocalCIDRsOptions) SetHeaders(param map[string]string) *ListVPNGatewayConnectionsLocalCIDRsOptions {
	options.Headers = param
	return options
}

// ListVPNGatewayConnectionsOptions : The ListVPNGatewayConnections options.
type ListVPNGatewayConnectionsOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to VPN gateway connections with a `status` property matching the specified value.
	Status *string `json:"status,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVPNGatewayConnectionsOptions.Status property.
// Filters the collection to VPN gateway connections with a `status` property matching the specified value.
const (
	ListVPNGatewayConnectionsOptionsStatusDownConst = "down"
	ListVPNGatewayConnectionsOptionsStatusUpConst   = "up"
)

// NewListVPNGatewayConnectionsOptions : Instantiate ListVPNGatewayConnectionsOptions
func (*VpcV1) NewListVPNGatewayConnectionsOptions(vpnGatewayID string) *ListVPNGatewayConnectionsOptions {
	return &ListVPNGatewayConnectionsOptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *ListVPNGatewayConnectionsOptions) SetVPNGatewayID(vpnGatewayID string) *ListVPNGatewayConnectionsOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPNGatewayConnectionsOptions) SetStart(start string) *ListVPNGatewayConnectionsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPNGatewayConnectionsOptions) SetLimit(limit int64) *ListVPNGatewayConnectionsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetStatus : Allow user to set Status
func (_options *ListVPNGatewayConnectionsOptions) SetStatus(status string) *ListVPNGatewayConnectionsOptions {
	_options.Status = core.StringPtr(status)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNGatewayConnectionsOptions) SetHeaders(param map[string]string) *ListVPNGatewayConnectionsOptions {
	options.Headers = param
	return options
}

// ListVPNGatewayConnectionsPeerCIDRsOptions : The ListVPNGatewayConnectionsPeerCIDRs options.
type ListVPNGatewayConnectionsPeerCIDRsOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewListVPNGatewayConnectionsPeerCIDRsOptions : Instantiate ListVPNGatewayConnectionsPeerCIDRsOptions
func (*VpcV1) NewListVPNGatewayConnectionsPeerCIDRsOptions(vpnGatewayID string, id string) *ListVPNGatewayConnectionsPeerCIDRsOptions {
	return &ListVPNGatewayConnectionsPeerCIDRsOptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *ListVPNGatewayConnectionsPeerCIDRsOptions) SetVPNGatewayID(vpnGatewayID string) *ListVPNGatewayConnectionsPeerCIDRsOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *ListVPNGatewayConnectionsPeerCIDRsOptions) SetID(id string) *ListVPNGatewayConnectionsPeerCIDRsOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNGatewayConnectionsPeerCIDRsOptions) SetHeaders(param map[string]string) *ListVPNGatewayConnectionsPeerCIDRsOptions {
	options.Headers = param
	return options
}

// ListVPNGatewaysOptions : The ListVPNGateways options.
type ListVPNGatewaysOptions struct {
	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Filters the collection to VPN gateways with a `mode` property matching the specified value.
	Mode *string `json:"mode,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVPNGatewaysOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListVPNGatewaysOptionsSortCreatedAtConst = "created_at"
	ListVPNGatewaysOptionsSortNameConst      = "name"
)

// Constants associated with the ListVPNGatewaysOptions.Mode property.
// Filters the collection to VPN gateways with a `mode` property matching the specified value.
const (
	ListVPNGatewaysOptionsModePolicyConst = "policy"
	ListVPNGatewaysOptionsModeRouteConst  = "route"
)

// NewListVPNGatewaysOptions : Instantiate ListVPNGatewaysOptions
func (*VpcV1) NewListVPNGatewaysOptions() *ListVPNGatewaysOptions {
	return &ListVPNGatewaysOptions{}
}

// SetStart : Allow user to set Start
func (_options *ListVPNGatewaysOptions) SetStart(start string) *ListVPNGatewaysOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPNGatewaysOptions) SetLimit(limit int64) *ListVPNGatewaysOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListVPNGatewaysOptions) SetResourceGroupID(resourceGroupID string) *ListVPNGatewaysOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListVPNGatewaysOptions) SetSort(sort string) *ListVPNGatewaysOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetMode : Allow user to set Mode
func (_options *ListVPNGatewaysOptions) SetMode(mode string) *ListVPNGatewaysOptions {
	_options.Mode = core.StringPtr(mode)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNGatewaysOptions) SetHeaders(param map[string]string) *ListVPNGatewaysOptions {
	options.Headers = param
	return options
}

// ListVPNServerClientsOptions : The ListVPNServerClients options.
type ListVPNServerClientsOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVPNServerClientsOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order.
const (
	ListVPNServerClientsOptionsSortCreatedAtConst = "created_at"
)

// NewListVPNServerClientsOptions : Instantiate ListVPNServerClientsOptions
func (*VpcV1) NewListVPNServerClientsOptions(vpnServerID string) *ListVPNServerClientsOptions {
	return &ListVPNServerClientsOptions{
		VPNServerID: core.StringPtr(vpnServerID),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *ListVPNServerClientsOptions) SetVPNServerID(vpnServerID string) *ListVPNServerClientsOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPNServerClientsOptions) SetStart(start string) *ListVPNServerClientsOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPNServerClientsOptions) SetLimit(limit int64) *ListVPNServerClientsOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListVPNServerClientsOptions) SetSort(sort string) *ListVPNServerClientsOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNServerClientsOptions) SetHeaders(param map[string]string) *ListVPNServerClientsOptions {
	options.Headers = param
	return options
}

// ListVPNServerRoutesOptions : The ListVPNServerRoutes options.
type ListVPNServerRoutesOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVPNServerRoutesOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListVPNServerRoutesOptionsSortCreatedAtConst = "created_at"
	ListVPNServerRoutesOptionsSortNameConst      = "name"
)

// NewListVPNServerRoutesOptions : Instantiate ListVPNServerRoutesOptions
func (*VpcV1) NewListVPNServerRoutesOptions(vpnServerID string) *ListVPNServerRoutesOptions {
	return &ListVPNServerRoutesOptions{
		VPNServerID: core.StringPtr(vpnServerID),
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *ListVPNServerRoutesOptions) SetVPNServerID(vpnServerID string) *ListVPNServerRoutesOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPNServerRoutesOptions) SetStart(start string) *ListVPNServerRoutesOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPNServerRoutesOptions) SetLimit(limit int64) *ListVPNServerRoutesOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListVPNServerRoutesOptions) SetSort(sort string) *ListVPNServerRoutesOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNServerRoutesOptions) SetHeaders(param map[string]string) *ListVPNServerRoutesOptions {
	options.Headers = param
	return options
}

// ListVPNServersOptions : The ListVPNServers options.
type ListVPNServersOptions struct {
	// Filters the collection to resources with a `name` property matching the exact specified name.
	Name *string `json:"name,omitempty"`

	// A server-provided token determining what resource to start the page on.
	Start *string `json:"start,omitempty"`

	// The number of resources to return on a page.
	Limit *int64 `json:"limit,omitempty"`

	// Filters the collection to resources with a `resource_group.id` property matching the specified identifier.
	ResourceGroupID *string `json:"resource_group.id,omitempty"`

	// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
	// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
	// in descending order, and the value `name` sorts it by the `name` property in ascending order.
	Sort *string `json:"sort,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the ListVPNServersOptions.Sort property.
// Sorts the returned collection by the specified property name in ascending order. A `-` may be prepended to the name
// to sort in descending order. For example, the value `-created_at` sorts the collection by the `created_at` property
// in descending order, and the value `name` sorts it by the `name` property in ascending order.
const (
	ListVPNServersOptionsSortCreatedAtConst = "created_at"
	ListVPNServersOptionsSortNameConst      = "name"
)

// NewListVPNServersOptions : Instantiate ListVPNServersOptions
func (*VpcV1) NewListVPNServersOptions() *ListVPNServersOptions {
	return &ListVPNServersOptions{}
}

// SetName : Allow user to set Name
func (_options *ListVPNServersOptions) SetName(name string) *ListVPNServersOptions {
	_options.Name = core.StringPtr(name)
	return _options
}

// SetStart : Allow user to set Start
func (_options *ListVPNServersOptions) SetStart(start string) *ListVPNServersOptions {
	_options.Start = core.StringPtr(start)
	return _options
}

// SetLimit : Allow user to set Limit
func (_options *ListVPNServersOptions) SetLimit(limit int64) *ListVPNServersOptions {
	_options.Limit = core.Int64Ptr(limit)
	return _options
}

// SetResourceGroupID : Allow user to set ResourceGroupID
func (_options *ListVPNServersOptions) SetResourceGroupID(resourceGroupID string) *ListVPNServersOptions {
	_options.ResourceGroupID = core.StringPtr(resourceGroupID)
	return _options
}

// SetSort : Allow user to set Sort
func (_options *ListVPNServersOptions) SetSort(sort string) *ListVPNServersOptions {
	_options.Sort = core.StringPtr(sort)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ListVPNServersOptions) SetHeaders(param map[string]string) *ListVPNServersOptions {
	options.Headers = param
	return options
}

// LoadBalancer : LoadBalancer struct
type LoadBalancer struct {
	// The access mode for this load balancer:
	// - `private`: reachable from within its VPC, at IP addresses in `private_ips`
	// - `private_path`: reachable through an endpoint gateway
	// - `public`: reachable from the internet at the IP addresses in `public_ips`.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AccessMode *string `json:"access_mode" validate:"required"`

	// The load balancer pool members attached to this load balancer.
	AttachedLoadBalancerPoolMembers []LoadBalancerPoolMemberReference `json:"attached_load_balancer_pool_members" validate:"required"`

	// The availability of this load balancer:
	// - `subnet`: remains available if at least one zone that the load balancer's subnets reside
	//   in is available
	// - `region`: remains available if at least one zone in the region is available.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Availability *string `json:"availability" validate:"required"`

	// The date and time that this load balancer was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this load balancer.
	CRN *string `json:"crn" validate:"required"`

	// The DNS configuration for this load balancer.
	//
	// If absent, DNS `A` records for this load balancer's `hostname` property will be added to
	// the public DNS zone `lb.appdomain.cloud`.
	//
	// Not supported by private path load balancers.
	Dns *LoadBalancerDns `json:"dns,omitempty"`

	// The supported `failsafe_policy.action` values for this load balancer's pools.
	FailsafePolicyActions []string `json:"failsafe_policy_actions" validate:"required"`

	// The fully qualified domain name assigned to this load balancer.
	Hostname *string `json:"hostname" validate:"required"`

	// The URL for this load balancer.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer.
	ID *string `json:"id" validate:"required"`

	// Indicates whether this load balancer supports instance groups.
	InstanceGroupsSupported *bool `json:"instance_groups_supported" validate:"required"`

	// Indicates whether this is a private path load balancer.
	IsPrivatePath *bool `json:"is_private_path" validate:"required"`

	// The type of this load balancer, public or private.
	IsPublic *bool `json:"is_public" validate:"required"`

	// The listeners of this load balancer.
	Listeners []LoadBalancerListenerReference `json:"listeners" validate:"required"`

	// The logging configuration for this load balancer.
	Logging *LoadBalancerLogging `json:"logging" validate:"required"`

	// The name for this load balancer. The name is unique across all load balancers in the VPC.
	Name *string `json:"name" validate:"required"`

	// The operating status of this load balancer.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	OperatingStatus *string `json:"operating_status" validate:"required"`

	// The pools of this load balancer.
	Pools []LoadBalancerPoolReference `json:"pools" validate:"required"`

	// The private IP addresses assigned to this load balancer.
	//
	// Will be empty if `is_private` is `false`.
	PrivateIps []ReservedIPReference `json:"private_ips" validate:"required"`

	// The profile for this load balancer.
	Profile *LoadBalancerProfileReference `json:"profile" validate:"required"`

	// The provisioning status of this load balancer:
	// - `active`: The load balancer is running.
	// - `create_pending`: The load balancer is being created.
	// - `delete_pending`: The load balancer is being deleted.
	// - `maintenance_pending`: The load balancer is unavailable due to an internal
	//                           error (contact IBM support).
	// - `migrate_pending`: The load balancer is migrating to the requested configuration.
	//                       Performance may be degraded.
	// - `update_pending`: The load balancer is being updated
	//     to the requested configuration.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProvisioningStatus *string `json:"provisioning_status" validate:"required"`

	// The public IP addresses assigned to this load balancer.
	//
	// Will be empty if `is_public` is `false`.
	PublicIps []IP `json:"public_ips" validate:"required"`

	// The resource group for this load balancer.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// Indicates whether [route mode](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-vnf&interface=ui) is enabled for this
	// load balancer.
	//
	// At present, public load balancers are not supported with route mode enabled.
	RouteMode *bool `json:"route_mode" validate:"required"`

	// The security groups targeting this load balancer.
	//
	// If empty, all inbound and outbound traffic is allowed.
	SecurityGroups []SecurityGroupReference `json:"security_groups" validate:"required"`

	// Indicates whether this load balancer supports security groups.
	SecurityGroupsSupported *bool `json:"security_groups_supported" validate:"required"`

	// Indicates whether this load balancer supports source IP session persistence.
	SourceIPSessionPersistenceSupported *bool `json:"source_ip_session_persistence_supported" validate:"required"`

	// The subnets this load balancer is provisioned in.
	//
	// All subnets will be in the same VPC.
	Subnets []SubnetReference `json:"subnets" validate:"required"`

	// Indicates whether this load balancer supports UDP.
	UDPSupported *bool `json:"udp_supported" validate:"required"`
}

// Constants associated with the LoadBalancer.AccessMode property.
// The access mode for this load balancer:
// - `private`: reachable from within its VPC, at IP addresses in `private_ips`
// - `private_path`: reachable through an endpoint gateway
// - `public`: reachable from the internet at the IP addresses in `public_ips`.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerAccessModePrivateConst     = "private"
	LoadBalancerAccessModePrivatePathConst = "private_path"
	LoadBalancerAccessModePublicConst      = "public"
)

// Constants associated with the LoadBalancer.Availability property.
// The availability of this load balancer:
//   - `subnet`: remains available if at least one zone that the load balancer's subnets reside
//     in is available
//   - `region`: remains available if at least one zone in the region is available.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerAvailabilityRegionConst = "region"
	LoadBalancerAvailabilitySubnetConst = "subnet"
)

// Constants associated with the LoadBalancer.FailsafePolicyActions property.
// A load balancer failsafe policy action:
// - `bypass`: Bypasses the members and sends requests directly to their destination IPs.
// - `drop`: Drops requests.
// - `fail`: Fails requests with an HTTP `503` status code.
// - `forward`: Forwards requests to the `target` pool.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerFailsafePolicyActionsBypassConst  = "bypass"
	LoadBalancerFailsafePolicyActionsDropConst    = "drop"
	LoadBalancerFailsafePolicyActionsFailConst    = "fail"
	LoadBalancerFailsafePolicyActionsForwardConst = "forward"
)

// Constants associated with the LoadBalancer.OperatingStatus property.
// The operating status of this load balancer.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerOperatingStatusOfflineConst = "offline"
	LoadBalancerOperatingStatusOnlineConst  = "online"
)

// Constants associated with the LoadBalancer.ProvisioningStatus property.
// The provisioning status of this load balancer:
//   - `active`: The load balancer is running.
//   - `create_pending`: The load balancer is being created.
//   - `delete_pending`: The load balancer is being deleted.
//   - `maintenance_pending`: The load balancer is unavailable due to an internal
//     error (contact IBM support).
//   - `migrate_pending`: The load balancer is migrating to the requested configuration.
//     Performance may be degraded.
//   - `update_pending`: The load balancer is being updated
//     to the requested configuration.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerProvisioningStatusActiveConst             = "active"
	LoadBalancerProvisioningStatusCreatePendingConst      = "create_pending"
	LoadBalancerProvisioningStatusDeletePendingConst      = "delete_pending"
	LoadBalancerProvisioningStatusFailedConst             = "failed"
	LoadBalancerProvisioningStatusMaintenancePendingConst = "maintenance_pending"
	LoadBalancerProvisioningStatusMigratePendingConst     = "migrate_pending"
	LoadBalancerProvisioningStatusUpdatePendingConst      = "update_pending"
)

// Constants associated with the LoadBalancer.ResourceType property.
// The resource type.
const (
	LoadBalancerResourceTypeLoadBalancerConst = "load_balancer"
)

// UnmarshalLoadBalancer unmarshals an instance of LoadBalancer from the specified map of raw messages.
func UnmarshalLoadBalancer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancer)
	err = core.UnmarshalPrimitive(m, "access_mode", &obj.AccessMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "attached_load_balancer_pool_members", &obj.AttachedLoadBalancerPoolMembers, UnmarshalLoadBalancerPoolMemberReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "attached_load_balancer_pool_members-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "availability", &obj.Availability)
	if err != nil {
		err = core.SDKErrorf(err, "", "availability-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "dns", &obj.Dns, UnmarshalLoadBalancerDns)
	if err != nil {
		err = core.SDKErrorf(err, "", "dns-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "failsafe_policy_actions", &obj.FailsafePolicyActions)
	if err != nil {
		err = core.SDKErrorf(err, "", "failsafe_policy_actions-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "hostname", &obj.Hostname)
	if err != nil {
		err = core.SDKErrorf(err, "", "hostname-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance_groups_supported", &obj.InstanceGroupsSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_groups_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "is_private_path", &obj.IsPrivatePath)
	if err != nil {
		err = core.SDKErrorf(err, "", "is_private_path-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "is_public", &obj.IsPublic)
	if err != nil {
		err = core.SDKErrorf(err, "", "is_public-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listeners", &obj.Listeners, UnmarshalLoadBalancerListenerReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "listeners-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "logging", &obj.Logging, UnmarshalLoadBalancerLogging)
	if err != nil {
		err = core.SDKErrorf(err, "", "logging-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "operating_status", &obj.OperatingStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "operating_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "pools", &obj.Pools, UnmarshalLoadBalancerPoolReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "pools-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "private_ips", &obj.PrivateIps, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "private_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalLoadBalancerProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisioning_status", &obj.ProvisioningStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisioning_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_ips", &obj.PublicIps, UnmarshalIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_mode", &obj.RouteMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "security_groups_supported", &obj.SecurityGroupsSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_ip_session_persistence_supported", &obj.SourceIPSessionPersistenceSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_ip_session_persistence_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "udp_supported", &obj.UDPSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "udp_supported-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerCollection : LoadBalancerCollection struct
type LoadBalancerCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A page of load balancers.
	LoadBalancers []LoadBalancer `json:"load_balancers" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalLoadBalancerCollection unmarshals an instance of LoadBalancerCollection from the specified map of raw messages.
func UnmarshalLoadBalancerCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "load_balancers", &obj.LoadBalancers, UnmarshalLoadBalancer)
	if err != nil {
		err = core.SDKErrorf(err, "", "load_balancers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *LoadBalancerCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// LoadBalancerDns : The DNS configuration for this load balancer.
//
// If absent, DNS `A` records for this load balancer's `hostname` property will be added to the public DNS zone
// `lb.appdomain.cloud`.
//
// Not supported by private path load balancers.
type LoadBalancerDns struct {
	// The DNS instance associated with this load balancer.
	Instance *DnsInstanceReferenceLoadBalancerDnsContext `json:"instance" validate:"required"`

	// The DNS zone associated with this load balancer.
	Zone *DnsZoneReference `json:"zone" validate:"required"`
}

// UnmarshalLoadBalancerDns unmarshals an instance of LoadBalancerDns from the specified map of raw messages.
func UnmarshalLoadBalancerDns(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerDns)
	err = core.UnmarshalModel(m, "instance", &obj.Instance, UnmarshalDnsInstanceReferenceLoadBalancerDnsContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalDnsZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerDnsPatch : The DNS configuration for this load balancer.
//
// Specify `null` to remove the existing DNS configuration, which will remove all DNS `A` records for this load balancer
// that had been added to `zone`, and add equivalent `A` records to the public DNS zone `lb.appdomain.cloud`.
//
// Not supported by private path load balancers.
type LoadBalancerDnsPatch struct {
	// The DNS instance to associate with this load balancer.
	//
	// The specified instance may be in a different region or account, subject to IAM
	// policies.
	Instance DnsInstanceIdentityIntf `json:"instance,omitempty"`

	// The DNS zone to associate with this load balancer.
	//
	// The specified zone may be in a different region or account, subject to IAM policies.
	Zone DnsZoneIdentityIntf `json:"zone,omitempty"`
}

// UnmarshalLoadBalancerDnsPatch unmarshals an instance of LoadBalancerDnsPatch from the specified map of raw messages.
func UnmarshalLoadBalancerDnsPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerDnsPatch)
	err = core.UnmarshalModel(m, "instance", &obj.Instance, UnmarshalDnsInstanceIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalDnsZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerDnsPatch
func (loadBalancerDnsPatch *LoadBalancerDnsPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerDnsPatch.Instance) {
		_patch["instance"] = loadBalancerDnsPatch.Instance.asPatch()
	}
	if !core.IsNil(loadBalancerDnsPatch.Zone) {
		_patch["zone"] = loadBalancerDnsPatch.Zone.asPatch()
	}

	return
}

// LoadBalancerDnsPrototype : The DNS configuration for this load balancer.
//
// If unspecified, DNS `A` records for this load balancer's `hostname` property will be added to the public DNS zone
// `lb.appdomain.cloud`. Otherwise, those DNS `A` records will be added to the specified `zone`.
//
// Not supported by private path load balancers.
type LoadBalancerDnsPrototype struct {
	// The DNS instance to associate with this load balancer.
	//
	// The specified instance may be in a different region or account, subject to IAM
	// policies.
	Instance DnsInstanceIdentityIntf `json:"instance" validate:"required"`

	// The DNS zone to associate with this load balancer.
	//
	// The specified zone may be in a different region or account, subject to IAM policies.
	Zone DnsZoneIdentityIntf `json:"zone" validate:"required"`
}

// NewLoadBalancerDnsPrototype : Instantiate LoadBalancerDnsPrototype (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerDnsPrototype(instance DnsInstanceIdentityIntf, zone DnsZoneIdentityIntf) (_model *LoadBalancerDnsPrototype, err error) {
	_model = &LoadBalancerDnsPrototype{
		Instance: instance,
		Zone:     zone,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerDnsPrototype unmarshals an instance of LoadBalancerDnsPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerDnsPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerDnsPrototype)
	err = core.UnmarshalModel(m, "instance", &obj.Instance, UnmarshalDnsInstanceIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalDnsZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerIdentity : Identifies a load balancer by a unique property.
// Models which "extend" this model:
// - LoadBalancerIdentityByID
// - LoadBalancerIdentityByCRN
// - LoadBalancerIdentityByHref
type LoadBalancerIdentity struct {
	// The unique identifier for this load balancer.
	ID *string `json:"id,omitempty"`

	// The CRN for this load balancer.
	CRN *string `json:"crn,omitempty"`

	// The URL for this load balancer.
	Href *string `json:"href,omitempty"`
}

func (*LoadBalancerIdentity) isaLoadBalancerIdentity() bool {
	return true
}

type LoadBalancerIdentityIntf interface {
	isaLoadBalancerIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerIdentity unmarshals an instance of LoadBalancerIdentity from the specified map of raw messages.
func UnmarshalLoadBalancerIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerIdentity
func (loadBalancerIdentity *LoadBalancerIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerIdentity.ID) {
		_patch["id"] = loadBalancerIdentity.ID
	}
	if !core.IsNil(loadBalancerIdentity.CRN) {
		_patch["crn"] = loadBalancerIdentity.CRN
	}
	if !core.IsNil(loadBalancerIdentity.Href) {
		_patch["href"] = loadBalancerIdentity.Href
	}

	return
}

// LoadBalancerListener : LoadBalancerListener struct
type LoadBalancerListener struct {
	// If set to `true`, this listener will accept and forward PROXY protocol information. Supported by load balancers in
	// the `application` family (otherwise always `false`). Additional restrictions:
	// - If this listener has `https_redirect` specified, its `accept_proxy_protocol` value must
	//   match the `accept_proxy_protocol` value of the `https_redirect` listener.
	// - If this listener is the target of another listener's `https_redirect`, its
	//   `accept_proxy_protocol` value must match that listener's `accept_proxy_protocol` value.
	AcceptProxyProtocol *bool `json:"accept_proxy_protocol" validate:"required"`

	// The certificate instance used for SSL termination.
	//
	// If absent, this listener is not using a certificate instance.
	CertificateInstance *CertificateInstanceReference `json:"certificate_instance,omitempty"`

	// The concurrent connection limit for the listener. If reached, incoming connections may be queued or rejected.
	//
	// This property will be present for load balancers in the `application` family.
	ConnectionLimit *int64 `json:"connection_limit,omitempty"`

	// The date and time that this listener was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The default pool for this listener. If absent, this listener has no default pool.
	//
	// If `https_redirect` is set, the default pool will not be used.
	DefaultPool *LoadBalancerPoolReference `json:"default_pool,omitempty"`

	// The URL for this load balancer listener.
	Href *string `json:"href" validate:"required"`

	// If present, the target listener that requests are redirected to if none of the
	// listener's `policies` match.
	HTTPSRedirect *LoadBalancerListenerHTTPSRedirect `json:"https_redirect,omitempty"`

	// The unique identifier for this load balancer listener.
	ID *string `json:"id" validate:"required"`

	// The idle connection timeout of the listener in seconds.
	//
	// This property will be present for load balancers in the `application` family.
	IdleConnectionTimeout *int64 `json:"idle_connection_timeout,omitempty"`

	// The policies for this listener.
	Policies []LoadBalancerListenerPolicyReference `json:"policies,omitempty"`

	// The listener port number, or the inclusive lower bound of the port range.
	Port *int64 `json:"port" validate:"required"`

	// The inclusive upper bound of the range of ports used by this listener.
	PortMax *int64 `json:"port_max" validate:"required"`

	// The inclusive lower bound of the range of ports used by this listener.
	PortMin *int64 `json:"port_min" validate:"required"`

	// The listener protocol.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Protocol *string `json:"protocol" validate:"required"`

	// The provisioning status of this listener
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProvisioningStatus *string `json:"provisioning_status" validate:"required"`
}

// Constants associated with the LoadBalancerListener.Protocol property.
// The listener protocol.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerProtocolHTTPConst  = "http"
	LoadBalancerListenerProtocolHTTPSConst = "https"
	LoadBalancerListenerProtocolTCPConst   = "tcp"
	LoadBalancerListenerProtocolUDPConst   = "udp"
)

// Constants associated with the LoadBalancerListener.ProvisioningStatus property.
// The provisioning status of this listener
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerProvisioningStatusActiveConst        = "active"
	LoadBalancerListenerProvisioningStatusCreatePendingConst = "create_pending"
	LoadBalancerListenerProvisioningStatusDeletePendingConst = "delete_pending"
	LoadBalancerListenerProvisioningStatusFailedConst        = "failed"
	LoadBalancerListenerProvisioningStatusUpdatePendingConst = "update_pending"
)

// UnmarshalLoadBalancerListener unmarshals an instance of LoadBalancerListener from the specified map of raw messages.
func UnmarshalLoadBalancerListener(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListener)
	err = core.UnmarshalPrimitive(m, "accept_proxy_protocol", &obj.AcceptProxyProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "accept_proxy_protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "certificate_instance", &obj.CertificateInstance, UnmarshalCertificateInstanceReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "certificate_instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "connection_limit", &obj.ConnectionLimit)
	if err != nil {
		err = core.SDKErrorf(err, "", "connection_limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_pool", &obj.DefaultPool, UnmarshalLoadBalancerPoolReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_pool-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "https_redirect", &obj.HTTPSRedirect, UnmarshalLoadBalancerListenerHTTPSRedirect)
	if err != nil {
		err = core.SDKErrorf(err, "", "https_redirect-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "idle_connection_timeout", &obj.IdleConnectionTimeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "idle_connection_timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "policies", &obj.Policies, UnmarshalLoadBalancerListenerPolicyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_max", &obj.PortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_min", &obj.PortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisioning_status", &obj.ProvisioningStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisioning_status-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerCollection : LoadBalancerListenerCollection struct
type LoadBalancerListenerCollection struct {
	// The listeners for the load balancer.
	Listeners []LoadBalancerListener `json:"listeners" validate:"required"`
}

// UnmarshalLoadBalancerListenerCollection unmarshals an instance of LoadBalancerListenerCollection from the specified map of raw messages.
func UnmarshalLoadBalancerListenerCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerCollection)
	err = core.UnmarshalModel(m, "listeners", &obj.Listeners, UnmarshalLoadBalancerListener)
	if err != nil {
		err = core.SDKErrorf(err, "", "listeners-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerDefaultPoolPatch : The default pool for this listener. If `https_redirect` is set, the default pool will not be used. The specified pool
// must:
//
//   - Belong to this load balancer
//   - Have the same `protocol` as this listener, or have a compatible protocol.
//     At present, the compatible protocols are `http` and `https`.
//   - Not already be the `default_pool` for another listener
//
// Specify `null` to remove an existing default pool.
// Models which "extend" this model:
// - LoadBalancerListenerDefaultPoolPatchLoadBalancerPoolIdentityByID
// - LoadBalancerListenerDefaultPoolPatchLoadBalancerPoolIdentityByHref
type LoadBalancerListenerDefaultPoolPatch struct {
	// The unique identifier for this load balancer pool.
	ID *string `json:"id,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href,omitempty"`
}

func (*LoadBalancerListenerDefaultPoolPatch) isaLoadBalancerListenerDefaultPoolPatch() bool {
	return true
}

type LoadBalancerListenerDefaultPoolPatchIntf interface {
	isaLoadBalancerListenerDefaultPoolPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerListenerDefaultPoolPatch unmarshals an instance of LoadBalancerListenerDefaultPoolPatch from the specified map of raw messages.
func UnmarshalLoadBalancerListenerDefaultPoolPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerDefaultPoolPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerListenerDefaultPoolPatch
func (loadBalancerListenerDefaultPoolPatch *LoadBalancerListenerDefaultPoolPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerDefaultPoolPatch.ID) {
		_patch["id"] = loadBalancerListenerDefaultPoolPatch.ID
	}
	if !core.IsNil(loadBalancerListenerDefaultPoolPatch.Href) {
		_patch["href"] = loadBalancerListenerDefaultPoolPatch.Href
	}

	return
}

// LoadBalancerListenerHTTPSRedirect : LoadBalancerListenerHTTPSRedirect struct
type LoadBalancerListenerHTTPSRedirect struct {
	// The HTTP status code for this redirect.
	HTTPStatusCode *int64 `json:"http_status_code" validate:"required"`

	Listener *LoadBalancerListenerReference `json:"listener" validate:"required"`

	// The redirect relative target URI.
	URI *string `json:"uri,omitempty"`
}

// UnmarshalLoadBalancerListenerHTTPSRedirect unmarshals an instance of LoadBalancerListenerHTTPSRedirect from the specified map of raw messages.
func UnmarshalLoadBalancerListenerHTTPSRedirect(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerHTTPSRedirect)
	err = core.UnmarshalPrimitive(m, "http_status_code", &obj.HTTPStatusCode)
	if err != nil {
		err = core.SDKErrorf(err, "", "http_status_code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listener", &obj.Listener, UnmarshalLoadBalancerListenerReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "listener-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uri", &obj.URI)
	if err != nil {
		err = core.SDKErrorf(err, "", "uri-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerHTTPSRedirectPatch : LoadBalancerListenerHTTPSRedirectPatch struct
type LoadBalancerListenerHTTPSRedirectPatch struct {
	// The HTTP status code for this redirect.
	HTTPStatusCode *int64 `json:"http_status_code,omitempty"`

	// The target listener.
	//
	// The target listener must be in this load balancer, and must not be the same as the
	// listener in the URL.
	Listener LoadBalancerListenerIdentityIntf `json:"listener,omitempty"`

	// The redirect relative target URI.
	URI *string `json:"uri,omitempty"`
}

// UnmarshalLoadBalancerListenerHTTPSRedirectPatch unmarshals an instance of LoadBalancerListenerHTTPSRedirectPatch from the specified map of raw messages.
func UnmarshalLoadBalancerListenerHTTPSRedirectPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerHTTPSRedirectPatch)
	err = core.UnmarshalPrimitive(m, "http_status_code", &obj.HTTPStatusCode)
	if err != nil {
		err = core.SDKErrorf(err, "", "http_status_code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listener", &obj.Listener, UnmarshalLoadBalancerListenerIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "listener-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uri", &obj.URI)
	if err != nil {
		err = core.SDKErrorf(err, "", "uri-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerListenerHTTPSRedirectPatch
func (loadBalancerListenerHTTPSRedirectPatch *LoadBalancerListenerHTTPSRedirectPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerHTTPSRedirectPatch.HTTPStatusCode) {
		_patch["http_status_code"] = loadBalancerListenerHTTPSRedirectPatch.HTTPStatusCode
	}
	if !core.IsNil(loadBalancerListenerHTTPSRedirectPatch.Listener) {
		_patch["listener"] = loadBalancerListenerHTTPSRedirectPatch.Listener.asPatch()
	}
	if !core.IsNil(loadBalancerListenerHTTPSRedirectPatch.URI) {
		_patch["uri"] = loadBalancerListenerHTTPSRedirectPatch.URI
	}

	return
}

// LoadBalancerListenerHTTPSRedirectPrototype : LoadBalancerListenerHTTPSRedirectPrototype struct
type LoadBalancerListenerHTTPSRedirectPrototype struct {
	// The HTTP status code for this redirect.
	HTTPStatusCode *int64 `json:"http_status_code" validate:"required"`

	// The target listener.
	//
	// The target listener must be in this load balancer, and must not be the same as the
	// listener in the URL.
	Listener LoadBalancerListenerIdentityIntf `json:"listener" validate:"required"`

	// The redirect relative target URI.
	URI *string `json:"uri,omitempty"`
}

// NewLoadBalancerListenerHTTPSRedirectPrototype : Instantiate LoadBalancerListenerHTTPSRedirectPrototype (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerListenerHTTPSRedirectPrototype(httpStatusCode int64, listener LoadBalancerListenerIdentityIntf) (_model *LoadBalancerListenerHTTPSRedirectPrototype, err error) {
	_model = &LoadBalancerListenerHTTPSRedirectPrototype{
		HTTPStatusCode: core.Int64Ptr(httpStatusCode),
		Listener:       listener,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerListenerHTTPSRedirectPrototype unmarshals an instance of LoadBalancerListenerHTTPSRedirectPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerListenerHTTPSRedirectPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerHTTPSRedirectPrototype)
	err = core.UnmarshalPrimitive(m, "http_status_code", &obj.HTTPStatusCode)
	if err != nil {
		err = core.SDKErrorf(err, "", "http_status_code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listener", &obj.Listener, UnmarshalLoadBalancerListenerIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "listener-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uri", &obj.URI)
	if err != nil {
		err = core.SDKErrorf(err, "", "uri-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerIdentity : Identifies a load balancer listener by a unique property.
// Models which "extend" this model:
// - LoadBalancerListenerIdentityByID
// - LoadBalancerListenerIdentityByHref
type LoadBalancerListenerIdentity struct {
	// The unique identifier for this load balancer listener.
	ID *string `json:"id,omitempty"`

	// The URL for this load balancer listener.
	Href *string `json:"href,omitempty"`
}

func (*LoadBalancerListenerIdentity) isaLoadBalancerListenerIdentity() bool {
	return true
}

type LoadBalancerListenerIdentityIntf interface {
	isaLoadBalancerListenerIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerListenerIdentity unmarshals an instance of LoadBalancerListenerIdentity from the specified map of raw messages.
func UnmarshalLoadBalancerListenerIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerListenerIdentity
func (loadBalancerListenerIdentity *LoadBalancerListenerIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerIdentity.ID) {
		_patch["id"] = loadBalancerListenerIdentity.ID
	}
	if !core.IsNil(loadBalancerListenerIdentity.Href) {
		_patch["href"] = loadBalancerListenerIdentity.Href
	}

	return
}

// LoadBalancerListenerPatch : LoadBalancerListenerPatch struct
type LoadBalancerListenerPatch struct {
	// If set to `true`, this listener will accept and forward PROXY protocol information. Supported by load balancers in
	// the `application` family (otherwise always `false`). Additional restrictions:
	// - If this listener has `https_redirect` specified, its `accept_proxy_protocol` value must
	//   match the `accept_proxy_protocol` value of the `https_redirect` listener.
	// - If this listener is the target of another listener's `https_redirect`, its
	//   `accept_proxy_protocol` value must match that listener's `accept_proxy_protocol` value.
	AcceptProxyProtocol *bool `json:"accept_proxy_protocol,omitempty"`

	// The certificate instance to use for SSL termination. The listener must have a
	// `protocol` of `https`.
	CertificateInstance CertificateInstanceIdentityIntf `json:"certificate_instance,omitempty"`

	// The concurrent connection limit for the listener. If reached, incoming connections may be queued or rejected.
	//
	// Supported for load balancers in the `application` family.
	ConnectionLimit *int64 `json:"connection_limit,omitempty"`

	// The default pool for this listener. If `https_redirect` is set, the default pool will not
	// be used. The specified pool must:
	//
	// - Belong to this load balancer
	// - Have the same `protocol` as this listener, or have a compatible protocol.
	//   At present, the compatible protocols are `http` and `https`.
	// - Not already be the `default_pool` for another listener
	//
	// Specify `null` to remove an existing default pool.
	DefaultPool LoadBalancerListenerDefaultPoolPatchIntf `json:"default_pool,omitempty"`

	// The target listener that requests will be redirected to if none of the listener's
	// `policies` match.
	//
	// If specified, this listener must have a `protocol` of `http`, and the target listener
	// must have a `protocol` of `https`.
	//
	// Specify `null` to remove any existing https redirect.
	HTTPSRedirect *LoadBalancerListenerHTTPSRedirectPatch `json:"https_redirect,omitempty"`

	// The idle connection timeout of the listener in seconds.
	//
	// Supported for load balancers in the `application` family.
	IdleConnectionTimeout *int64 `json:"idle_connection_timeout,omitempty"`

	// The inclusive lower bound of the range of ports used by this listener. Must not be greater than `port_max`. Updating
	// `port` updates `port_min` to the same value.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `1`.
	//
	// Each listener in the load balancer must have a non-overlapping port range and
	// `protocol` combination. Protocol values of `tcp`, `http` and `https` share the TCP port space.
	Port *int64 `json:"port,omitempty"`

	// The inclusive upper bound of the range of ports used by this listener. Must not be less than `port_min`.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `65535`.
	//
	// The specified port range must not overlap with port ranges used by other listeners for this load balancer using the
	// same protocol. Protocol values of `tcp`, `http` and
	// `https` share the TCP port space.
	PortMax *int64 `json:"port_max,omitempty"`

	// The inclusive lower bound of the range of ports used by this listener. Must not be greater than `port_max`. Updating
	// `port_min` updates `port` to the same value.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `1`.
	//
	// Each listener in the load balancer must have a non-overlapping port range and
	// `protocol` combination.
	PortMin *int64 `json:"port_min,omitempty"`

	// The listener protocol. Each listener in the load balancer must have a non-overlapping port range and `protocol`
	// combination.
	//
	// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
	// `application` family support `tcp`, `http` and
	// `https`.
	//
	// Additional restrictions:
	// - If `default_pool` is set, the protocol cannot be changed.
	// - If `https_redirect` is set, the protocol must be `http`.
	// - If another listener's `https_redirect` targets this listener, the protocol must be
	// `https`.
	Protocol *string `json:"protocol,omitempty"`
}

// Constants associated with the LoadBalancerListenerPatch.Protocol property.
// The listener protocol. Each listener in the load balancer must have a non-overlapping port range and `protocol`
// combination.
//
// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
// `application` family support `tcp`, `http` and
// `https`.
//
// Additional restrictions:
// - If `default_pool` is set, the protocol cannot be changed.
// - If `https_redirect` is set, the protocol must be `http`.
// - If another listener's `https_redirect` targets this listener, the protocol must be
// `https`.
const (
	LoadBalancerListenerPatchProtocolHTTPConst  = "http"
	LoadBalancerListenerPatchProtocolHTTPSConst = "https"
	LoadBalancerListenerPatchProtocolTCPConst   = "tcp"
	LoadBalancerListenerPatchProtocolUDPConst   = "udp"
)

// UnmarshalLoadBalancerListenerPatch unmarshals an instance of LoadBalancerListenerPatch from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPatch)
	err = core.UnmarshalPrimitive(m, "accept_proxy_protocol", &obj.AcceptProxyProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "accept_proxy_protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "certificate_instance", &obj.CertificateInstance, UnmarshalCertificateInstanceIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "certificate_instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "connection_limit", &obj.ConnectionLimit)
	if err != nil {
		err = core.SDKErrorf(err, "", "connection_limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_pool", &obj.DefaultPool, UnmarshalLoadBalancerListenerDefaultPoolPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_pool-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "https_redirect", &obj.HTTPSRedirect, UnmarshalLoadBalancerListenerHTTPSRedirectPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "https_redirect-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "idle_connection_timeout", &obj.IdleConnectionTimeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "idle_connection_timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_max", &obj.PortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_min", &obj.PortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the LoadBalancerListenerPatch
func (loadBalancerListenerPatch *LoadBalancerListenerPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerPatch.AcceptProxyProtocol) {
		_patch["accept_proxy_protocol"] = loadBalancerListenerPatch.AcceptProxyProtocol
	}
	if !core.IsNil(loadBalancerListenerPatch.CertificateInstance) {
		_patch["certificate_instance"] = loadBalancerListenerPatch.CertificateInstance.asPatch()
	}
	if !core.IsNil(loadBalancerListenerPatch.ConnectionLimit) {
		_patch["connection_limit"] = loadBalancerListenerPatch.ConnectionLimit
	}
	if !core.IsNil(loadBalancerListenerPatch.DefaultPool) {
		_patch["default_pool"] = loadBalancerListenerPatch.DefaultPool.asPatch()
	}
	if !core.IsNil(loadBalancerListenerPatch.HTTPSRedirect) {
		_patch["https_redirect"] = loadBalancerListenerPatch.HTTPSRedirect.asPatch()
	}
	if !core.IsNil(loadBalancerListenerPatch.IdleConnectionTimeout) {
		_patch["idle_connection_timeout"] = loadBalancerListenerPatch.IdleConnectionTimeout
	}
	if !core.IsNil(loadBalancerListenerPatch.Port) {
		_patch["port"] = loadBalancerListenerPatch.Port
	}
	if !core.IsNil(loadBalancerListenerPatch.PortMax) {
		_patch["port_max"] = loadBalancerListenerPatch.PortMax
	}
	if !core.IsNil(loadBalancerListenerPatch.PortMin) {
		_patch["port_min"] = loadBalancerListenerPatch.PortMin
	}
	if !core.IsNil(loadBalancerListenerPatch.Protocol) {
		_patch["protocol"] = loadBalancerListenerPatch.Protocol
	}

	return
}

// LoadBalancerListenerPolicy : LoadBalancerListenerPolicy struct
type LoadBalancerListenerPolicy struct {
	// The policy action:
	// - `forward_to_listener`: Requests will be forwarded to the specified `target`
	//   listener
	// - `forward_to_pool`: Requests will be forwarded to the specified `target` pool
	// - `https_redirect`: Requests will be redirected to the specified `target` listener.
	//   The listener must have a `protocol` of `http`, and the target listener must have a
	//   `protocol` of `https`
	// - `redirect`: Requests will be redirected to the specified `target.url`
	// - `reject`: Requests will be rejected with a `403` status code
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Action *string `json:"action" validate:"required"`

	// The date and time that this policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this load balancer policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer policy.
	ID *string `json:"id" validate:"required"`

	// The name for this load balancer listener policy. The name is unique across all policies for the load balancer
	// listener.
	Name *string `json:"name" validate:"required"`

	// The priority of the policy. The priority is unique across all policies for this load balancer listener. Lower value
	// indicates higher priority.
	Priority *int64 `json:"priority" validate:"required"`

	// The provisioning status of this policy
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProvisioningStatus *string `json:"provisioning_status" validate:"required"`

	// The rules for this policy.
	Rules []LoadBalancerListenerPolicyRuleReference `json:"rules" validate:"required"`

	// - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity`
	// - If `action` is `forward_to_pool`, specify a `LoadBalancerPoolIdentity`
	// - If `action` is `https_redirect`, the response is a
	// `LoadBalancerListenerPolicyHTTPSRedirect`
	// - If `action` is `redirect`, the response is a `LoadBalancerListenerPolicyRedirectURL`.
	Target LoadBalancerListenerPolicyTargetIntf `json:"target,omitempty"`
}

// Constants associated with the LoadBalancerListenerPolicy.Action property.
// The policy action:
//   - `forward_to_listener`: Requests will be forwarded to the specified `target`
//     listener
//   - `forward_to_pool`: Requests will be forwarded to the specified `target` pool
//   - `https_redirect`: Requests will be redirected to the specified `target` listener.
//     The listener must have a `protocol` of `http`, and the target listener must have a
//     `protocol` of `https`
//   - `redirect`: Requests will be redirected to the specified `target.url`
//   - `reject`: Requests will be rejected with a `403` status code
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerPolicyActionForwardToListenerConst = "forward_to_listener"
	LoadBalancerListenerPolicyActionForwardToPoolConst     = "forward_to_pool"
	LoadBalancerListenerPolicyActionHTTPSRedirectConst     = "https_redirect"
	LoadBalancerListenerPolicyActionRedirectConst          = "redirect"
	LoadBalancerListenerPolicyActionRejectConst            = "reject"
)

// Constants associated with the LoadBalancerListenerPolicy.ProvisioningStatus property.
// The provisioning status of this policy
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerPolicyProvisioningStatusActiveConst        = "active"
	LoadBalancerListenerPolicyProvisioningStatusCreatePendingConst = "create_pending"
	LoadBalancerListenerPolicyProvisioningStatusDeletePendingConst = "delete_pending"
	LoadBalancerListenerPolicyProvisioningStatusFailedConst        = "failed"
	LoadBalancerListenerPolicyProvisioningStatusUpdatePendingConst = "update_pending"
)

// UnmarshalLoadBalancerListenerPolicy unmarshals an instance of LoadBalancerListenerPolicy from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicy)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "priority", &obj.Priority)
	if err != nil {
		err = core.SDKErrorf(err, "", "priority-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisioning_status", &obj.ProvisioningStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisioning_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalLoadBalancerListenerPolicyRuleReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerListenerPolicyTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyCollection : LoadBalancerListenerPolicyCollection struct
type LoadBalancerListenerPolicyCollection struct {
	// The policies for the load balancer listener.
	Policies []LoadBalancerListenerPolicy `json:"policies" validate:"required"`
}

// UnmarshalLoadBalancerListenerPolicyCollection unmarshals an instance of LoadBalancerListenerPolicyCollection from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyCollection)
	err = core.UnmarshalModel(m, "policies", &obj.Policies, UnmarshalLoadBalancerListenerPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "policies-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyPatch : LoadBalancerListenerPolicyPatch struct
type LoadBalancerListenerPolicyPatch struct {
	// The name for this policy. The name must not be used by another policy for the load balancer listener.
	Name *string `json:"name,omitempty"`

	// The priority of the policy. The priority is unique across all policies for this load balancer listener. Lower value
	// indicates higher priority.
	Priority *int64 `json:"priority,omitempty"`

	// - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity` for a
	//   listener in this load balancer.
	// - If `action` is `forward_to_pool`, specify a `LoadBalancerPoolIdentity` for a pool in
	//   this load balancer.
	// - If `action` is `https_redirect`, specify a
	//   `LoadBalancerListenerPolicyHTTPSRedirectPatch` for a listener in this load balancer
	//   with a `protocol` of `https`.
	// - If `action` is `redirect`, specify a `LoadBalancerListenerPolicyRedirectURLPatch`.
	Target LoadBalancerListenerPolicyTargetPatchIntf `json:"target,omitempty"`
}

// UnmarshalLoadBalancerListenerPolicyPatch unmarshals an instance of LoadBalancerListenerPolicyPatch from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "priority", &obj.Priority)
	if err != nil {
		err = core.SDKErrorf(err, "", "priority-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerListenerPolicyTargetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the LoadBalancerListenerPolicyPatch
func (loadBalancerListenerPolicyPatch *LoadBalancerListenerPolicyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerPolicyPatch.Name) {
		_patch["name"] = loadBalancerListenerPolicyPatch.Name
	}
	if !core.IsNil(loadBalancerListenerPolicyPatch.Priority) {
		_patch["priority"] = loadBalancerListenerPolicyPatch.Priority
	}
	if !core.IsNil(loadBalancerListenerPolicyPatch.Target) {
		_patch["target"] = loadBalancerListenerPolicyPatch.Target.asPatch()
	}

	return
}

// LoadBalancerListenerPolicyPrototype : LoadBalancerListenerPolicyPrototype struct
type LoadBalancerListenerPolicyPrototype struct {
	// The policy action:
	// - `forward_to_listener`: Requests will be forwarded to the specified
	//   `target` listener.
	// - `forward_to_pool`: Requests will be forwarded to the specified `target` pool.
	// - `https_redirect`: Requests will be redirected to the specified `target.listener`.
	//    This listener must have a `protocol` of `http`, and the target listener must
	//    have a `protocol` of `https`.
	// - `redirect`: Requests will be redirected to the specified `target.url`
	// - `reject`: Requests will be rejected with a `403` status code.
	Action *string `json:"action" validate:"required"`

	// The name for this policy. The name must not be used by another policy for the load balancer listener. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The priority of the policy. The priority is unique across all policies for this load balancer listener. Lower value
	// indicates higher priority.
	Priority *int64 `json:"priority" validate:"required"`

	// The rule prototype objects for this policy.
	Rules []LoadBalancerListenerPolicyRulePrototype `json:"rules,omitempty"`

	// - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity` in this
	//   load balancer to forward to.
	// - If `action` is `forward_to_pool`, use `LoadBalancerPoolIdentity` to specify a pool in
	//   this load balancer to forward to.
	// - If `action` is `https_redirect`, use
	//   `LoadBalancerListenerPolicyHTTPSRedirectPrototype` to specify a listener on this
	//   load balancer to redirect to.
	// - If `action` is `redirect`, use `LoadBalancerListenerPolicyRedirectURLPrototype`to
	//   specify a URL to redirect to.
	Target LoadBalancerListenerPolicyTargetPrototypeIntf `json:"target,omitempty"`
}

// Constants associated with the LoadBalancerListenerPolicyPrototype.Action property.
// The policy action:
//   - `forward_to_listener`: Requests will be forwarded to the specified
//     `target` listener.
//   - `forward_to_pool`: Requests will be forwarded to the specified `target` pool.
//   - `https_redirect`: Requests will be redirected to the specified `target.listener`.
//     This listener must have a `protocol` of `http`, and the target listener must
//     have a `protocol` of `https`.
//   - `redirect`: Requests will be redirected to the specified `target.url`
//   - `reject`: Requests will be rejected with a `403` status code.
const (
	LoadBalancerListenerPolicyPrototypeActionForwardToListenerConst = "forward_to_listener"
	LoadBalancerListenerPolicyPrototypeActionForwardToPoolConst     = "forward_to_pool"
	LoadBalancerListenerPolicyPrototypeActionHTTPSRedirectConst     = "https_redirect"
	LoadBalancerListenerPolicyPrototypeActionRedirectConst          = "redirect"
	LoadBalancerListenerPolicyPrototypeActionRejectConst            = "reject"
)

// NewLoadBalancerListenerPolicyPrototype : Instantiate LoadBalancerListenerPolicyPrototype (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerListenerPolicyPrototype(action string, priority int64) (_model *LoadBalancerListenerPolicyPrototype, err error) {
	_model = &LoadBalancerListenerPolicyPrototype{
		Action:   core.StringPtr(action),
		Priority: core.Int64Ptr(priority),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerListenerPolicyPrototype unmarshals an instance of LoadBalancerListenerPolicyPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyPrototype)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "priority", &obj.Priority)
	if err != nil {
		err = core.SDKErrorf(err, "", "priority-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalLoadBalancerListenerPolicyRulePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerListenerPolicyTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyReference : LoadBalancerListenerPolicyReference struct
type LoadBalancerListenerPolicyReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer policy.
	ID *string `json:"id" validate:"required"`

	// The name for this load balancer listener policy. The name is unique across all policies for the load balancer
	// listener.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalLoadBalancerListenerPolicyReference unmarshals an instance of LoadBalancerListenerPolicyReference from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyRule : LoadBalancerListenerPolicyRule struct
type LoadBalancerListenerPolicyRule struct {
	// The condition for the rule.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Condition *string `json:"condition" validate:"required"`

	// The date and time that this rule was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The field to match for this rule. If `condition` is not `matches_regex`, the value is percent-encoded.
	Field *string `json:"field,omitempty"`

	// The URL for this load balancer listener policy rule.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer listener policy rule.
	ID *string `json:"id" validate:"required"`

	// The provisioning status of this rule
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProvisioningStatus *string `json:"provisioning_status" validate:"required"`

	// The type of the rule. Body rules are applied to form-encoded request bodies using the
	// `UTF-8` character set.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`

	// The value to be matched for the rule condition.
	//
	// If the rule type is `query` and the rule condition is not `matches_regex`, the value must be percent-encoded.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the LoadBalancerListenerPolicyRule.Condition property.
// The condition for the rule.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerPolicyRuleConditionContainsConst     = "contains"
	LoadBalancerListenerPolicyRuleConditionEqualsConst       = "equals"
	LoadBalancerListenerPolicyRuleConditionMatchesRegexConst = "matches_regex"
)

// Constants associated with the LoadBalancerListenerPolicyRule.ProvisioningStatus property.
// The provisioning status of this rule
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerPolicyRuleProvisioningStatusActiveConst        = "active"
	LoadBalancerListenerPolicyRuleProvisioningStatusCreatePendingConst = "create_pending"
	LoadBalancerListenerPolicyRuleProvisioningStatusDeletePendingConst = "delete_pending"
	LoadBalancerListenerPolicyRuleProvisioningStatusFailedConst        = "failed"
	LoadBalancerListenerPolicyRuleProvisioningStatusUpdatePendingConst = "update_pending"
)

// Constants associated with the LoadBalancerListenerPolicyRule.Type property.
// The type of the rule. Body rules are applied to form-encoded request bodies using the
// `UTF-8` character set.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerListenerPolicyRuleTypeBodyConst        = "body"
	LoadBalancerListenerPolicyRuleTypeHeaderConst      = "header"
	LoadBalancerListenerPolicyRuleTypeHostnameConst    = "hostname"
	LoadBalancerListenerPolicyRuleTypePathConst        = "path"
	LoadBalancerListenerPolicyRuleTypeQueryConst       = "query"
	LoadBalancerListenerPolicyRuleTypeSniHostnameConst = "sni_hostname"
)

// UnmarshalLoadBalancerListenerPolicyRule unmarshals an instance of LoadBalancerListenerPolicyRule from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyRule(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyRule)
	err = core.UnmarshalPrimitive(m, "condition", &obj.Condition)
	if err != nil {
		err = core.SDKErrorf(err, "", "condition-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "field", &obj.Field)
	if err != nil {
		err = core.SDKErrorf(err, "", "field-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisioning_status", &obj.ProvisioningStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisioning_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyRuleCollection : LoadBalancerListenerPolicyRuleCollection struct
type LoadBalancerListenerPolicyRuleCollection struct {
	// The rules for the load balancer listener policy.
	Rules []LoadBalancerListenerPolicyRule `json:"rules" validate:"required"`
}

// UnmarshalLoadBalancerListenerPolicyRuleCollection unmarshals an instance of LoadBalancerListenerPolicyRuleCollection from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyRuleCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyRuleCollection)
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalLoadBalancerListenerPolicyRule)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyRulePatch : LoadBalancerListenerPolicyRulePatch struct
type LoadBalancerListenerPolicyRulePatch struct {
	// The condition for the rule.
	Condition *string `json:"condition,omitempty"`

	// The field to match for this rule.
	// - If the `type` is `header`, this property must be specified.
	// - If the `type` is `body` or `query`, this property may be specified.
	// - For all other types, this property must not be specified.
	Field *string `json:"field,omitempty"`

	// The content the rule applies to:
	// - `body`: The UTF-8 form-encoded HTTP request body
	// - `header`: The HTTP header
	// - `hostname`: The fully-qualified domain name of the server specified in the Host
	//   HTTP request header
	// - `path`: The path of the HTTP request
	// - `query`: The query of the HTTP request URL
	// - `sni_hostname`: The fully-qualified domain name of the server provided in the
	//   "server name indicator" extension during TLS negotiation
	//
	// - For listeners with `protocol` `http` or `https`, any type may be specified.
	// - For listeners with `protocol` `tcp`, only type `sni_hostname` may be specified.
	Type *string `json:"type,omitempty"`

	// The value to be matched for the rule condition.
	//
	// If the rule type is `query` and the rule condition is not `matches_regex`, the value must be percent-encoded.
	Value *string `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerListenerPolicyRulePatch.Condition property.
// The condition for the rule.
const (
	LoadBalancerListenerPolicyRulePatchConditionContainsConst     = "contains"
	LoadBalancerListenerPolicyRulePatchConditionEqualsConst       = "equals"
	LoadBalancerListenerPolicyRulePatchConditionMatchesRegexConst = "matches_regex"
)

// Constants associated with the LoadBalancerListenerPolicyRulePatch.Type property.
// The content the rule applies to:
//   - `body`: The UTF-8 form-encoded HTTP request body
//   - `header`: The HTTP header
//   - `hostname`: The fully-qualified domain name of the server specified in the Host
//     HTTP request header
//   - `path`: The path of the HTTP request
//   - `query`: The query of the HTTP request URL
//   - `sni_hostname`: The fully-qualified domain name of the server provided in the
//     "server name indicator" extension during TLS negotiation
//
// - For listeners with `protocol` `http` or `https`, any type may be specified.
// - For listeners with `protocol` `tcp`, only type `sni_hostname` may be specified.
const (
	LoadBalancerListenerPolicyRulePatchTypeBodyConst        = "body"
	LoadBalancerListenerPolicyRulePatchTypeHeaderConst      = "header"
	LoadBalancerListenerPolicyRulePatchTypeHostnameConst    = "hostname"
	LoadBalancerListenerPolicyRulePatchTypePathConst        = "path"
	LoadBalancerListenerPolicyRulePatchTypeQueryConst       = "query"
	LoadBalancerListenerPolicyRulePatchTypeSniHostnameConst = "sni_hostname"
)

// UnmarshalLoadBalancerListenerPolicyRulePatch unmarshals an instance of LoadBalancerListenerPolicyRulePatch from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyRulePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyRulePatch)
	err = core.UnmarshalPrimitive(m, "condition", &obj.Condition)
	if err != nil {
		err = core.SDKErrorf(err, "", "condition-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "field", &obj.Field)
	if err != nil {
		err = core.SDKErrorf(err, "", "field-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the LoadBalancerListenerPolicyRulePatch
func (loadBalancerListenerPolicyRulePatch *LoadBalancerListenerPolicyRulePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerPolicyRulePatch.Condition) {
		_patch["condition"] = loadBalancerListenerPolicyRulePatch.Condition
	}
	if !core.IsNil(loadBalancerListenerPolicyRulePatch.Field) {
		_patch["field"] = loadBalancerListenerPolicyRulePatch.Field
	}
	if !core.IsNil(loadBalancerListenerPolicyRulePatch.Type) {
		_patch["type"] = loadBalancerListenerPolicyRulePatch.Type
	}
	if !core.IsNil(loadBalancerListenerPolicyRulePatch.Value) {
		_patch["value"] = loadBalancerListenerPolicyRulePatch.Value
	}

	return
}

// LoadBalancerListenerPolicyRulePrototype : LoadBalancerListenerPolicyRulePrototype struct
type LoadBalancerListenerPolicyRulePrototype struct {
	// The condition for the rule.
	Condition *string `json:"condition" validate:"required"`

	// The field to match for this rule.
	// - If the `type` is `header`, this property must be specified.
	// - If the `type` is `body` or `query`, this property may be specified.
	// - For all other types, this property must not be specified.
	Field *string `json:"field,omitempty"`

	// The content the rule applies to:
	// - `body`: The UTF-8 form-encoded HTTP request body
	// - `header`: The HTTP header
	// - `hostname`: The fully-qualified domain name of the server specified in the Host
	//   HTTP request header
	// - `path`: The path of the HTTP request
	// - `query`: The query of the HTTP request URL
	// - `sni_hostname`: The fully-qualified domain name of the server provided in the
	//   "server name indicator" extension during TLS negotiation
	//
	// - For listeners with `protocol` `http` or `https`, any type may be specified.
	// - For listeners with `protocol` `tcp`, only type `sni_hostname` may be specified.
	Type *string `json:"type" validate:"required"`

	// The value to be matched for the rule condition.
	//
	// If the rule type is `query` and the rule condition is not `matches_regex`, the value must be percent-encoded.
	Value *string `json:"value" validate:"required"`
}

// Constants associated with the LoadBalancerListenerPolicyRulePrototype.Condition property.
// The condition for the rule.
const (
	LoadBalancerListenerPolicyRulePrototypeConditionContainsConst     = "contains"
	LoadBalancerListenerPolicyRulePrototypeConditionEqualsConst       = "equals"
	LoadBalancerListenerPolicyRulePrototypeConditionMatchesRegexConst = "matches_regex"
)

// Constants associated with the LoadBalancerListenerPolicyRulePrototype.Type property.
// The content the rule applies to:
//   - `body`: The UTF-8 form-encoded HTTP request body
//   - `header`: The HTTP header
//   - `hostname`: The fully-qualified domain name of the server specified in the Host
//     HTTP request header
//   - `path`: The path of the HTTP request
//   - `query`: The query of the HTTP request URL
//   - `sni_hostname`: The fully-qualified domain name of the server provided in the
//     "server name indicator" extension during TLS negotiation
//
// - For listeners with `protocol` `http` or `https`, any type may be specified.
// - For listeners with `protocol` `tcp`, only type `sni_hostname` may be specified.
const (
	LoadBalancerListenerPolicyRulePrototypeTypeBodyConst        = "body"
	LoadBalancerListenerPolicyRulePrototypeTypeHeaderConst      = "header"
	LoadBalancerListenerPolicyRulePrototypeTypeHostnameConst    = "hostname"
	LoadBalancerListenerPolicyRulePrototypeTypePathConst        = "path"
	LoadBalancerListenerPolicyRulePrototypeTypeQueryConst       = "query"
	LoadBalancerListenerPolicyRulePrototypeTypeSniHostnameConst = "sni_hostname"
)

// NewLoadBalancerListenerPolicyRulePrototype : Instantiate LoadBalancerListenerPolicyRulePrototype (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerListenerPolicyRulePrototype(condition string, typeVar string, value string) (_model *LoadBalancerListenerPolicyRulePrototype, err error) {
	_model = &LoadBalancerListenerPolicyRulePrototype{
		Condition: core.StringPtr(condition),
		Type:      core.StringPtr(typeVar),
		Value:     core.StringPtr(value),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerListenerPolicyRulePrototype unmarshals an instance of LoadBalancerListenerPolicyRulePrototype from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyRulePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyRulePrototype)
	err = core.UnmarshalPrimitive(m, "condition", &obj.Condition)
	if err != nil {
		err = core.SDKErrorf(err, "", "condition-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "field", &obj.Field)
	if err != nil {
		err = core.SDKErrorf(err, "", "field-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyRuleReference : LoadBalancerListenerPolicyRuleReference struct
type LoadBalancerListenerPolicyRuleReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer listener policy rule.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer listener policy rule.
	ID *string `json:"id" validate:"required"`
}

// UnmarshalLoadBalancerListenerPolicyRuleReference unmarshals an instance of LoadBalancerListenerPolicyRuleReference from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyRuleReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyRuleReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyTarget : - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity`
// - If `action` is `forward_to_pool`, specify a `LoadBalancerPoolIdentity`
// - If `action` is `https_redirect`, the response is a
// `LoadBalancerListenerPolicyHTTPSRedirect`
// - If `action` is `redirect`, the response is a `LoadBalancerListenerPolicyRedirectURL`.
// Models which "extend" this model:
// - LoadBalancerListenerPolicyTargetLoadBalancerPoolReference
// - LoadBalancerListenerPolicyTargetLoadBalancerListenerPolicyHTTPSRedirect
// - LoadBalancerListenerPolicyTargetLoadBalancerListenerPolicyRedirectURL
// - LoadBalancerListenerPolicyTargetLoadBalancerListenerReference
type LoadBalancerListenerPolicyTarget struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this load balancer pool.
	ID *string `json:"id,omitempty"`

	// The name for this load balancer pool. The name is unique across all pools for the load balancer.
	Name *string `json:"name,omitempty"`

	// The HTTP status code for this redirect.
	HTTPStatusCode *int64 `json:"http_status_code,omitempty"`

	Listener *LoadBalancerListenerReference `json:"listener,omitempty"`

	// The redirect relative target URI.
	URI *string `json:"uri,omitempty"`

	// The redirect target URL. The URL supports [RFC 6570 level 1
	// expressions](https://datatracker.ietf.org/doc/html/rfc6570#section-1.2) for the following variables which expand to
	// values from the originally requested URL (or the indicated defaults if the request did not include them):
	//
	// - `protocol`
	// - `host`
	// - `port`  (default: `80` for HTTP requests, `443` for HTTPS requests)
	// - `path`  (default: '/')
	// - `query` (default: '')
	//
	// The protocol, host, and port segments of the URL, must only contain at most one instance of the `protocol`, `host`,
	// and `port` variables, respectively. The path and query segments of the URL may contain any combination of variables.
	// If the substitution of `path` results in consecutive leading slashes, the leading slash from the substitution will
	// be removed. Additional examples:
	// - `https://{host}:8080/{port}/{host}/{path}`
	// - `https://www.example.com`
	// - `{protocol}://test.{host}:80/{path}`.
	URL *string `json:"url,omitempty"`
}

func (*LoadBalancerListenerPolicyTarget) isaLoadBalancerListenerPolicyTarget() bool {
	return true
}

type LoadBalancerListenerPolicyTargetIntf interface {
	isaLoadBalancerListenerPolicyTarget() bool
}

// UnmarshalLoadBalancerListenerPolicyTarget unmarshals an instance of LoadBalancerListenerPolicyTarget from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyTarget)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "http_status_code", &obj.HTTPStatusCode)
	if err != nil {
		err = core.SDKErrorf(err, "", "http_status_code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listener", &obj.Listener, UnmarshalLoadBalancerListenerReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "listener-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uri", &obj.URI)
	if err != nil {
		err = core.SDKErrorf(err, "", "uri-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "url", &obj.URL)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPolicyTargetPatch : - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity` for a
//
//		listener in this load balancer.
//	  - If `action` is `forward_to_pool`, specify a `LoadBalancerPoolIdentity` for a pool in
//	    this load balancer.
//	  - If `action` is `https_redirect`, specify a
//	    `LoadBalancerListenerPolicyHTTPSRedirectPatch` for a listener in this load balancer
//	    with a `protocol` of `https`.
//	  - If `action` is `redirect`, specify a `LoadBalancerListenerPolicyRedirectURLPatch`.
//
// Models which "extend" this model:
// - LoadBalancerListenerPolicyTargetPatchLoadBalancerPoolIdentity
// - LoadBalancerListenerPolicyTargetPatchLoadBalancerListenerPolicyHTTPSRedirectPatch
// - LoadBalancerListenerPolicyTargetPatchLoadBalancerListenerPolicyRedirectURLPatch
// - LoadBalancerListenerPolicyTargetPatchLoadBalancerListenerIdentity
type LoadBalancerListenerPolicyTargetPatch struct {
	// The unique identifier for this load balancer pool.
	ID *string `json:"id,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href,omitempty"`

	// The HTTP status code for this redirect.
	HTTPStatusCode *int64 `json:"http_status_code,omitempty"`

	// The target listener.
	//
	// The target listener must be in this load balancer, and must not be the same as the
	// listener in the URL.
	Listener LoadBalancerListenerIdentityIntf `json:"listener,omitempty"`

	// The redirect relative target URI.
	URI *string `json:"uri,omitempty"`

	// The redirect target URL. The URL supports [RFC 6570 level 1
	// expressions](https://datatracker.ietf.org/doc/html/rfc6570#section-1.2) for the following variables which expand to
	// values from the originally requested URL (or the indicated defaults if the request did not include them):
	//
	// - `protocol`
	// - `host`
	// - `port`  (default: `80` for HTTP requests, `443` for HTTPS requests)
	// - `path`  (default: '/')
	// - `query` (default: '')
	//
	// The protocol, host, and port segments of the URL, must only contain at most one instance of the `protocol`, `host`,
	// and `port` variables, respectively. The path and query segments of the URL may contain any combination of variables.
	// If the substitution of `path` results in consecutive leading slashes, the leading slash from the substitution will
	// be removed. Additional examples:
	// - `https://{host}:8080/{port}/{host}/{path}`
	// - `https://www.example.com`
	// - `{protocol}://test.{host}:80/{path}`.
	URL *string `json:"url,omitempty"`
}

func (*LoadBalancerListenerPolicyTargetPatch) isaLoadBalancerListenerPolicyTargetPatch() bool {
	return true
}

type LoadBalancerListenerPolicyTargetPatchIntf interface {
	isaLoadBalancerListenerPolicyTargetPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerListenerPolicyTargetPatch unmarshals an instance of LoadBalancerListenerPolicyTargetPatch from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyTargetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyTargetPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "http_status_code", &obj.HTTPStatusCode)
	if err != nil {
		err = core.SDKErrorf(err, "", "http_status_code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listener", &obj.Listener, UnmarshalLoadBalancerListenerIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "listener-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uri", &obj.URI)
	if err != nil {
		err = core.SDKErrorf(err, "", "uri-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "url", &obj.URL)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerListenerPolicyTargetPatch
func (loadBalancerListenerPolicyTargetPatch *LoadBalancerListenerPolicyTargetPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerListenerPolicyTargetPatch.ID) {
		_patch["id"] = loadBalancerListenerPolicyTargetPatch.ID
	}
	if !core.IsNil(loadBalancerListenerPolicyTargetPatch.Href) {
		_patch["href"] = loadBalancerListenerPolicyTargetPatch.Href
	}
	if !core.IsNil(loadBalancerListenerPolicyTargetPatch.HTTPStatusCode) {
		_patch["http_status_code"] = loadBalancerListenerPolicyTargetPatch.HTTPStatusCode
	}
	if !core.IsNil(loadBalancerListenerPolicyTargetPatch.Listener) {
		_patch["listener"] = loadBalancerListenerPolicyTargetPatch.Listener.asPatch()
	}
	if !core.IsNil(loadBalancerListenerPolicyTargetPatch.URI) {
		_patch["uri"] = loadBalancerListenerPolicyTargetPatch.URI
	}
	if !core.IsNil(loadBalancerListenerPolicyTargetPatch.URL) {
		_patch["url"] = loadBalancerListenerPolicyTargetPatch.URL
	}

	return
}

// LoadBalancerListenerPolicyTargetPrototype : - If `action` is `forward_to_listener`, specify a `LoadBalancerListenerIdentity` in this
//
//		load balancer to forward to.
//	  - If `action` is `forward_to_pool`, use `LoadBalancerPoolIdentity` to specify a pool in
//	    this load balancer to forward to.
//	  - If `action` is `https_redirect`, use
//	    `LoadBalancerListenerPolicyHTTPSRedirectPrototype` to specify a listener on this
//	    load balancer to redirect to.
//	  - If `action` is `redirect`, use `LoadBalancerListenerPolicyRedirectURLPrototype`to
//	    specify a URL to redirect to.
//
// Models which "extend" this model:
// - LoadBalancerListenerPolicyTargetPrototypeLoadBalancerPoolIdentity
// - LoadBalancerListenerPolicyTargetPrototypeLoadBalancerListenerIdentity
// - LoadBalancerListenerPolicyTargetPrototypeLoadBalancerListenerPolicyHTTPSRedirectPrototype
// - LoadBalancerListenerPolicyTargetPrototypeLoadBalancerListenerPolicyRedirectURLPrototype
type LoadBalancerListenerPolicyTargetPrototype struct {
	// The unique identifier for this load balancer pool.
	ID *string `json:"id,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href,omitempty"`

	// The HTTP status code for this redirect.
	HTTPStatusCode *int64 `json:"http_status_code,omitempty"`

	// The target listener.
	//
	// The target listener must be in this load balancer, and must not be the same as the
	// listener in the URL.
	Listener LoadBalancerListenerIdentityIntf `json:"listener,omitempty"`

	// The redirect relative target URI.
	URI *string `json:"uri,omitempty"`

	// The redirect target URL. The URL supports [RFC 6570 level 1
	// expressions](https://datatracker.ietf.org/doc/html/rfc6570#section-1.2) for the following variables which expand to
	// values from the originally requested URL (or the indicated defaults if the request did not include them):
	//
	// - `protocol`
	// - `host`
	// - `port`  (default: `80` for HTTP requests, `443` for HTTPS requests)
	// - `path`  (default: '/')
	// - `query` (default: '')
	//
	// The protocol, host, and port segments of the URL, must only contain at most one instance of the `protocol`, `host`,
	// and `port` variables, respectively. The path and query segments of the URL may contain any combination of variables.
	// If the substitution of `path` results in consecutive leading slashes, the leading slash from the substitution will
	// be removed. Additional examples:
	// - `https://{host}:8080/{port}/{host}/{path}`
	// - `https://www.example.com`
	// - `{protocol}://test.{host}:80/{path}`.
	URL *string `json:"url,omitempty"`
}

func (*LoadBalancerListenerPolicyTargetPrototype) isaLoadBalancerListenerPolicyTargetPrototype() bool {
	return true
}

type LoadBalancerListenerPolicyTargetPrototypeIntf interface {
	isaLoadBalancerListenerPolicyTargetPrototype() bool
}

// UnmarshalLoadBalancerListenerPolicyTargetPrototype unmarshals an instance of LoadBalancerListenerPolicyTargetPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPolicyTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPolicyTargetPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "http_status_code", &obj.HTTPStatusCode)
	if err != nil {
		err = core.SDKErrorf(err, "", "http_status_code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "listener", &obj.Listener, UnmarshalLoadBalancerListenerIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "listener-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uri", &obj.URI)
	if err != nil {
		err = core.SDKErrorf(err, "", "uri-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "url", &obj.URL)
	if err != nil {
		err = core.SDKErrorf(err, "", "url-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerPrototypeLoadBalancerContext : LoadBalancerListenerPrototypeLoadBalancerContext struct
type LoadBalancerListenerPrototypeLoadBalancerContext struct {
	// If set to `true`, this listener will accept and forward PROXY protocol information. Supported by load balancers in
	// the `application` family (otherwise always `false`). Additional restrictions:
	// - If this listener has `https_redirect` specified, its `accept_proxy_protocol` value must
	//   match the `accept_proxy_protocol` value of the `https_redirect` listener.
	// - If this listener is the target of another listener's `https_redirect`, its
	//   `accept_proxy_protocol` value must match that listener's `accept_proxy_protocol` value.
	AcceptProxyProtocol *bool `json:"accept_proxy_protocol,omitempty"`

	// The certificate instance to use for SSL termination. The listener must have a
	// `protocol` of `https`.
	CertificateInstance CertificateInstanceIdentityIntf `json:"certificate_instance,omitempty"`

	// The concurrent connection limit for the listener. If reached, incoming connections may be queued or rejected.
	//
	// Supported for load balancers in the `application` family.
	//
	// If unspecified, the limit will be `15000` for load balancers in the `application` family.
	ConnectionLimit *int64 `json:"connection_limit,omitempty"`

	// The default pool for this listener.  If `https_redirect` is specified,
	// the default pool will not be used. If specified, the pool must:
	//
	// - Belong to this load balancer.
	// - Have the same `protocol` as this listener, or have a compatible protocol.
	//   At present, the compatible protocols are `http` and `https`.
	// - Not already be the `default_pool` for another listener.
	//
	// If unspecified, this listener will be created with no default pool, but one may be
	// subsequently set.
	DefaultPool *LoadBalancerPoolIdentityByName `json:"default_pool,omitempty"`

	// The target listener that requests will be redirected to if none of the listener's
	// `policies` match.
	//
	// If specified, this listener must have a `protocol` of `http`, and the target
	// listener must have a `protocol` of `https`.
	HTTPSRedirect *LoadBalancerListenerHTTPSRedirectPrototype `json:"https_redirect,omitempty"`

	// The idle connection timeout of the listener in seconds.
	//
	// Supported for load balancers in the `application` family.
	//
	// If unspecified, the timeout will be `50` for load balancers in the `application` family.
	IdleConnectionTimeout *int64 `json:"idle_connection_timeout,omitempty"`

	// The listener port number. Each listener in the load balancer must have a non-overlapping port range and `protocol`
	// combination. Protocol values of `tcp`, `http` and `https` share the TCP port space.
	//
	// If `port_min` is also specified, `port` must have the same value as `port_min`.
	Port *int64 `json:"port,omitempty"`

	// The inclusive upper bound of the range of ports used by this listener. Must not be less than `port_min`.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `65535`.
	//
	// The specified port range must not overlap with port ranges used by other listeners for this load balancer using the
	// same protocol. Protocol values of `tcp`, `http` and
	// `https` share the TCP port space.
	PortMax *int64 `json:"port_max,omitempty"`

	// The inclusive lower bound of the range of ports used by this listener. Must not be greater than `port_max`.
	//
	// If specified, `port_max` must also be specified, and must not be smaller. If unspecified, `port_max` must also be
	// unspecified.
	//
	// If `port` is also specified, `port_min` must have the same value as `port`.
	//
	// Only network load balancers with `route_mode`, `is_public` or `is_private_path` set to
	// `true` support different values for `port_min` and `port_max`. If `route_mode` is set to `true`, the value must be
	// `1`.
	//
	// The specified port range must not overlap with port ranges used by other listeners for this load balancer using the
	// same protocol. Protocol values of `tcp`, `http` and
	// `https` share the TCP port space.
	PortMin *int64 `json:"port_min,omitempty"`

	// The listener protocol. Each listener in the load balancer must have a non-overlapping port range and `protocol`
	// combination.
	//
	// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
	// `application` family support `tcp`, `http` and
	// `https`.
	//
	// Additional restrictions:
	// - If `default_pool` is set, the pool's protocol must match, or be compatible with
	//   the listener's protocol. At present, the compatible protocols are `http` and
	//   `https`.
	// - If `https_redirect` is set, the protocol must be `http`.
	Protocol *string `json:"protocol" validate:"required"`
}

// Constants associated with the LoadBalancerListenerPrototypeLoadBalancerContext.Protocol property.
// The listener protocol. Each listener in the load balancer must have a non-overlapping port range and `protocol`
// combination.
//
// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
// `application` family support `tcp`, `http` and
// `https`.
//
// Additional restrictions:
//   - If `default_pool` is set, the pool's protocol must match, or be compatible with
//     the listener's protocol. At present, the compatible protocols are `http` and
//     `https`.
//   - If `https_redirect` is set, the protocol must be `http`.
const (
	LoadBalancerListenerPrototypeLoadBalancerContextProtocolHTTPConst  = "http"
	LoadBalancerListenerPrototypeLoadBalancerContextProtocolHTTPSConst = "https"
	LoadBalancerListenerPrototypeLoadBalancerContextProtocolTCPConst   = "tcp"
	LoadBalancerListenerPrototypeLoadBalancerContextProtocolUDPConst   = "udp"
)

// NewLoadBalancerListenerPrototypeLoadBalancerContext : Instantiate LoadBalancerListenerPrototypeLoadBalancerContext (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerListenerPrototypeLoadBalancerContext(protocol string) (_model *LoadBalancerListenerPrototypeLoadBalancerContext, err error) {
	_model = &LoadBalancerListenerPrototypeLoadBalancerContext{
		Protocol: core.StringPtr(protocol),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerListenerPrototypeLoadBalancerContext unmarshals an instance of LoadBalancerListenerPrototypeLoadBalancerContext from the specified map of raw messages.
func UnmarshalLoadBalancerListenerPrototypeLoadBalancerContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerPrototypeLoadBalancerContext)
	err = core.UnmarshalPrimitive(m, "accept_proxy_protocol", &obj.AcceptProxyProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "accept_proxy_protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "certificate_instance", &obj.CertificateInstance, UnmarshalCertificateInstanceIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "certificate_instance-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "connection_limit", &obj.ConnectionLimit)
	if err != nil {
		err = core.SDKErrorf(err, "", "connection_limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_pool", &obj.DefaultPool, UnmarshalLoadBalancerPoolIdentityByName)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_pool-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "https_redirect", &obj.HTTPSRedirect, UnmarshalLoadBalancerListenerHTTPSRedirectPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "https_redirect-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "idle_connection_timeout", &obj.IdleConnectionTimeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "idle_connection_timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_max", &obj.PortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_min", &obj.PortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerListenerReference : LoadBalancerListenerReference struct
type LoadBalancerListenerReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer listener.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer listener.
	ID *string `json:"id" validate:"required"`
}

// UnmarshalLoadBalancerListenerReference unmarshals an instance of LoadBalancerListenerReference from the specified map of raw messages.
func UnmarshalLoadBalancerListenerReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerListenerReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerLogging : LoadBalancerLogging struct
type LoadBalancerLogging struct {
	// The datapath logging configuration for this load balancer.
	Datapath *LoadBalancerLoggingDatapath `json:"datapath" validate:"required"`
}

// UnmarshalLoadBalancerLogging unmarshals an instance of LoadBalancerLogging from the specified map of raw messages.
func UnmarshalLoadBalancerLogging(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerLogging)
	err = core.UnmarshalModel(m, "datapath", &obj.Datapath, UnmarshalLoadBalancerLoggingDatapath)
	if err != nil {
		err = core.SDKErrorf(err, "", "datapath-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerLoggingDatapath : The datapath logging configuration for this load balancer.
type LoadBalancerLoggingDatapath struct {
	// Indicates whether datapath logging is active for this load balancer.
	Active *bool `json:"active" validate:"required"`
}

// UnmarshalLoadBalancerLoggingDatapath unmarshals an instance of LoadBalancerLoggingDatapath from the specified map of raw messages.
func UnmarshalLoadBalancerLoggingDatapath(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerLoggingDatapath)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerLoggingDatapathPatch : The datapath logging configuration for this load balancer.
type LoadBalancerLoggingDatapathPatch struct {
	// Indicates whether datapath logging will be active for this load balancer.
	Active *bool `json:"active,omitempty"`
}

// UnmarshalLoadBalancerLoggingDatapathPatch unmarshals an instance of LoadBalancerLoggingDatapathPatch from the specified map of raw messages.
func UnmarshalLoadBalancerLoggingDatapathPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerLoggingDatapathPatch)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerLoggingDatapathPatch
func (loadBalancerLoggingDatapathPatch *LoadBalancerLoggingDatapathPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerLoggingDatapathPatch.Active) {
		_patch["active"] = loadBalancerLoggingDatapathPatch.Active
	}

	return
}

// LoadBalancerLoggingDatapathPrototype : The datapath logging configuration for this load balancer.
type LoadBalancerLoggingDatapathPrototype struct {
	// Indicates whether datapath logging will be active for this load balancer.
	Active *bool `json:"active,omitempty"`
}

// UnmarshalLoadBalancerLoggingDatapathPrototype unmarshals an instance of LoadBalancerLoggingDatapathPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerLoggingDatapathPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerLoggingDatapathPrototype)
	err = core.UnmarshalPrimitive(m, "active", &obj.Active)
	if err != nil {
		err = core.SDKErrorf(err, "", "active-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerLoggingPatch : LoadBalancerLoggingPatch struct
type LoadBalancerLoggingPatch struct {
	// The datapath logging configuration for this load balancer.
	Datapath *LoadBalancerLoggingDatapathPatch `json:"datapath,omitempty"`
}

// UnmarshalLoadBalancerLoggingPatch unmarshals an instance of LoadBalancerLoggingPatch from the specified map of raw messages.
func UnmarshalLoadBalancerLoggingPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerLoggingPatch)
	err = core.UnmarshalModel(m, "datapath", &obj.Datapath, UnmarshalLoadBalancerLoggingDatapathPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "datapath-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerLoggingPatch
func (loadBalancerLoggingPatch *LoadBalancerLoggingPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerLoggingPatch.Datapath) {
		_patch["datapath"] = loadBalancerLoggingPatch.Datapath.asPatch()
	}

	return
}

// LoadBalancerLoggingPrototype : LoadBalancerLoggingPrototype struct
type LoadBalancerLoggingPrototype struct {
	// The datapath logging configuration for this load balancer.
	Datapath *LoadBalancerLoggingDatapathPrototype `json:"datapath,omitempty"`
}

// UnmarshalLoadBalancerLoggingPrototype unmarshals an instance of LoadBalancerLoggingPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerLoggingPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerLoggingPrototype)
	err = core.UnmarshalModel(m, "datapath", &obj.Datapath, UnmarshalLoadBalancerLoggingDatapathPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "datapath-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPatch : LoadBalancerPatch struct
type LoadBalancerPatch struct {
	// The DNS configuration for this load balancer.
	//
	// Specify `null` to remove the existing DNS configuration, which will remove all DNS `A`
	// records for this load balancer that had been added to `zone`, and add equivalent `A`
	// records to the public DNS zone `lb.appdomain.cloud`.
	//
	// Not supported by private path load balancers.
	Dns *LoadBalancerDnsPatch `json:"dns,omitempty"`

	// The logging configuration to use for this load balancer.
	//
	// To activate logging, the load balancer profile must support the specified logging type.
	Logging *LoadBalancerLoggingPatch `json:"logging,omitempty"`

	// The name for this load balancer. The name must not be used by another load balancer in the VPC.
	Name *string `json:"name,omitempty"`

	// The subnets to provision this load balancer in. The load balancer's availability will depend on the availability of
	// the zones that the subnets reside in.
	//
	// The specified subnets must be in the same VPC as the existing subnets, and will completely replace the existing
	// subnets.
	//
	// The load balancer must be in the `application` family.
	Subnets []SubnetIdentityIntf `json:"subnets,omitempty"`
}

// UnmarshalLoadBalancerPatch unmarshals an instance of LoadBalancerPatch from the specified map of raw messages.
func UnmarshalLoadBalancerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPatch)
	err = core.UnmarshalModel(m, "dns", &obj.Dns, UnmarshalLoadBalancerDnsPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "dns-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "logging", &obj.Logging, UnmarshalLoadBalancerLoggingPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "logging-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the LoadBalancerPatch
func (loadBalancerPatch *LoadBalancerPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPatch.Dns) {
		_patch["dns"] = loadBalancerPatch.Dns.asPatch()
	}
	if !core.IsNil(loadBalancerPatch.Logging) {
		_patch["logging"] = loadBalancerPatch.Logging.asPatch()
	}
	if !core.IsNil(loadBalancerPatch.Name) {
		_patch["name"] = loadBalancerPatch.Name
	}
	if !core.IsNil(loadBalancerPatch.Subnets) {
		var subnetsPatches []map[string]interface{}
		for _, subnets := range loadBalancerPatch.Subnets {
			subnetsPatches = append(subnetsPatches, subnets.asPatch())
		}
		_patch["subnets"] = subnetsPatches
	}

	return
}

// LoadBalancerPool : LoadBalancerPool struct
type LoadBalancerPool struct {
	// The load balancing algorithm.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Algorithm *string `json:"algorithm" validate:"required"`

	// The date and time that this pool was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	FailsafePolicy *LoadBalancerPoolFailsafePolicy `json:"failsafe_policy" validate:"required"`

	// The health monitor of this pool.
	//
	// If this pool has a member targeting a load balancer then:
	//
	// - If the targeted load balancer has multiple subnets, this health monitor is used to
	//   direct traffic to the available subnets.
	// - The health checks spawned by this health monitor is handled as any other traffic
	//   (that is, subject to the configuration of listeners and pools on the target load
	//   balancer).
	// - This health monitor does not affect how pool member health is determined within the
	//   target load balancer.
	//
	// For more information, see [Private Path network load balancer frequently asked
	// questions](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-faqs#ppnlb-faqs).
	HealthMonitor LoadBalancerPoolHealthMonitorIntf `json:"health_monitor" validate:"required"`

	// The URL for this load balancer pool.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer pool.
	ID *string `json:"id" validate:"required"`

	// The instance group that is managing this pool.
	InstanceGroup *InstanceGroupReference `json:"instance_group,omitempty"`

	// The backend server members of the pool.
	Members []LoadBalancerPoolMemberReference `json:"members,omitempty"`

	// The name for this load balancer pool. The name is unique across all pools for the load balancer.
	Name *string `json:"name" validate:"required"`

	// The protocol for this load balancer pool.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Protocol *string `json:"protocol" validate:"required"`

	// The provisioning status of this pool
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProvisioningStatus *string `json:"provisioning_status" validate:"required"`

	// The PROXY protocol setting for this pool:
	// - `v1`: Enabled with version 1 (human-readable header format)
	// - `v2`: Enabled with version 2 (binary header format)
	// - `disabled`: Disabled
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProxyProtocol *string `json:"proxy_protocol" validate:"required"`

	// The session persistence of this pool.
	//
	// If absent, session persistence will be disabled, and traffic will be distributed
	// across backend server members of the pool.
	SessionPersistence *LoadBalancerPoolSessionPersistence `json:"session_persistence,omitempty"`
}

// Constants associated with the LoadBalancerPool.Algorithm property.
// The load balancing algorithm.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolAlgorithmLeastConnectionsConst   = "least_connections"
	LoadBalancerPoolAlgorithmRoundRobinConst         = "round_robin"
	LoadBalancerPoolAlgorithmWeightedRoundRobinConst = "weighted_round_robin"
)

// Constants associated with the LoadBalancerPool.Protocol property.
// The protocol for this load balancer pool.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolProtocolHTTPConst  = "http"
	LoadBalancerPoolProtocolHTTPSConst = "https"
	LoadBalancerPoolProtocolTCPConst   = "tcp"
	LoadBalancerPoolProtocolUDPConst   = "udp"
)

// Constants associated with the LoadBalancerPool.ProvisioningStatus property.
// The provisioning status of this pool
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolProvisioningStatusActiveConst        = "active"
	LoadBalancerPoolProvisioningStatusCreatePendingConst = "create_pending"
	LoadBalancerPoolProvisioningStatusDeletePendingConst = "delete_pending"
	LoadBalancerPoolProvisioningStatusFailedConst        = "failed"
	LoadBalancerPoolProvisioningStatusUpdatePendingConst = "update_pending"
)

// Constants associated with the LoadBalancerPool.ProxyProtocol property.
// The PROXY protocol setting for this pool:
// - `v1`: Enabled with version 1 (human-readable header format)
// - `v2`: Enabled with version 2 (binary header format)
// - `disabled`: Disabled
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolProxyProtocolDisabledConst = "disabled"
	LoadBalancerPoolProxyProtocolV1Const       = "v1"
	LoadBalancerPoolProxyProtocolV2Const       = "v2"
)

// UnmarshalLoadBalancerPool unmarshals an instance of LoadBalancerPool from the specified map of raw messages.
func UnmarshalLoadBalancerPool(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPool)
	err = core.UnmarshalPrimitive(m, "algorithm", &obj.Algorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "failsafe_policy", &obj.FailsafePolicy, UnmarshalLoadBalancerPoolFailsafePolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "failsafe_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_monitor", &obj.HealthMonitor, UnmarshalLoadBalancerPoolHealthMonitor)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_monitor-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_group", &obj.InstanceGroup, UnmarshalInstanceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "members", &obj.Members, UnmarshalLoadBalancerPoolMemberReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "members-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisioning_status", &obj.ProvisioningStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisioning_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "proxy_protocol", &obj.ProxyProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "proxy_protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "session_persistence", &obj.SessionPersistence, UnmarshalLoadBalancerPoolSessionPersistence)
	if err != nil {
		err = core.SDKErrorf(err, "", "session_persistence-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolCollection : LoadBalancerPoolCollection struct
type LoadBalancerPoolCollection struct {
	// The pools for the load balancer.
	Pools []LoadBalancerPool `json:"pools" validate:"required"`
}

// UnmarshalLoadBalancerPoolCollection unmarshals an instance of LoadBalancerPoolCollection from the specified map of raw messages.
func UnmarshalLoadBalancerPoolCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolCollection)
	err = core.UnmarshalModel(m, "pools", &obj.Pools, UnmarshalLoadBalancerPool)
	if err != nil {
		err = core.SDKErrorf(err, "", "pools-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolFailsafePolicy : LoadBalancerPoolFailsafePolicy struct
type LoadBalancerPoolFailsafePolicy struct {
	// A load balancer failsafe policy action:
	// - `bypass`: Bypasses the members and sends requests directly to their destination IPs.
	// - `drop`: Drops requests.
	// - `fail`: Fails requests with an HTTP `503` status code.
	// - `forward`: Forwards requests to the `target` pool.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Action *string `json:"action" validate:"required"`

	// The healthy member count at which the failsafe policy action will be triggered. At present, this is always `0`, but
	// may be modifiable in the future.
	HealthyMemberThresholdCount *int64 `json:"healthy_member_threshold_count" validate:"required"`

	// If `action` is `forward`, the target pool to forward to.
	//
	// If `action` is not `forward`, this property will be absent.
	//
	// The targets supported by this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Target *LoadBalancerPoolReference `json:"target,omitempty"`
}

// Constants associated with the LoadBalancerPoolFailsafePolicy.Action property.
// A load balancer failsafe policy action:
// - `bypass`: Bypasses the members and sends requests directly to their destination IPs.
// - `drop`: Drops requests.
// - `fail`: Fails requests with an HTTP `503` status code.
// - `forward`: Forwards requests to the `target` pool.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolFailsafePolicyActionBypassConst  = "bypass"
	LoadBalancerPoolFailsafePolicyActionDropConst    = "drop"
	LoadBalancerPoolFailsafePolicyActionFailConst    = "fail"
	LoadBalancerPoolFailsafePolicyActionForwardConst = "forward"
)

// UnmarshalLoadBalancerPoolFailsafePolicy unmarshals an instance of LoadBalancerPoolFailsafePolicy from the specified map of raw messages.
func UnmarshalLoadBalancerPoolFailsafePolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolFailsafePolicy)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "healthy_member_threshold_count", &obj.HealthyMemberThresholdCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "healthy_member_threshold_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerPoolReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolFailsafePolicyPatch : The failsafe policy for this load balancer pool.
type LoadBalancerPoolFailsafePolicyPatch struct {
	// A load balancer failsafe policy action:
	// - `bypass`: Bypasses the members and sends requests directly to their destination IPs. If specified, this load
	// balancer must have `route_mode` enabled.
	// - `drop`: Drops requests. If specified, the pool protocol must be `tcp`.
	// - `fail`: Fails requests with an HTTP `503` status code. If specified, the pool protocol must be `http` or `https`.
	// - `forward`: Forwards requests to the `target` pool. If specified, the pool protocol must be `http` or `https`.
	//
	// The specified value must be listed in the `failsafe_policy_actions` for this pool's load balancer.
	Action *string `json:"action,omitempty"`

	// The failsafe target pool to forward to.
	//
	// The specified pool must:
	// - Belong to this load balancer
	// - Have the same `protocol` as this pool, or have a compatible protocol.
	//   At present, the compatible protocols are `http` and `https`.
	// - Not have a `failsafe_policy.action` of `forward` or `bypass`.
	//
	// If specified, `action` must be `forward`.
	//
	// Specify `null` to remove an existing failsafe target pool.
	Target LoadBalancerPoolFailsafePolicyTargetPatchIntf `json:"target,omitempty"`
}

// Constants associated with the LoadBalancerPoolFailsafePolicyPatch.Action property.
// A load balancer failsafe policy action:
// - `bypass`: Bypasses the members and sends requests directly to their destination IPs. If specified, this load
// balancer must have `route_mode` enabled.
// - `drop`: Drops requests. If specified, the pool protocol must be `tcp`.
// - `fail`: Fails requests with an HTTP `503` status code. If specified, the pool protocol must be `http` or `https`.
// - `forward`: Forwards requests to the `target` pool. If specified, the pool protocol must be `http` or `https`.
//
// The specified value must be listed in the `failsafe_policy_actions` for this pool's load balancer.
const (
	LoadBalancerPoolFailsafePolicyPatchActionBypassConst  = "bypass"
	LoadBalancerPoolFailsafePolicyPatchActionDropConst    = "drop"
	LoadBalancerPoolFailsafePolicyPatchActionFailConst    = "fail"
	LoadBalancerPoolFailsafePolicyPatchActionForwardConst = "forward"
)

// UnmarshalLoadBalancerPoolFailsafePolicyPatch unmarshals an instance of LoadBalancerPoolFailsafePolicyPatch from the specified map of raw messages.
func UnmarshalLoadBalancerPoolFailsafePolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolFailsafePolicyPatch)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerPoolFailsafePolicyTargetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerPoolFailsafePolicyPatch
func (loadBalancerPoolFailsafePolicyPatch *LoadBalancerPoolFailsafePolicyPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolFailsafePolicyPatch.Action) {
		_patch["action"] = loadBalancerPoolFailsafePolicyPatch.Action
	}
	if !core.IsNil(loadBalancerPoolFailsafePolicyPatch.Target) {
		_patch["target"] = loadBalancerPoolFailsafePolicyPatch.Target.asPatch()
	}

	return
}

// LoadBalancerPoolFailsafePolicyPrototype : LoadBalancerPoolFailsafePolicyPrototype struct
type LoadBalancerPoolFailsafePolicyPrototype struct {
	// A load balancer failsafe policy action:
	// - `bypass`: Bypasses the members and sends requests directly to their destination IPs. If specified, this load
	// balancer must have `route_mode` enabled.
	// - `drop`: Drops requests. If specified, the pool protocol must be `tcp`.
	// - `fail`: Fails requests with an HTTP `503` status code. If specified, the pool protocol must be `http` or `https`.
	// - `forward`: Forwards requests to the `target` pool. If specified, the pool protocol must be `http` or `https`.
	//
	// The specified value must be listed in the `failsafe_policy_actions` for this pool's load balancer.
	Action *string `json:"action,omitempty"`

	// The failsafe target pool to forward to.
	//
	// The specified pool must:
	// - Belong to this load balancer
	// - Have the same `protocol` as this pool, or have a compatible protocol.
	//   At present, the compatible protocols are `http` and `https`.
	// - Have a `failsafe_policy.action` of `fail` or `drop`
	//
	// If specified, `action` must be `forward`.
	Target LoadBalancerPoolIdentityIntf `json:"target,omitempty"`
}

// Constants associated with the LoadBalancerPoolFailsafePolicyPrototype.Action property.
// A load balancer failsafe policy action:
// - `bypass`: Bypasses the members and sends requests directly to their destination IPs. If specified, this load
// balancer must have `route_mode` enabled.
// - `drop`: Drops requests. If specified, the pool protocol must be `tcp`.
// - `fail`: Fails requests with an HTTP `503` status code. If specified, the pool protocol must be `http` or `https`.
// - `forward`: Forwards requests to the `target` pool. If specified, the pool protocol must be `http` or `https`.
//
// The specified value must be listed in the `failsafe_policy_actions` for this pool's load balancer.
const (
	LoadBalancerPoolFailsafePolicyPrototypeActionBypassConst  = "bypass"
	LoadBalancerPoolFailsafePolicyPrototypeActionDropConst    = "drop"
	LoadBalancerPoolFailsafePolicyPrototypeActionFailConst    = "fail"
	LoadBalancerPoolFailsafePolicyPrototypeActionForwardConst = "forward"
)

// UnmarshalLoadBalancerPoolFailsafePolicyPrototype unmarshals an instance of LoadBalancerPoolFailsafePolicyPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerPoolFailsafePolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolFailsafePolicyPrototype)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerPoolIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolFailsafePolicyTargetPatch : The failsafe target pool to forward to.
//
// The specified pool must:
//   - Belong to this load balancer
//   - Have the same `protocol` as this pool, or have a compatible protocol.
//     At present, the compatible protocols are `http` and `https`.
//   - Not have a `failsafe_policy.action` of `forward` or `bypass`.
//
// If specified, `action` must be `forward`.
//
// Specify `null` to remove an existing failsafe target pool.
// Models which "extend" this model:
// - LoadBalancerPoolFailsafePolicyTargetPatchLoadBalancerPoolIdentityByID
// - LoadBalancerPoolFailsafePolicyTargetPatchLoadBalancerPoolIdentityByHref
type LoadBalancerPoolFailsafePolicyTargetPatch struct {
	// The unique identifier for this load balancer pool.
	ID *string `json:"id,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href,omitempty"`
}

func (*LoadBalancerPoolFailsafePolicyTargetPatch) isaLoadBalancerPoolFailsafePolicyTargetPatch() bool {
	return true
}

type LoadBalancerPoolFailsafePolicyTargetPatchIntf interface {
	isaLoadBalancerPoolFailsafePolicyTargetPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerPoolFailsafePolicyTargetPatch unmarshals an instance of LoadBalancerPoolFailsafePolicyTargetPatch from the specified map of raw messages.
func UnmarshalLoadBalancerPoolFailsafePolicyTargetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolFailsafePolicyTargetPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerPoolFailsafePolicyTargetPatch
func (loadBalancerPoolFailsafePolicyTargetPatch *LoadBalancerPoolFailsafePolicyTargetPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolFailsafePolicyTargetPatch.ID) {
		_patch["id"] = loadBalancerPoolFailsafePolicyTargetPatch.ID
	}
	if !core.IsNil(loadBalancerPoolFailsafePolicyTargetPatch.Href) {
		_patch["href"] = loadBalancerPoolFailsafePolicyTargetPatch.Href
	}

	return
}

// LoadBalancerPoolHealthMonitor : LoadBalancerPoolHealthMonitor struct
// Models which "extend" this model:
// - LoadBalancerPoolHealthMonitorTypeTCP
// - LoadBalancerPoolHealthMonitorTypeHttphttps
type LoadBalancerPoolHealthMonitor struct {
	// The seconds to wait between health checks.
	Delay *int64 `json:"delay" validate:"required"`

	// The health check max retries.
	MaxRetries *int64 `json:"max_retries" validate:"required"`

	// The health check port.
	//
	// If present, this overrides the pool member port values.
	Port *int64 `json:"port,omitempty"`

	// The seconds to wait for a response to a health check.
	Timeout *int64 `json:"timeout" validate:"required"`

	// The protocol type used for health checks.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`

	// The health check URL path, in the format of an [origin-form request
	// target](https://tools.ietf.org/html/rfc7230#section-5.3.1).
	URLPath *string `json:"url_path,omitempty"`
}

// Constants associated with the LoadBalancerPoolHealthMonitor.Type property.
// The protocol type used for health checks.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolHealthMonitorTypeHTTPConst  = "http"
	LoadBalancerPoolHealthMonitorTypeHTTPSConst = "https"
	LoadBalancerPoolHealthMonitorTypeTCPConst   = "tcp"
)

func (*LoadBalancerPoolHealthMonitor) isaLoadBalancerPoolHealthMonitor() bool {
	return true
}

type LoadBalancerPoolHealthMonitorIntf interface {
	isaLoadBalancerPoolHealthMonitor() bool
}

// UnmarshalLoadBalancerPoolHealthMonitor unmarshals an instance of LoadBalancerPoolHealthMonitor from the specified map of raw messages.
func UnmarshalLoadBalancerPoolHealthMonitor(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolHealthMonitor)
	err = core.UnmarshalPrimitive(m, "delay", &obj.Delay)
	if err != nil {
		err = core.SDKErrorf(err, "", "delay-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_retries", &obj.MaxRetries)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_retries-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "timeout", &obj.Timeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "url_path", &obj.URLPath)
	if err != nil {
		err = core.SDKErrorf(err, "", "url_path-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolHealthMonitorPatch : LoadBalancerPoolHealthMonitorPatch struct
type LoadBalancerPoolHealthMonitorPatch struct {
	// The seconds to wait between health checks.  Must be greater than `timeout`.
	Delay *int64 `json:"delay" validate:"required"`

	// The health check max retries.
	MaxRetries *int64 `json:"max_retries" validate:"required"`

	// The health check port.
	//
	// If set, this overrides the pool member port values.
	//
	// Specify `null` to remove an existing health check port.
	Port *int64 `json:"port,omitempty"`

	// The seconds to wait for a response to a health check.  Must be less than `delay`.
	Timeout *int64 `json:"timeout" validate:"required"`

	// The protocol type to use for health checks.
	Type *string `json:"type" validate:"required"`

	// The health check URL path.  If specified, `type` must be `http` or `https`.
	//
	// Must be in the format of an [origin-form request target](https://tools.ietf.org/html/rfc7230#section-5.3.1).
	//
	// Specify `null` to remove a url_path.
	URLPath *string `json:"url_path,omitempty"`
}

// Constants associated with the LoadBalancerPoolHealthMonitorPatch.Type property.
// The protocol type to use for health checks.
const (
	LoadBalancerPoolHealthMonitorPatchTypeHTTPConst  = "http"
	LoadBalancerPoolHealthMonitorPatchTypeHTTPSConst = "https"
	LoadBalancerPoolHealthMonitorPatchTypeTCPConst   = "tcp"
)

// NewLoadBalancerPoolHealthMonitorPatch : Instantiate LoadBalancerPoolHealthMonitorPatch (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerPoolHealthMonitorPatch(delay int64, maxRetries int64, timeout int64, typeVar string) (_model *LoadBalancerPoolHealthMonitorPatch, err error) {
	_model = &LoadBalancerPoolHealthMonitorPatch{
		Delay:      core.Int64Ptr(delay),
		MaxRetries: core.Int64Ptr(maxRetries),
		Timeout:    core.Int64Ptr(timeout),
		Type:       core.StringPtr(typeVar),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerPoolHealthMonitorPatch unmarshals an instance of LoadBalancerPoolHealthMonitorPatch from the specified map of raw messages.
func UnmarshalLoadBalancerPoolHealthMonitorPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolHealthMonitorPatch)
	err = core.UnmarshalPrimitive(m, "delay", &obj.Delay)
	if err != nil {
		err = core.SDKErrorf(err, "", "delay-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_retries", &obj.MaxRetries)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_retries-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "timeout", &obj.Timeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "url_path", &obj.URLPath)
	if err != nil {
		err = core.SDKErrorf(err, "", "url_path-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerPoolHealthMonitorPatch
func (loadBalancerPoolHealthMonitorPatch *LoadBalancerPoolHealthMonitorPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolHealthMonitorPatch.Delay) {
		_patch["delay"] = loadBalancerPoolHealthMonitorPatch.Delay
	}
	if !core.IsNil(loadBalancerPoolHealthMonitorPatch.MaxRetries) {
		_patch["max_retries"] = loadBalancerPoolHealthMonitorPatch.MaxRetries
	}
	if !core.IsNil(loadBalancerPoolHealthMonitorPatch.Port) {
		_patch["port"] = loadBalancerPoolHealthMonitorPatch.Port
	}
	if !core.IsNil(loadBalancerPoolHealthMonitorPatch.Timeout) {
		_patch["timeout"] = loadBalancerPoolHealthMonitorPatch.Timeout
	}
	if !core.IsNil(loadBalancerPoolHealthMonitorPatch.Type) {
		_patch["type"] = loadBalancerPoolHealthMonitorPatch.Type
	}
	if !core.IsNil(loadBalancerPoolHealthMonitorPatch.URLPath) {
		_patch["url_path"] = loadBalancerPoolHealthMonitorPatch.URLPath
	}

	return
}

// LoadBalancerPoolHealthMonitorPrototype : LoadBalancerPoolHealthMonitorPrototype struct
// Models which "extend" this model:
// - LoadBalancerPoolHealthMonitorPrototypeLoadBalancerPoolHealthMonitorTypeTCPPrototype
// - LoadBalancerPoolHealthMonitorPrototypeLoadBalancerPoolHealthMonitorTypeHttphttpsPrototype
type LoadBalancerPoolHealthMonitorPrototype struct {
	// The seconds to wait between health checks.  Must be greater than `timeout`.
	Delay *int64 `json:"delay" validate:"required"`

	// The health check max retries.
	MaxRetries *int64 `json:"max_retries" validate:"required"`

	// The health check port.
	//
	// If specified, this overrides the pool member port values.
	Port *int64 `json:"port,omitempty"`

	// The seconds to wait for a response to a health check.  Must be less than `delay`.
	Timeout *int64 `json:"timeout" validate:"required"`

	// The protocol type to use for health checks.
	Type *string `json:"type" validate:"required"`

	// The health check URL path to use.
	//
	// Must be in the format of an [origin-form request target](https://tools.ietf.org/html/rfc7230#section-5.3.1).
	URLPath *string `json:"url_path,omitempty"`
}

// Constants associated with the LoadBalancerPoolHealthMonitorPrototype.Type property.
// The protocol type to use for health checks.
const (
	LoadBalancerPoolHealthMonitorPrototypeTypeHTTPConst  = "http"
	LoadBalancerPoolHealthMonitorPrototypeTypeHTTPSConst = "https"
	LoadBalancerPoolHealthMonitorPrototypeTypeTCPConst   = "tcp"
)

func (*LoadBalancerPoolHealthMonitorPrototype) isaLoadBalancerPoolHealthMonitorPrototype() bool {
	return true
}

type LoadBalancerPoolHealthMonitorPrototypeIntf interface {
	isaLoadBalancerPoolHealthMonitorPrototype() bool
}

// UnmarshalLoadBalancerPoolHealthMonitorPrototype unmarshals an instance of LoadBalancerPoolHealthMonitorPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerPoolHealthMonitorPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolHealthMonitorPrototype)
	err = core.UnmarshalPrimitive(m, "delay", &obj.Delay)
	if err != nil {
		err = core.SDKErrorf(err, "", "delay-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max_retries", &obj.MaxRetries)
	if err != nil {
		err = core.SDKErrorf(err, "", "max_retries-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "timeout", &obj.Timeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "url_path", &obj.URLPath)
	if err != nil {
		err = core.SDKErrorf(err, "", "url_path-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolIdentity : Identifies a load balancer pool by a unique property.
// Models which "extend" this model:
// - LoadBalancerPoolIdentityLoadBalancerPoolIdentityByID
// - LoadBalancerPoolIdentityLoadBalancerPoolIdentityByHref
type LoadBalancerPoolIdentity struct {
	// The unique identifier for this load balancer pool.
	ID *string `json:"id,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href,omitempty"`
}

func (*LoadBalancerPoolIdentity) isaLoadBalancerPoolIdentity() bool {
	return true
}

type LoadBalancerPoolIdentityIntf interface {
	isaLoadBalancerPoolIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerPoolIdentity unmarshals an instance of LoadBalancerPoolIdentity from the specified map of raw messages.
func UnmarshalLoadBalancerPoolIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerPoolIdentity
func (loadBalancerPoolIdentity *LoadBalancerPoolIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolIdentity.ID) {
		_patch["id"] = loadBalancerPoolIdentity.ID
	}
	if !core.IsNil(loadBalancerPoolIdentity.Href) {
		_patch["href"] = loadBalancerPoolIdentity.Href
	}

	return
}

// LoadBalancerPoolIdentityByName : LoadBalancerPoolIdentityByName struct
type LoadBalancerPoolIdentityByName struct {
	// The name for this load balancer pool. The name is unique across all pools for the load balancer.
	Name *string `json:"name" validate:"required"`
}

// NewLoadBalancerPoolIdentityByName : Instantiate LoadBalancerPoolIdentityByName (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerPoolIdentityByName(name string) (_model *LoadBalancerPoolIdentityByName, err error) {
	_model = &LoadBalancerPoolIdentityByName{
		Name: core.StringPtr(name),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerPoolIdentityByName unmarshals an instance of LoadBalancerPoolIdentityByName from the specified map of raw messages.
func UnmarshalLoadBalancerPoolIdentityByName(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolIdentityByName)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolMember : LoadBalancerPoolMember struct
type LoadBalancerPoolMember struct {
	// The date and time that this member was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The health of the member.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Health *string `json:"health" validate:"required"`

	// The URL for this load balancer pool member.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer pool member.
	ID *string `json:"id" validate:"required"`

	// The port the member will receive load balancer traffic on. Applies only to load balancer traffic received on a
	// listener with a single port. (If the traffic is received on a listener with a port range, the member will receive
	// the traffic on the same port the listener received it on.)
	//
	// This port will also be used for health checks unless the `port` property of
	// `health_monitor` property is specified.
	Port *int64 `json:"port" validate:"required"`

	// The provisioning status of this member
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ProvisioningStatus *string `json:"provisioning_status" validate:"required"`

	// The pool member target.
	Target LoadBalancerPoolMemberTargetIntf `json:"target" validate:"required"`

	// The weight of the member.
	//
	// This property will be present if the pool algorithm is `weighted_round_robin`.
	Weight *int64 `json:"weight,omitempty"`
}

// Constants associated with the LoadBalancerPoolMember.Health property.
// The health of the member.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolMemberHealthFaultedConst = "faulted"
	LoadBalancerPoolMemberHealthOkConst      = "ok"
	LoadBalancerPoolMemberHealthUnknownConst = "unknown"
)

// Constants associated with the LoadBalancerPoolMember.ProvisioningStatus property.
// The provisioning status of this member
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolMemberProvisioningStatusActiveConst        = "active"
	LoadBalancerPoolMemberProvisioningStatusCreatePendingConst = "create_pending"
	LoadBalancerPoolMemberProvisioningStatusDeletePendingConst = "delete_pending"
	LoadBalancerPoolMemberProvisioningStatusFailedConst        = "failed"
	LoadBalancerPoolMemberProvisioningStatusUpdatePendingConst = "update_pending"
)

// UnmarshalLoadBalancerPoolMember unmarshals an instance of LoadBalancerPoolMember from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMember(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMember)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health", &obj.Health)
	if err != nil {
		err = core.SDKErrorf(err, "", "health-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "provisioning_status", &obj.ProvisioningStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "provisioning_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerPoolMemberTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "weight", &obj.Weight)
	if err != nil {
		err = core.SDKErrorf(err, "", "weight-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolMemberCollection : LoadBalancerPoolMemberCollection struct
type LoadBalancerPoolMemberCollection struct {
	// The members for the load balancer pool.
	Members []LoadBalancerPoolMember `json:"members" validate:"required"`
}

// UnmarshalLoadBalancerPoolMemberCollection unmarshals an instance of LoadBalancerPoolMemberCollection from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMemberCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMemberCollection)
	err = core.UnmarshalModel(m, "members", &obj.Members, UnmarshalLoadBalancerPoolMember)
	if err != nil {
		err = core.SDKErrorf(err, "", "members-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolMemberPatch : LoadBalancerPoolMemberPatch struct
type LoadBalancerPoolMemberPatch struct {
	// The port the member will receive load balancer traffic on. Applies only to load balancer traffic received on a
	// listener with a single port. (If the traffic is received on a listener with a port range, the member will receive
	// the traffic on the same port the listener received it on.)
	//
	// This port will also be used for health checks unless the `port` property of
	// `health_monitor` property is specified.
	//
	// The port must be unique across all members for all pools associated with this pool's listener.
	//
	// For load balancers in the `network` family, the same `port` and `target` tuple cannot be shared by a pool member of
	// any other load balancer in the same VPC.
	Port *int64 `json:"port,omitempty"`

	// The pool member target.
	//
	// If the load balancer has `route_mode` set to `true`, the member must be in a zone the load
	// balancer has a subnet in.
	//
	// For load balancers in the `network` family, the same `port` and `target` tuple cannot
	// be shared by a pool member of any other load balancer in the same VPC.
	Target LoadBalancerPoolMemberTargetPrototypeIntf `json:"target,omitempty"`

	// The weight of the member.
	//
	// If specified, the pool algorithm must be `weighted_round_robin`.
	Weight *int64 `json:"weight,omitempty"`
}

// UnmarshalLoadBalancerPoolMemberPatch unmarshals an instance of LoadBalancerPoolMemberPatch from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMemberPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMemberPatch)
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerPoolMemberTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "weight", &obj.Weight)
	if err != nil {
		err = core.SDKErrorf(err, "", "weight-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the LoadBalancerPoolMemberPatch
func (loadBalancerPoolMemberPatch *LoadBalancerPoolMemberPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolMemberPatch.Port) {
		_patch["port"] = loadBalancerPoolMemberPatch.Port
	}
	if !core.IsNil(loadBalancerPoolMemberPatch.Target) {
		_patch["target"] = loadBalancerPoolMemberPatch.Target.asPatch()
	}
	if !core.IsNil(loadBalancerPoolMemberPatch.Weight) {
		_patch["weight"] = loadBalancerPoolMemberPatch.Weight
	}

	return
}

// LoadBalancerPoolMemberPrototype : LoadBalancerPoolMemberPrototype struct
type LoadBalancerPoolMemberPrototype struct {
	// The port the member will receive load balancer traffic on. Applies only to load balancer traffic received on a
	// listener with a single port. (If the traffic is received on a listener with a port range, the member will receive
	// the traffic on the same port the listener received it on.)
	//
	// This port will also be used for health checks unless the `port` property of
	// `health_monitor` property is specified.
	//
	// The port must be unique across all members for all pools associated with this pool's listener.
	//
	// For load balancers in the `network` family, the same `port` and `target` tuple cannot be shared by a pool member of
	// any other load balancer in the same VPC.
	Port *int64 `json:"port" validate:"required"`

	// The pool member target.
	//
	// If the load balancer has `route_mode` set to `true`, the member must be in a zone the load
	// balancer has a subnet in.
	//
	// For load balancers in the `network` family, the same `port` and `target` tuple cannot
	// be shared by a pool member of any other load balancer in the same VPC.
	Target LoadBalancerPoolMemberTargetPrototypeIntf `json:"target" validate:"required"`

	// The weight of the member.
	//
	// If specified, the pool algorithm must be `weighted_round_robin` and the load balancer must be in the `application`
	// family.
	//
	// If unspecified, the weight will be `50` for load balancers in the `application` family.
	Weight *int64 `json:"weight,omitempty"`
}

// NewLoadBalancerPoolMemberPrototype : Instantiate LoadBalancerPoolMemberPrototype (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerPoolMemberPrototype(port int64, target LoadBalancerPoolMemberTargetPrototypeIntf) (_model *LoadBalancerPoolMemberPrototype, err error) {
	_model = &LoadBalancerPoolMemberPrototype{
		Port:   core.Int64Ptr(port),
		Target: target,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerPoolMemberPrototype unmarshals an instance of LoadBalancerPoolMemberPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMemberPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMemberPrototype)
	err = core.UnmarshalPrimitive(m, "port", &obj.Port)
	if err != nil {
		err = core.SDKErrorf(err, "", "port-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalLoadBalancerPoolMemberTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "weight", &obj.Weight)
	if err != nil {
		err = core.SDKErrorf(err, "", "weight-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolMemberReference : LoadBalancerPoolMemberReference struct
type LoadBalancerPoolMemberReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer pool member.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer pool member.
	ID *string `json:"id" validate:"required"`
}

// UnmarshalLoadBalancerPoolMemberReference unmarshals an instance of LoadBalancerPoolMemberReference from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMemberReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMemberReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolMemberTarget : The pool member target.
// Models which "extend" this model:
// - LoadBalancerPoolMemberTargetInstanceReference
// - LoadBalancerPoolMemberTargetIP
// - LoadBalancerPoolMemberTargetLoadBalancerReference
type LoadBalancerPoolMemberTarget struct {
	// The CRN for this virtual server instance.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this virtual server instance.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this virtual server instance.
	ID *string `json:"id,omitempty"`

	// The name for this virtual server instance. The name is unique across all virtual server instances in the region.
	Name *string `json:"name,omitempty"`

	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the LoadBalancerPoolMemberTarget.ResourceType property.
// The resource type.
const (
	LoadBalancerPoolMemberTargetResourceTypeLoadBalancerConst = "load_balancer"
)

func (*LoadBalancerPoolMemberTarget) isaLoadBalancerPoolMemberTarget() bool {
	return true
}

type LoadBalancerPoolMemberTargetIntf interface {
	isaLoadBalancerPoolMemberTarget() bool
}

// UnmarshalLoadBalancerPoolMemberTarget unmarshals an instance of LoadBalancerPoolMemberTarget from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMemberTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMemberTarget)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolMemberTargetPrototype : The pool member target.
//
// If the load balancer has `route_mode` set to `true`, the member must be in a zone the load balancer has a subnet in.
//
// For load balancers in the `network` family, the same `port` and `target` tuple cannot be shared by a pool member of
// any other load balancer in the same VPC.
// Models which "extend" this model:
// - LoadBalancerPoolMemberTargetPrototypeInstanceIdentity
// - LoadBalancerPoolMemberTargetPrototypeIP
// - LoadBalancerPoolMemberTargetPrototypeLoadBalancerIdentity
type LoadBalancerPoolMemberTargetPrototype struct {
	// The unique identifier for this virtual server instance.
	ID *string `json:"id,omitempty"`

	// The CRN for this virtual server instance.
	CRN *string `json:"crn,omitempty"`

	// The URL for this virtual server instance.
	Href *string `json:"href,omitempty"`

	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`
}

func (*LoadBalancerPoolMemberTargetPrototype) isaLoadBalancerPoolMemberTargetPrototype() bool {
	return true
}

type LoadBalancerPoolMemberTargetPrototypeIntf interface {
	isaLoadBalancerPoolMemberTargetPrototype() bool
	asPatch() map[string]interface{}
}

// UnmarshalLoadBalancerPoolMemberTargetPrototype unmarshals an instance of LoadBalancerPoolMemberTargetPrototype from the specified map of raw messages.
func UnmarshalLoadBalancerPoolMemberTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolMemberTargetPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerPoolMemberTargetPrototype
func (loadBalancerPoolMemberTargetPrototype *LoadBalancerPoolMemberTargetPrototype) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolMemberTargetPrototype.ID) {
		_patch["id"] = loadBalancerPoolMemberTargetPrototype.ID
	}
	if !core.IsNil(loadBalancerPoolMemberTargetPrototype.CRN) {
		_patch["crn"] = loadBalancerPoolMemberTargetPrototype.CRN
	}
	if !core.IsNil(loadBalancerPoolMemberTargetPrototype.Href) {
		_patch["href"] = loadBalancerPoolMemberTargetPrototype.Href
	}
	if !core.IsNil(loadBalancerPoolMemberTargetPrototype.Address) {
		_patch["address"] = loadBalancerPoolMemberTargetPrototype.Address
	}

	return
}

// LoadBalancerPoolPatch : LoadBalancerPoolPatch struct
type LoadBalancerPoolPatch struct {
	// The load balancing algorithm. The `least_connections` algorithm is only supported for load balancers that have
	// `availability` with value `subnet` in the profile.
	Algorithm *string `json:"algorithm,omitempty"`

	// The failsafe policy for this load balancer pool.
	FailsafePolicy *LoadBalancerPoolFailsafePolicyPatch `json:"failsafe_policy,omitempty"`

	// The health monitor of this pool.
	//
	// If this pool has a member targeting a load balancer then:
	//
	// - If the targeted load balancer has multiple subnets, this health monitor will be
	//   used to direct traffic to the available subnets.
	// - The health checks spawned by this health monitor will be handled as any other
	//   traffic (that is, subject to the configuration of listeners and pools on the
	//   target load balancer).
	// - This health monitor does not affect how pool member health is determined within
	//   the target load balancer.
	//
	// For more information, see [Private Path network load balancer frequently asked
	// questions](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-faqs#ppnlb-faqs).
	HealthMonitor *LoadBalancerPoolHealthMonitorPatch `json:"health_monitor,omitempty"`

	// The name for this load balancer pool. The name must not be used by another pool for the load balancer.
	Name *string `json:"name,omitempty"`

	// The protocol for this load balancer pool.
	//
	// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
	// `application` family support `tcp`, `http` and
	// `https`.
	//
	// If this pool is associated with a load balancer listener or a load balancer failsafe target pool, the specified
	// protocol must match or be compatible with each other's protocol. At present, the compatible protocols are `http` and
	// `https`.
	Protocol *string `json:"protocol,omitempty"`

	// The PROXY protocol setting for this pool:
	// - `v1`: Enabled with version 1 (human-readable header format)
	// - `v2`: Enabled with version 2 (binary header format)
	// - `disabled`: Disabled
	//
	// For load balancers in the `network` family, this property must be `disabled`.
	ProxyProtocol *string `json:"proxy_protocol,omitempty"`

	// The session persistence of this pool.
	SessionPersistence *LoadBalancerPoolSessionPersistencePatch `json:"session_persistence,omitempty"`
}

// Constants associated with the LoadBalancerPoolPatch.Algorithm property.
// The load balancing algorithm. The `least_connections` algorithm is only supported for load balancers that have
// `availability` with value `subnet` in the profile.
const (
	LoadBalancerPoolPatchAlgorithmLeastConnectionsConst   = "least_connections"
	LoadBalancerPoolPatchAlgorithmRoundRobinConst         = "round_robin"
	LoadBalancerPoolPatchAlgorithmWeightedRoundRobinConst = "weighted_round_robin"
)

// Constants associated with the LoadBalancerPoolPatch.Protocol property.
// The protocol for this load balancer pool.
//
// Load balancers in the `network` family support `tcp` and `udp` (if `udp_supported` is `true`). Load balancers in the
// `application` family support `tcp`, `http` and
// `https`.
//
// If this pool is associated with a load balancer listener or a load balancer failsafe target pool, the specified
// protocol must match or be compatible with each other's protocol. At present, the compatible protocols are `http` and
// `https`.
const (
	LoadBalancerPoolPatchProtocolHTTPConst  = "http"
	LoadBalancerPoolPatchProtocolHTTPSConst = "https"
	LoadBalancerPoolPatchProtocolTCPConst   = "tcp"
	LoadBalancerPoolPatchProtocolUDPConst   = "udp"
)

// Constants associated with the LoadBalancerPoolPatch.ProxyProtocol property.
// The PROXY protocol setting for this pool:
// - `v1`: Enabled with version 1 (human-readable header format)
// - `v2`: Enabled with version 2 (binary header format)
// - `disabled`: Disabled
//
// For load balancers in the `network` family, this property must be `disabled`.
const (
	LoadBalancerPoolPatchProxyProtocolDisabledConst = "disabled"
	LoadBalancerPoolPatchProxyProtocolV1Const       = "v1"
	LoadBalancerPoolPatchProxyProtocolV2Const       = "v2"
)

// UnmarshalLoadBalancerPoolPatch unmarshals an instance of LoadBalancerPoolPatch from the specified map of raw messages.
func UnmarshalLoadBalancerPoolPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolPatch)
	err = core.UnmarshalPrimitive(m, "algorithm", &obj.Algorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "failsafe_policy", &obj.FailsafePolicy, UnmarshalLoadBalancerPoolFailsafePolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "failsafe_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_monitor", &obj.HealthMonitor, UnmarshalLoadBalancerPoolHealthMonitorPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_monitor-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "proxy_protocol", &obj.ProxyProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "proxy_protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "session_persistence", &obj.SessionPersistence, UnmarshalLoadBalancerPoolSessionPersistencePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "session_persistence-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the LoadBalancerPoolPatch
func (loadBalancerPoolPatch *LoadBalancerPoolPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolPatch.Algorithm) {
		_patch["algorithm"] = loadBalancerPoolPatch.Algorithm
	}
	if !core.IsNil(loadBalancerPoolPatch.FailsafePolicy) {
		_patch["failsafe_policy"] = loadBalancerPoolPatch.FailsafePolicy.asPatch()
	}
	if !core.IsNil(loadBalancerPoolPatch.HealthMonitor) {
		_patch["health_monitor"] = loadBalancerPoolPatch.HealthMonitor.asPatch()
	}
	if !core.IsNil(loadBalancerPoolPatch.Name) {
		_patch["name"] = loadBalancerPoolPatch.Name
	}
	if !core.IsNil(loadBalancerPoolPatch.Protocol) {
		_patch["protocol"] = loadBalancerPoolPatch.Protocol
	}
	if !core.IsNil(loadBalancerPoolPatch.ProxyProtocol) {
		_patch["proxy_protocol"] = loadBalancerPoolPatch.ProxyProtocol
	}
	if !core.IsNil(loadBalancerPoolPatch.SessionPersistence) {
		_patch["session_persistence"] = loadBalancerPoolPatch.SessionPersistence.asPatch()
	}

	return
}

// LoadBalancerPoolPrototypeLoadBalancerContext : LoadBalancerPoolPrototypeLoadBalancerContext struct
type LoadBalancerPoolPrototypeLoadBalancerContext struct {
	// The load balancing algorithm. The `least_connections` algorithm is only supported for load balancers that have
	// `availability` with value `subnet` in the profile.
	Algorithm *string `json:"algorithm" validate:"required"`

	// The health monitor of this pool.
	//
	// If this pool has a member targeting a load balancer then:
	//
	// - If the targeted load balancer has multiple subnets, this health monitor will be
	//   used to direct traffic to the available subnets.
	// - The health checks spawned by this health monitor will be handled as any other
	//   traffic (that is, subject to the configuration of listeners and pools on the target
	//   load balancer).
	// - This health monitor does not affect how pool member health is determined within the
	//   target load balancer.
	//
	// For more information, see [Private Path network load balancer frequently asked
	// questions](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-faqs#ppnlb-faqs).
	HealthMonitor LoadBalancerPoolHealthMonitorPrototypeIntf `json:"health_monitor" validate:"required"`

	// The members for this load balancer pool. For load balancers in the `network` family, the same `port` and `target`
	// tuple cannot be shared by a pool member of any other load balancer in the same VPC.
	Members []LoadBalancerPoolMemberPrototype `json:"members,omitempty"`

	// The name for this load balancer pool. The name must not be used by another pool for the load balancer. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The protocol used for this load balancer pool. Load balancers in the `network` family support `tcp` and `udp` (if
	// `udp_supported` is `true`). Load balancers in the
	// `application` family support `tcp`, `http`, and `https`.
	Protocol *string `json:"protocol" validate:"required"`

	// The PROXY protocol setting for this pool:
	// - `v1`: Enabled with version 1 (human-readable header format)
	// - `v2`: Enabled with version 2 (binary header format)
	// - `disabled`: Disabled
	//
	// For load balancers in the `network` family, this property must be `disabled`.
	ProxyProtocol *string `json:"proxy_protocol,omitempty"`

	// The session persistence of this pool. If specified, the load balancer must have
	// `source_ip_session_persistence_supported` set to `true` in its profile.
	//
	// If unspecified, session persistence will be disabled, and traffic will be distributed
	// across members of the pool.
	SessionPersistence *LoadBalancerPoolSessionPersistencePrototype `json:"session_persistence,omitempty"`
}

// Constants associated with the LoadBalancerPoolPrototypeLoadBalancerContext.Algorithm property.
// The load balancing algorithm. The `least_connections` algorithm is only supported for load balancers that have
// `availability` with value `subnet` in the profile.
const (
	LoadBalancerPoolPrototypeLoadBalancerContextAlgorithmLeastConnectionsConst   = "least_connections"
	LoadBalancerPoolPrototypeLoadBalancerContextAlgorithmRoundRobinConst         = "round_robin"
	LoadBalancerPoolPrototypeLoadBalancerContextAlgorithmWeightedRoundRobinConst = "weighted_round_robin"
)

// Constants associated with the LoadBalancerPoolPrototypeLoadBalancerContext.Protocol property.
// The protocol used for this load balancer pool. Load balancers in the `network` family support `tcp` and `udp` (if
// `udp_supported` is `true`). Load balancers in the
// `application` family support `tcp`, `http`, and `https`.
const (
	LoadBalancerPoolPrototypeLoadBalancerContextProtocolHTTPConst  = "http"
	LoadBalancerPoolPrototypeLoadBalancerContextProtocolHTTPSConst = "https"
	LoadBalancerPoolPrototypeLoadBalancerContextProtocolTCPConst   = "tcp"
	LoadBalancerPoolPrototypeLoadBalancerContextProtocolUDPConst   = "udp"
)

// Constants associated with the LoadBalancerPoolPrototypeLoadBalancerContext.ProxyProtocol property.
// The PROXY protocol setting for this pool:
// - `v1`: Enabled with version 1 (human-readable header format)
// - `v2`: Enabled with version 2 (binary header format)
// - `disabled`: Disabled
//
// For load balancers in the `network` family, this property must be `disabled`.
const (
	LoadBalancerPoolPrototypeLoadBalancerContextProxyProtocolDisabledConst = "disabled"
	LoadBalancerPoolPrototypeLoadBalancerContextProxyProtocolV1Const       = "v1"
	LoadBalancerPoolPrototypeLoadBalancerContextProxyProtocolV2Const       = "v2"
)

// NewLoadBalancerPoolPrototypeLoadBalancerContext : Instantiate LoadBalancerPoolPrototypeLoadBalancerContext (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerPoolPrototypeLoadBalancerContext(algorithm string, healthMonitor LoadBalancerPoolHealthMonitorPrototypeIntf, protocol string) (_model *LoadBalancerPoolPrototypeLoadBalancerContext, err error) {
	_model = &LoadBalancerPoolPrototypeLoadBalancerContext{
		Algorithm:     core.StringPtr(algorithm),
		HealthMonitor: healthMonitor,
		Protocol:      core.StringPtr(protocol),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerPoolPrototypeLoadBalancerContext unmarshals an instance of LoadBalancerPoolPrototypeLoadBalancerContext from the specified map of raw messages.
func UnmarshalLoadBalancerPoolPrototypeLoadBalancerContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolPrototypeLoadBalancerContext)
	err = core.UnmarshalPrimitive(m, "algorithm", &obj.Algorithm)
	if err != nil {
		err = core.SDKErrorf(err, "", "algorithm-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_monitor", &obj.HealthMonitor, UnmarshalLoadBalancerPoolHealthMonitorPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_monitor-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "members", &obj.Members, UnmarshalLoadBalancerPoolMemberPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "members-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "proxy_protocol", &obj.ProxyProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "proxy_protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "session_persistence", &obj.SessionPersistence, UnmarshalLoadBalancerPoolSessionPersistencePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "session_persistence-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolReference : LoadBalancerPoolReference struct
type LoadBalancerPoolReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer pool.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer pool.
	ID *string `json:"id" validate:"required"`

	// The name for this load balancer pool. The name is unique across all pools for the load balancer.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalLoadBalancerPoolReference unmarshals an instance of LoadBalancerPoolReference from the specified map of raw messages.
func UnmarshalLoadBalancerPoolReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolSessionPersistence : LoadBalancerPoolSessionPersistence struct
type LoadBalancerPoolSessionPersistence struct {
	// The session persistence cookie name.
	CookieName *string `json:"cookie_name,omitempty"`

	// The session persistence type.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`
}

// Constants associated with the LoadBalancerPoolSessionPersistence.Type property.
// The session persistence type.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerPoolSessionPersistenceTypeAppCookieConst  = "app_cookie"
	LoadBalancerPoolSessionPersistenceTypeHTTPCookieConst = "http_cookie"
	LoadBalancerPoolSessionPersistenceTypeSourceIPConst   = "source_ip"
)

// UnmarshalLoadBalancerPoolSessionPersistence unmarshals an instance of LoadBalancerPoolSessionPersistence from the specified map of raw messages.
func UnmarshalLoadBalancerPoolSessionPersistence(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolSessionPersistence)
	err = core.UnmarshalPrimitive(m, "cookie_name", &obj.CookieName)
	if err != nil {
		err = core.SDKErrorf(err, "", "cookie_name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerPoolSessionPersistencePatch : The session persistence configuration. Specify `null` to remove any existing session persistence configuration.
type LoadBalancerPoolSessionPersistencePatch struct {
	// The session persistence cookie name. Names starting with `IBM` are not allowed.
	//
	// If specified, the session persistence type must be `app_cookie`.
	CookieName *string `json:"cookie_name,omitempty"`

	// The session persistence type.
	//
	// If `http_cookie` or `app_cookie` is specified, the pool protocol must be `http` or
	// `https`.
	Type *string `json:"type,omitempty"`
}

// Constants associated with the LoadBalancerPoolSessionPersistencePatch.Type property.
// The session persistence type.
//
// If `http_cookie` or `app_cookie` is specified, the pool protocol must be `http` or
// `https`.
const (
	LoadBalancerPoolSessionPersistencePatchTypeAppCookieConst  = "app_cookie"
	LoadBalancerPoolSessionPersistencePatchTypeHTTPCookieConst = "http_cookie"
	LoadBalancerPoolSessionPersistencePatchTypeSourceIPConst   = "source_ip"
)

// UnmarshalLoadBalancerPoolSessionPersistencePatch unmarshals an instance of LoadBalancerPoolSessionPersistencePatch from the specified map of raw messages.
func UnmarshalLoadBalancerPoolSessionPersistencePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolSessionPersistencePatch)
	err = core.UnmarshalPrimitive(m, "cookie_name", &obj.CookieName)
	if err != nil {
		err = core.SDKErrorf(err, "", "cookie_name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the LoadBalancerPoolSessionPersistencePatch
func (loadBalancerPoolSessionPersistencePatch *LoadBalancerPoolSessionPersistencePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(loadBalancerPoolSessionPersistencePatch.CookieName) {
		_patch["cookie_name"] = loadBalancerPoolSessionPersistencePatch.CookieName
	}
	if !core.IsNil(loadBalancerPoolSessionPersistencePatch.Type) {
		_patch["type"] = loadBalancerPoolSessionPersistencePatch.Type
	}

	return
}

// LoadBalancerPoolSessionPersistencePrototype : LoadBalancerPoolSessionPersistencePrototype struct
type LoadBalancerPoolSessionPersistencePrototype struct {
	// The session persistence cookie name. Names starting with `IBM` are not allowed.
	//
	// If specified, the session persistence type must be `app_cookie`.
	CookieName *string `json:"cookie_name,omitempty"`

	// The session persistence type.
	//
	// If `http_cookie` or `app_cookie` is specified, the pool protocol must be `http` or
	// `https`.
	Type *string `json:"type" validate:"required"`
}

// Constants associated with the LoadBalancerPoolSessionPersistencePrototype.Type property.
// The session persistence type.
//
// If `http_cookie` or `app_cookie` is specified, the pool protocol must be `http` or
// `https`.
const (
	LoadBalancerPoolSessionPersistencePrototypeTypeAppCookieConst  = "app_cookie"
	LoadBalancerPoolSessionPersistencePrototypeTypeHTTPCookieConst = "http_cookie"
	LoadBalancerPoolSessionPersistencePrototypeTypeSourceIPConst   = "source_ip"
)

// NewLoadBalancerPoolSessionPersistencePrototype : Instantiate LoadBalancerPoolSessionPersistencePrototype (Generic Model Constructor)
func (*VpcV1) NewLoadBalancerPoolSessionPersistencePrototype(typeVar string) (_model *LoadBalancerPoolSessionPersistencePrototype, err error) {
	_model = &LoadBalancerPoolSessionPersistencePrototype{
		Type: core.StringPtr(typeVar),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalLoadBalancerPoolSessionPersistencePrototype unmarshals an instance of LoadBalancerPoolSessionPersistencePrototype from the specified map of raw messages.
func UnmarshalLoadBalancerPoolSessionPersistencePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerPoolSessionPersistencePrototype)
	err = core.UnmarshalPrimitive(m, "cookie_name", &obj.CookieName)
	if err != nil {
		err = core.SDKErrorf(err, "", "cookie_name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfile : LoadBalancerProfile struct
type LoadBalancerProfile struct {
	AccessModes *LoadBalancerProfileAccessModes `json:"access_modes" validate:"required"`

	Availability LoadBalancerProfileAvailabilityIntf `json:"availability" validate:"required"`

	FailsafePolicyActions LoadBalancerProfileFailsafePolicyActionsIntf `json:"failsafe_policy_actions" validate:"required"`

	// The product family this load balancer profile belongs to.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Family *string `json:"family" validate:"required"`

	// The URL for this load balancer profile.
	Href *string `json:"href" validate:"required"`

	InstanceGroupsSupported LoadBalancerProfileInstanceGroupsSupportedIntf `json:"instance_groups_supported" validate:"required"`

	// Indicates which logging type(s) are supported for a load balancer with this profile.
	LoggingSupported *LoadBalancerProfileLoggingSupported `json:"logging_supported" validate:"required"`

	// The globally unique name for this load balancer profile.
	Name *string `json:"name" validate:"required"`

	RouteModeSupported LoadBalancerProfileRouteModeSupportedIntf `json:"route_mode_supported" validate:"required"`

	SecurityGroupsSupported LoadBalancerProfileSecurityGroupsSupportedIntf `json:"security_groups_supported" validate:"required"`

	SourceIPSessionPersistenceSupported LoadBalancerProfileSourceIPSessionPersistenceSupportedIntf `json:"source_ip_session_persistence_supported" validate:"required"`

	// The load balancer profiles that load balancers with this profile can target.
	TargetableLoadBalancerProfiles []LoadBalancerProfileReference `json:"targetable_load_balancer_profiles" validate:"required"`

	UDPSupported LoadBalancerProfileUDPSupportedIntf `json:"udp_supported" validate:"required"`
}

// Constants associated with the LoadBalancerProfile.Family property.
// The product family this load balancer profile belongs to.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerProfileFamilyApplicationConst = "application"
	LoadBalancerProfileFamilyNetworkConst     = "network"
)

// UnmarshalLoadBalancerProfile unmarshals an instance of LoadBalancerProfile from the specified map of raw messages.
func UnmarshalLoadBalancerProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfile)
	err = core.UnmarshalModel(m, "access_modes", &obj.AccessModes, UnmarshalLoadBalancerProfileAccessModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "availability", &obj.Availability, UnmarshalLoadBalancerProfileAvailability)
	if err != nil {
		err = core.SDKErrorf(err, "", "availability-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "failsafe_policy_actions", &obj.FailsafePolicyActions, UnmarshalLoadBalancerProfileFailsafePolicyActions)
	if err != nil {
		err = core.SDKErrorf(err, "", "failsafe_policy_actions-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_groups_supported", &obj.InstanceGroupsSupported, UnmarshalLoadBalancerProfileInstanceGroupsSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_groups_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "logging_supported", &obj.LoggingSupported, UnmarshalLoadBalancerProfileLoggingSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "logging_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "route_mode_supported", &obj.RouteModeSupported, UnmarshalLoadBalancerProfileRouteModeSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_mode_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups_supported", &obj.SecurityGroupsSupported, UnmarshalLoadBalancerProfileSecurityGroupsSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_ip_session_persistence_supported", &obj.SourceIPSessionPersistenceSupported, UnmarshalLoadBalancerProfileSourceIPSessionPersistenceSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_ip_session_persistence_supported-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "targetable_load_balancer_profiles", &obj.TargetableLoadBalancerProfiles, UnmarshalLoadBalancerProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "targetable_load_balancer_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "udp_supported", &obj.UDPSupported, UnmarshalLoadBalancerProfileUDPSupported)
	if err != nil {
		err = core.SDKErrorf(err, "", "udp_supported-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileAccessModes : LoadBalancerProfileAccessModes struct
type LoadBalancerProfileAccessModes struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The access modes supported by load balancers with this profile.
	Values []string `json:"values" validate:"required"`
}

// Constants associated with the LoadBalancerProfileAccessModes.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileAccessModesTypeEnumConst = "enum"
)

// Constants associated with the LoadBalancerProfileAccessModes.Values property.
// The access mode for this load balancer:
// - `private`: reachable from within its VPC, at IP addresses in `private_ips`
// - `private_path`: reachable through an endpoint gateway
// - `public`: reachable from the internet at the IP addresses in `public_ips`.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerProfileAccessModesValuesPrivateConst     = "private"
	LoadBalancerProfileAccessModesValuesPrivatePathConst = "private_path"
	LoadBalancerProfileAccessModesValuesPublicConst      = "public"
)

// UnmarshalLoadBalancerProfileAccessModes unmarshals an instance of LoadBalancerProfileAccessModes from the specified map of raw messages.
func UnmarshalLoadBalancerProfileAccessModes(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileAccessModes)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileAvailability : LoadBalancerProfileAvailability struct
// Models which "extend" this model:
// - LoadBalancerProfileAvailabilityFixed
// - LoadBalancerProfileAvailabilityDependent
type LoadBalancerProfileAvailability struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The availability of this load balancer:
	// - `subnet`: remains available if at least one zone that the load balancer's subnets reside
	//   in is available
	// - `region`: remains available if at least one zone in the region is available.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Value *string `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerProfileAvailability.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileAvailabilityTypeFixedConst = "fixed"
)

// Constants associated with the LoadBalancerProfileAvailability.Value property.
// The availability of this load balancer:
//   - `subnet`: remains available if at least one zone that the load balancer's subnets reside
//     in is available
//   - `region`: remains available if at least one zone in the region is available.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerProfileAvailabilityValueRegionConst = "region"
	LoadBalancerProfileAvailabilityValueSubnetConst = "subnet"
)

func (*LoadBalancerProfileAvailability) isaLoadBalancerProfileAvailability() bool {
	return true
}

type LoadBalancerProfileAvailabilityIntf interface {
	isaLoadBalancerProfileAvailability() bool
}

// UnmarshalLoadBalancerProfileAvailability unmarshals an instance of LoadBalancerProfileAvailability from the specified map of raw messages.
func UnmarshalLoadBalancerProfileAvailability(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileAvailability)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileCollection : LoadBalancerProfileCollection struct
type LoadBalancerProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of load balancer profiles.
	Profiles []LoadBalancerProfile `json:"profiles" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalLoadBalancerProfileCollection unmarshals an instance of LoadBalancerProfileCollection from the specified map of raw messages.
func UnmarshalLoadBalancerProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profiles", &obj.Profiles, UnmarshalLoadBalancerProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *LoadBalancerProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// LoadBalancerProfileFailsafePolicyActions : LoadBalancerProfileFailsafePolicyActions struct
// Models which "extend" this model:
// - LoadBalancerProfileFailsafePolicyActionsEnum
// - LoadBalancerProfileFailsafePolicyActionsDependent
type LoadBalancerProfileFailsafePolicyActions struct {
	// The default failsafe policy action for this profile.
	Default *string `json:"default,omitempty"`

	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The supported failsafe policy actions.
	Values []string `json:"values,omitempty"`
}

// Constants associated with the LoadBalancerProfileFailsafePolicyActions.Default property.
// The default failsafe policy action for this profile.
const (
	LoadBalancerProfileFailsafePolicyActionsDefaultBypassConst  = "bypass"
	LoadBalancerProfileFailsafePolicyActionsDefaultDropConst    = "drop"
	LoadBalancerProfileFailsafePolicyActionsDefaultFailConst    = "fail"
	LoadBalancerProfileFailsafePolicyActionsDefaultForwardConst = "forward"
)

// Constants associated with the LoadBalancerProfileFailsafePolicyActions.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileFailsafePolicyActionsTypeEnumConst = "enum"
)

// Constants associated with the LoadBalancerProfileFailsafePolicyActions.Values property.
// A load balancer failsafe policy action:
// - `bypass`: Bypasses the members and sends requests directly to their destination IPs.
// - `drop`: Drops requests.
// - `fail`: Fails requests with an HTTP `503` status code.
// - `forward`: Forwards requests to the `target` pool.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerProfileFailsafePolicyActionsValuesBypassConst  = "bypass"
	LoadBalancerProfileFailsafePolicyActionsValuesDropConst    = "drop"
	LoadBalancerProfileFailsafePolicyActionsValuesFailConst    = "fail"
	LoadBalancerProfileFailsafePolicyActionsValuesForwardConst = "forward"
)

func (*LoadBalancerProfileFailsafePolicyActions) isaLoadBalancerProfileFailsafePolicyActions() bool {
	return true
}

type LoadBalancerProfileFailsafePolicyActionsIntf interface {
	isaLoadBalancerProfileFailsafePolicyActions() bool
}

// UnmarshalLoadBalancerProfileFailsafePolicyActions unmarshals an instance of LoadBalancerProfileFailsafePolicyActions from the specified map of raw messages.
func UnmarshalLoadBalancerProfileFailsafePolicyActions(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileFailsafePolicyActions)
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileIdentity : Identifies a load balancer profile by a unique property.
// Models which "extend" this model:
// - LoadBalancerProfileIdentityByName
// - LoadBalancerProfileIdentityByHref
type LoadBalancerProfileIdentity struct {
	// The globally unique name for this load balancer profile.
	Name *string `json:"name,omitempty"`

	// The URL for this load balancer profile.
	Href *string `json:"href,omitempty"`
}

func (*LoadBalancerProfileIdentity) isaLoadBalancerProfileIdentity() bool {
	return true
}

type LoadBalancerProfileIdentityIntf interface {
	isaLoadBalancerProfileIdentity() bool
}

// UnmarshalLoadBalancerProfileIdentity unmarshals an instance of LoadBalancerProfileIdentity from the specified map of raw messages.
func UnmarshalLoadBalancerProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileInstanceGroupsSupported : LoadBalancerProfileInstanceGroupsSupported struct
// Models which "extend" this model:
// - LoadBalancerProfileInstanceGroupsSupportedFixed
// - LoadBalancerProfileInstanceGroupsSupportedDependent
type LoadBalancerProfileInstanceGroupsSupported struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *bool `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerProfileInstanceGroupsSupported.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileInstanceGroupsSupportedTypeFixedConst = "fixed"
)

func (*LoadBalancerProfileInstanceGroupsSupported) isaLoadBalancerProfileInstanceGroupsSupported() bool {
	return true
}

type LoadBalancerProfileInstanceGroupsSupportedIntf interface {
	isaLoadBalancerProfileInstanceGroupsSupported() bool
}

// UnmarshalLoadBalancerProfileInstanceGroupsSupported unmarshals an instance of LoadBalancerProfileInstanceGroupsSupported from the specified map of raw messages.
func UnmarshalLoadBalancerProfileInstanceGroupsSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileInstanceGroupsSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileLoggingSupported : Indicates which logging type(s) are supported for a load balancer with this profile.
type LoadBalancerProfileLoggingSupported struct {
	// The type for this profile field.
	Type *string `json:"type" validate:"required"`

	// The supported logging type(s) for a load balancer with this profile.
	Value []string `json:"value" validate:"required"`
}

// Constants associated with the LoadBalancerProfileLoggingSupported.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileLoggingSupportedTypeFixedConst = "fixed"
)

// UnmarshalLoadBalancerProfileLoggingSupported unmarshals an instance of LoadBalancerProfileLoggingSupported from the specified map of raw messages.
func UnmarshalLoadBalancerProfileLoggingSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileLoggingSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileReference : LoadBalancerProfileReference struct
type LoadBalancerProfileReference struct {
	// The product family this load balancer profile belongs to.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Family *string `json:"family" validate:"required"`

	// The URL for this load balancer profile.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this load balancer profile.
	Name *string `json:"name" validate:"required"`
}

// Constants associated with the LoadBalancerProfileReference.Family property.
// The product family this load balancer profile belongs to.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	LoadBalancerProfileReferenceFamilyApplicationConst = "application"
	LoadBalancerProfileReferenceFamilyNetworkConst     = "network"
)

// UnmarshalLoadBalancerProfileReference unmarshals an instance of LoadBalancerProfileReference from the specified map of raw messages.
func UnmarshalLoadBalancerProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileReference)
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileRouteModeSupported : LoadBalancerProfileRouteModeSupported struct
// Models which "extend" this model:
// - LoadBalancerProfileRouteModeSupportedFixed
// - LoadBalancerProfileRouteModeSupportedDependent
type LoadBalancerProfileRouteModeSupported struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *bool `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerProfileRouteModeSupported.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileRouteModeSupportedTypeFixedConst = "fixed"
)

func (*LoadBalancerProfileRouteModeSupported) isaLoadBalancerProfileRouteModeSupported() bool {
	return true
}

type LoadBalancerProfileRouteModeSupportedIntf interface {
	isaLoadBalancerProfileRouteModeSupported() bool
}

// UnmarshalLoadBalancerProfileRouteModeSupported unmarshals an instance of LoadBalancerProfileRouteModeSupported from the specified map of raw messages.
func UnmarshalLoadBalancerProfileRouteModeSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileRouteModeSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileSecurityGroupsSupported : LoadBalancerProfileSecurityGroupsSupported struct
// Models which "extend" this model:
// - LoadBalancerProfileSecurityGroupsSupportedFixed
// - LoadBalancerProfileSecurityGroupsSupportedDependent
type LoadBalancerProfileSecurityGroupsSupported struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *bool `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerProfileSecurityGroupsSupported.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileSecurityGroupsSupportedTypeFixedConst = "fixed"
)

func (*LoadBalancerProfileSecurityGroupsSupported) isaLoadBalancerProfileSecurityGroupsSupported() bool {
	return true
}

type LoadBalancerProfileSecurityGroupsSupportedIntf interface {
	isaLoadBalancerProfileSecurityGroupsSupported() bool
}

// UnmarshalLoadBalancerProfileSecurityGroupsSupported unmarshals an instance of LoadBalancerProfileSecurityGroupsSupported from the specified map of raw messages.
func UnmarshalLoadBalancerProfileSecurityGroupsSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileSecurityGroupsSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileSourceIPSessionPersistenceSupported : LoadBalancerProfileSourceIPSessionPersistenceSupported struct
// Models which "extend" this model:
// - LoadBalancerProfileSourceIPSessionPersistenceSupportedFixed
// - LoadBalancerProfileSourceIPSessionPersistenceSupportedDependent
type LoadBalancerProfileSourceIPSessionPersistenceSupported struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *bool `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerProfileSourceIPSessionPersistenceSupported.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileSourceIPSessionPersistenceSupportedTypeFixedConst = "fixed"
)

func (*LoadBalancerProfileSourceIPSessionPersistenceSupported) isaLoadBalancerProfileSourceIPSessionPersistenceSupported() bool {
	return true
}

type LoadBalancerProfileSourceIPSessionPersistenceSupportedIntf interface {
	isaLoadBalancerProfileSourceIPSessionPersistenceSupported() bool
}

// UnmarshalLoadBalancerProfileSourceIPSessionPersistenceSupported unmarshals an instance of LoadBalancerProfileSourceIPSessionPersistenceSupported from the specified map of raw messages.
func UnmarshalLoadBalancerProfileSourceIPSessionPersistenceSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileSourceIPSessionPersistenceSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerProfileUDPSupported : LoadBalancerProfileUDPSupported struct
// Models which "extend" this model:
// - LoadBalancerProfileUDPSupportedFixed
// - LoadBalancerProfileUDPSupportedDependent
type LoadBalancerProfileUDPSupported struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *bool `json:"value,omitempty"`
}

// Constants associated with the LoadBalancerProfileUDPSupported.Type property.
// The type for this profile field.
const (
	LoadBalancerProfileUDPSupportedTypeFixedConst = "fixed"
)

func (*LoadBalancerProfileUDPSupported) isaLoadBalancerProfileUDPSupported() bool {
	return true
}

type LoadBalancerProfileUDPSupportedIntf interface {
	isaLoadBalancerProfileUDPSupported() bool
}

// UnmarshalLoadBalancerProfileUDPSupported unmarshals an instance of LoadBalancerProfileUDPSupported from the specified map of raw messages.
func UnmarshalLoadBalancerProfileUDPSupported(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerProfileUDPSupported)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerReference : LoadBalancerReference struct
type LoadBalancerReference struct {
	// The CRN for this load balancer.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this load balancer.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this load balancer.
	ID *string `json:"id" validate:"required"`

	// The name for this load balancer. The name is unique across all load balancers in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the LoadBalancerReference.ResourceType property.
// The resource type.
const (
	LoadBalancerReferenceResourceTypeLoadBalancerConst = "load_balancer"
)

// UnmarshalLoadBalancerReference unmarshals an instance of LoadBalancerReference from the specified map of raw messages.
func UnmarshalLoadBalancerReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// LoadBalancerStatistics : LoadBalancerStatistics struct
type LoadBalancerStatistics struct {
	// The number of active connections for this load balancer.
	ActiveConnections *int64 `json:"active_connections" validate:"required"`

	// The current connection rate (connections per second) for this load balancer.
	ConnectionRate *float32 `json:"connection_rate" validate:"required"`

	// The total number of bytes processed for this load balancer for the current calendar month.
	DataProcessedThisMonth *int64 `json:"data_processed_this_month" validate:"required"`

	// The current throughput (in Mbps) for this load balancer.
	Throughput *float32 `json:"throughput" validate:"required"`
}

// UnmarshalLoadBalancerStatistics unmarshals an instance of LoadBalancerStatistics from the specified map of raw messages.
func UnmarshalLoadBalancerStatistics(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(LoadBalancerStatistics)
	err = core.UnmarshalPrimitive(m, "active_connections", &obj.ActiveConnections)
	if err != nil {
		err = core.SDKErrorf(err, "", "active_connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "connection_rate", &obj.ConnectionRate)
	if err != nil {
		err = core.SDKErrorf(err, "", "connection_rate-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "data_processed_this_month", &obj.DataProcessedThisMonth)
	if err != nil {
		err = core.SDKErrorf(err, "", "data_processed_this_month-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "throughput", &obj.Throughput)
	if err != nil {
		err = core.SDKErrorf(err, "", "throughput-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACL : NetworkACL struct
type NetworkACL struct {
	// The date and time that the network ACL was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this network ACL.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this network ACL.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this network ACL.
	ID *string `json:"id" validate:"required"`

	// The name for this network ACL. The name is unique across all network ACLs for the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this network ACL.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The ordered rules for this network ACL. If no rules exist, no traffic will be allowed.
	Rules []NetworkACLRuleItemIntf `json:"rules" validate:"required"`

	// The subnets to which this network ACL is attached.
	Subnets []SubnetReference `json:"subnets" validate:"required"`

	// The VPC this network ACL resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// UnmarshalNetworkACL unmarshals an instance of NetworkACL from the specified map of raw messages.
func UnmarshalNetworkACL(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACL)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalNetworkACLRuleItem)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACLCollection : NetworkACLCollection struct
type NetworkACLCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A page of network ACLs.
	NetworkAcls []NetworkACL `json:"network_acls" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalNetworkACLCollection unmarshals an instance of NetworkACLCollection from the specified map of raw messages.
func UnmarshalNetworkACLCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_acls", &obj.NetworkAcls, UnmarshalNetworkACL)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_acls-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *NetworkACLCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// NetworkACLIdentity : Identifies a network ACL by a unique property.
// Models which "extend" this model:
// - NetworkACLIdentityByID
// - NetworkACLIdentityByCRN
// - NetworkACLIdentityByHref
type NetworkACLIdentity struct {
	// The unique identifier for this network ACL.
	ID *string `json:"id,omitempty"`

	// The CRN for this network ACL.
	CRN *string `json:"crn,omitempty"`

	// The URL for this network ACL.
	Href *string `json:"href,omitempty"`
}

func (*NetworkACLIdentity) isaNetworkACLIdentity() bool {
	return true
}

type NetworkACLIdentityIntf interface {
	isaNetworkACLIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalNetworkACLIdentity unmarshals an instance of NetworkACLIdentity from the specified map of raw messages.
func UnmarshalNetworkACLIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the NetworkACLIdentity
func (networkACLIdentity *NetworkACLIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(networkACLIdentity.ID) {
		_patch["id"] = networkACLIdentity.ID
	}
	if !core.IsNil(networkACLIdentity.CRN) {
		_patch["crn"] = networkACLIdentity.CRN
	}
	if !core.IsNil(networkACLIdentity.Href) {
		_patch["href"] = networkACLIdentity.Href
	}

	return
}

// NetworkACLPatch : NetworkACLPatch struct
type NetworkACLPatch struct {
	// The name for this network ACL. The name must not be used by another network ACL for the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalNetworkACLPatch unmarshals an instance of NetworkACLPatch from the specified map of raw messages.
func UnmarshalNetworkACLPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the NetworkACLPatch
func (networkACLPatch *NetworkACLPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(networkACLPatch.Name) {
		_patch["name"] = networkACLPatch.Name
	}

	return
}

// NetworkACLPrototype : NetworkACLPrototype struct
// Models which "extend" this model:
// - NetworkACLPrototypeNetworkACLByRules
// - NetworkACLPrototypeNetworkACLBySourceNetworkACL
type NetworkACLPrototype struct {
	// The name for this network ACL. The name must not be used by another network ACL for the VPC. If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The VPC this network ACL will reside in.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The prototype objects for rules to create along with this network ACL. If unspecified, no rules will be created,
	// resulting in no traffic being allowed.
	Rules []NetworkACLRulePrototypeNetworkACLContextIntf `json:"rules,omitempty"`

	// The network ACL to copy rules from.
	SourceNetworkACL NetworkACLIdentityIntf `json:"source_network_acl,omitempty"`
}

func (*NetworkACLPrototype) isaNetworkACLPrototype() bool {
	return true
}

type NetworkACLPrototypeIntf interface {
	isaNetworkACLPrototype() bool
}

// UnmarshalNetworkACLPrototype unmarshals an instance of NetworkACLPrototype from the specified map of raw messages.
func UnmarshalNetworkACLPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLPrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalNetworkACLRulePrototypeNetworkACLContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_network_acl", &obj.SourceNetworkACL, UnmarshalNetworkACLIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_network_acl-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACLReference : NetworkACLReference struct
type NetworkACLReference struct {
	// The CRN for this network ACL.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this network ACL.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this network ACL.
	ID *string `json:"id" validate:"required"`

	// The name for this network ACL. The name is unique across all network ACLs for the VPC.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalNetworkACLReference unmarshals an instance of NetworkACLReference from the specified map of raw messages.
func UnmarshalNetworkACLReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACLRule : NetworkACLRule struct
// Models which "extend" this model:
// - NetworkACLRuleNetworkACLRuleProtocolAll
// - NetworkACLRuleNetworkACLRuleProtocolIcmp
// - NetworkACLRuleNetworkACLRuleProtocolTcpudp
type NetworkACLRule struct {
	// The action to perform for a packet matching the rule.
	Action *string `json:"action" validate:"required"`

	// The rule that this rule is immediately before. If absent, this is the last rule.
	Before *NetworkACLRuleReference `json:"before,omitempty"`

	// The date and time that the rule was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The destination IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all destination addresses.
	Destination *string `json:"destination" validate:"required"`

	// The direction of traffic to match.
	Direction *string `json:"direction" validate:"required"`

	// The URL for this network ACL rule.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this network ACL rule.
	ID *string `json:"id" validate:"required"`

	// The IP version for this rule.
	IPVersion *string `json:"ip_version" validate:"required"`

	// The name for this network ACL rule. The name is unique across all rules for the network ACL.
	Name *string `json:"name" validate:"required"`

	// The network protocol.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Protocol *string `json:"protocol" validate:"required"`

	// The source IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all source addresses.
	Source *string `json:"source" validate:"required"`

	// The ICMP traffic code to match.
	//
	// If absent, all codes are matched.
	Code *int64 `json:"code,omitempty"`

	// The ICMP traffic type to match.
	//
	// If absent, all types are matched.
	Type *int64 `json:"type,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	DestinationPortMax *int64 `json:"destination_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	DestinationPortMin *int64 `json:"destination_port_min,omitempty"`

	// The inclusive upper bound of the TCP or UDP source port range.
	SourcePortMax *int64 `json:"source_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP source port range.
	SourcePortMin *int64 `json:"source_port_min,omitempty"`
}

// Constants associated with the NetworkACLRule.Action property.
// The action to perform for a packet matching the rule.
const (
	NetworkACLRuleActionAllowConst = "allow"
	NetworkACLRuleActionDenyConst  = "deny"
)

// Constants associated with the NetworkACLRule.Direction property.
// The direction of traffic to match.
const (
	NetworkACLRuleDirectionInboundConst  = "inbound"
	NetworkACLRuleDirectionOutboundConst = "outbound"
)

// Constants associated with the NetworkACLRule.IPVersion property.
// The IP version for this rule.
const (
	NetworkACLRuleIPVersionIpv4Const = "ipv4"
)

// Constants associated with the NetworkACLRule.Protocol property.
// The network protocol.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	NetworkACLRuleProtocolAllConst  = "all"
	NetworkACLRuleProtocolIcmpConst = "icmp"
	NetworkACLRuleProtocolTCPConst  = "tcp"
	NetworkACLRuleProtocolUDPConst  = "udp"
)

func (*NetworkACLRule) isaNetworkACLRule() bool {
	return true
}

type NetworkACLRuleIntf interface {
	isaNetworkACLRule() bool
}

// UnmarshalNetworkACLRule unmarshals an instance of NetworkACLRule from the specified map of raw messages.
func UnmarshalNetworkACLRule(m map[string]json.RawMessage, result interface{}) (err error) {
	// Retrieve discriminator value to determine correct "subclass".
	var discValue string
	err = core.UnmarshalPrimitive(m, "protocol", &discValue)
	if err != nil {
		errMsg := fmt.Sprintf("error unmarshalling discriminator property 'protocol': %s", err.Error())
		err = core.SDKErrorf(err, errMsg, "discriminator-unmarshal-error", common.GetComponentInfo())
		return
	}
	if discValue == "" {
		err = core.SDKErrorf(err, "required discriminator property 'protocol' not found in JSON object", "missing-discriminator", common.GetComponentInfo())
		return
	}
	if discValue == "all" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleNetworkACLRuleProtocolAll)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleNetworkACLRuleProtocolAll-error", common.GetComponentInfo())
		}
	} else if discValue == "icmp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleNetworkACLRuleProtocolIcmp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleNetworkACLRuleProtocolIcmp-error", common.GetComponentInfo())
		}
	} else if discValue == "tcp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleNetworkACLRuleProtocolTcpudp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleNetworkACLRuleProtocolTcpudp-error", common.GetComponentInfo())
		}
	} else if discValue == "udp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleNetworkACLRuleProtocolTcpudp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleNetworkACLRuleProtocolTcpudp-error", common.GetComponentInfo())
		}
	} else {
		errMsg := fmt.Sprintf("unrecognized value for discriminator property 'protocol': %s", discValue)
		err = core.SDKErrorf(err, errMsg, "invalid-discriminator", common.GetComponentInfo())
	}
	return
}

// NetworkACLRuleBeforePatch : The rule to move this rule immediately before.
//
// Specify `null` to move this rule after all existing rules.
// Models which "extend" this model:
// - NetworkACLRuleBeforePatchNetworkACLRuleIdentityByID
// - NetworkACLRuleBeforePatchNetworkACLRuleIdentityByHref
type NetworkACLRuleBeforePatch struct {
	// The unique identifier for this network ACL rule.
	ID *string `json:"id,omitempty"`

	// The URL for this network ACL rule.
	Href *string `json:"href,omitempty"`
}

func (*NetworkACLRuleBeforePatch) isaNetworkACLRuleBeforePatch() bool {
	return true
}

type NetworkACLRuleBeforePatchIntf interface {
	isaNetworkACLRuleBeforePatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalNetworkACLRuleBeforePatch unmarshals an instance of NetworkACLRuleBeforePatch from the specified map of raw messages.
func UnmarshalNetworkACLRuleBeforePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRuleBeforePatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the NetworkACLRuleBeforePatch
func (networkACLRuleBeforePatch *NetworkACLRuleBeforePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(networkACLRuleBeforePatch.ID) {
		_patch["id"] = networkACLRuleBeforePatch.ID
	}
	if !core.IsNil(networkACLRuleBeforePatch.Href) {
		_patch["href"] = networkACLRuleBeforePatch.Href
	}

	return
}

// NetworkACLRuleBeforePrototype : The rule to insert this rule immediately before.
//
// If unspecified, this rule will be inserted after all existing rules.
// Models which "extend" this model:
// - NetworkACLRuleBeforePrototypeNetworkACLRuleIdentityByID
// - NetworkACLRuleBeforePrototypeNetworkACLRuleIdentityByHref
type NetworkACLRuleBeforePrototype struct {
	// The unique identifier for this network ACL rule.
	ID *string `json:"id,omitempty"`

	// The URL for this network ACL rule.
	Href *string `json:"href,omitempty"`
}

func (*NetworkACLRuleBeforePrototype) isaNetworkACLRuleBeforePrototype() bool {
	return true
}

type NetworkACLRuleBeforePrototypeIntf interface {
	isaNetworkACLRuleBeforePrototype() bool
}

// UnmarshalNetworkACLRuleBeforePrototype unmarshals an instance of NetworkACLRuleBeforePrototype from the specified map of raw messages.
func UnmarshalNetworkACLRuleBeforePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRuleBeforePrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACLRuleCollection : NetworkACLRuleCollection struct
type NetworkACLRuleCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of ordered rules (sorted based on the `before` property) for the network ACL.
	Rules []NetworkACLRuleItemIntf `json:"rules" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalNetworkACLRuleCollection unmarshals an instance of NetworkACLRuleCollection from the specified map of raw messages.
func UnmarshalNetworkACLRuleCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRuleCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalNetworkACLRuleItem)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *NetworkACLRuleCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// NetworkACLRuleItem : NetworkACLRuleItem struct
// Models which "extend" this model:
// - NetworkACLRuleItemNetworkACLRuleProtocolAll
// - NetworkACLRuleItemNetworkACLRuleProtocolIcmp
// - NetworkACLRuleItemNetworkACLRuleProtocolTcpudp
type NetworkACLRuleItem struct {
	// The action to perform for a packet matching the rule.
	Action *string `json:"action" validate:"required"`

	// The rule that this rule is immediately before. In a rule collection, this always
	// refers to the next item in the collection. If absent, this is the last rule.
	Before *NetworkACLRuleReference `json:"before,omitempty"`

	// The date and time that the rule was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The destination IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all destination addresses.
	Destination *string `json:"destination" validate:"required"`

	// The direction of traffic to match.
	Direction *string `json:"direction" validate:"required"`

	// The URL for this network ACL rule.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this network ACL rule.
	ID *string `json:"id" validate:"required"`

	// The IP version for this rule.
	IPVersion *string `json:"ip_version" validate:"required"`

	// The name for this network ACL rule. The name is unique across all rules for the network ACL.
	Name *string `json:"name" validate:"required"`

	// The network protocol.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Protocol *string `json:"protocol" validate:"required"`

	// The source IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all source addresses.
	Source *string `json:"source" validate:"required"`

	// The ICMP traffic code to match.
	//
	// If absent, all codes are matched.
	Code *int64 `json:"code,omitempty"`

	// The ICMP traffic type to match.
	//
	// If absent, all types are matched.
	Type *int64 `json:"type,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	DestinationPortMax *int64 `json:"destination_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	DestinationPortMin *int64 `json:"destination_port_min,omitempty"`

	// The inclusive upper bound of the TCP or UDP source port range.
	SourcePortMax *int64 `json:"source_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP source port range.
	SourcePortMin *int64 `json:"source_port_min,omitempty"`
}

// Constants associated with the NetworkACLRuleItem.Action property.
// The action to perform for a packet matching the rule.
const (
	NetworkACLRuleItemActionAllowConst = "allow"
	NetworkACLRuleItemActionDenyConst  = "deny"
)

// Constants associated with the NetworkACLRuleItem.Direction property.
// The direction of traffic to match.
const (
	NetworkACLRuleItemDirectionInboundConst  = "inbound"
	NetworkACLRuleItemDirectionOutboundConst = "outbound"
)

// Constants associated with the NetworkACLRuleItem.IPVersion property.
// The IP version for this rule.
const (
	NetworkACLRuleItemIPVersionIpv4Const = "ipv4"
)

// Constants associated with the NetworkACLRuleItem.Protocol property.
// The network protocol.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	NetworkACLRuleItemProtocolAllConst  = "all"
	NetworkACLRuleItemProtocolIcmpConst = "icmp"
	NetworkACLRuleItemProtocolTCPConst  = "tcp"
	NetworkACLRuleItemProtocolUDPConst  = "udp"
)

func (*NetworkACLRuleItem) isaNetworkACLRuleItem() bool {
	return true
}

type NetworkACLRuleItemIntf interface {
	isaNetworkACLRuleItem() bool
}

// UnmarshalNetworkACLRuleItem unmarshals an instance of NetworkACLRuleItem from the specified map of raw messages.
func UnmarshalNetworkACLRuleItem(m map[string]json.RawMessage, result interface{}) (err error) {
	// Retrieve discriminator value to determine correct "subclass".
	var discValue string
	err = core.UnmarshalPrimitive(m, "protocol", &discValue)
	if err != nil {
		errMsg := fmt.Sprintf("error unmarshalling discriminator property 'protocol': %s", err.Error())
		err = core.SDKErrorf(err, errMsg, "discriminator-unmarshal-error", common.GetComponentInfo())
		return
	}
	if discValue == "" {
		err = core.SDKErrorf(err, "required discriminator property 'protocol' not found in JSON object", "missing-discriminator", common.GetComponentInfo())
		return
	}
	if discValue == "all" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleItemNetworkACLRuleProtocolAll)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleItemNetworkACLRuleProtocolAll-error", common.GetComponentInfo())
		}
	} else if discValue == "icmp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleItemNetworkACLRuleProtocolIcmp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleItemNetworkACLRuleProtocolIcmp-error", common.GetComponentInfo())
		}
	} else if discValue == "tcp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleItemNetworkACLRuleProtocolTcpudp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleItemNetworkACLRuleProtocolTcpudp-error", common.GetComponentInfo())
		}
	} else if discValue == "udp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalNetworkACLRuleItemNetworkACLRuleProtocolTcpudp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-NetworkACLRuleItemNetworkACLRuleProtocolTcpudp-error", common.GetComponentInfo())
		}
	} else {
		errMsg := fmt.Sprintf("unrecognized value for discriminator property 'protocol': %s", discValue)
		err = core.SDKErrorf(err, errMsg, "invalid-discriminator", common.GetComponentInfo())
	}
	return
}

// NetworkACLRulePatch : NetworkACLRulePatch struct
type NetworkACLRulePatch struct {
	// The action to perform for a packet matching the rule.
	Action *string `json:"action,omitempty"`

	// The rule to move this rule immediately before.
	//
	// Specify `null` to move this rule after all existing rules.
	Before NetworkACLRuleBeforePatchIntf `json:"before,omitempty"`

	// The ICMP traffic code to match. If set, `type` must also be set.
	//
	// Specify `null` to remove an existing ICMP traffic code.
	Code *int64 `json:"code,omitempty"`

	// The destination IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all destination addresses.
	Destination *string `json:"destination,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	//
	// Must be larger than or equal to `destination_port_min`.
	DestinationPortMax *int64 `json:"destination_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	//
	// Must be smaller than or equal to `destination_port_max`.
	DestinationPortMin *int64 `json:"destination_port_min,omitempty"`

	// The direction of traffic to match.
	Direction *string `json:"direction,omitempty"`

	// The name for this network ACL rule. The name must not be used by another rule for the network ACL.
	Name *string `json:"name,omitempty"`

	// The source IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all source addresses.
	Source *string `json:"source,omitempty"`

	// The inclusive upper bound of the TCP or UDP source port range.
	//
	// Must be larger than or equal to `source_port_min`.
	SourcePortMax *int64 `json:"source_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP source port range.
	//
	// Must be smaller than or equal to `source_port_max`.
	SourcePortMin *int64 `json:"source_port_min,omitempty"`

	// The ICMP traffic type to match.
	//
	// Specify `null` to remove an existing ICMP traffic type value.
	Type *int64 `json:"type,omitempty"`
}

// Constants associated with the NetworkACLRulePatch.Action property.
// The action to perform for a packet matching the rule.
const (
	NetworkACLRulePatchActionAllowConst = "allow"
	NetworkACLRulePatchActionDenyConst  = "deny"
)

// Constants associated with the NetworkACLRulePatch.Direction property.
// The direction of traffic to match.
const (
	NetworkACLRulePatchDirectionInboundConst  = "inbound"
	NetworkACLRulePatchDirectionOutboundConst = "outbound"
)

// UnmarshalNetworkACLRulePatch unmarshals an instance of NetworkACLRulePatch from the specified map of raw messages.
func UnmarshalNetworkACLRulePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRulePatch)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "before", &obj.Before, UnmarshalNetworkACLRuleBeforePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "before-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination", &obj.Destination)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination_port_max", &obj.DestinationPortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination_port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination_port_min", &obj.DestinationPortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination_port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "direction", &obj.Direction)
	if err != nil {
		err = core.SDKErrorf(err, "", "direction-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source", &obj.Source)
	if err != nil {
		err = core.SDKErrorf(err, "", "source-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_port_max", &obj.SourcePortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_port_min", &obj.SourcePortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the NetworkACLRulePatch
func (networkACLRulePatch *NetworkACLRulePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(networkACLRulePatch.Action) {
		_patch["action"] = networkACLRulePatch.Action
	}
	if !core.IsNil(networkACLRulePatch.Before) {
		_patch["before"] = networkACLRulePatch.Before.asPatch()
	}
	if !core.IsNil(networkACLRulePatch.Code) {
		_patch["code"] = networkACLRulePatch.Code
	}
	if !core.IsNil(networkACLRulePatch.Destination) {
		_patch["destination"] = networkACLRulePatch.Destination
	}
	if !core.IsNil(networkACLRulePatch.DestinationPortMax) {
		_patch["destination_port_max"] = networkACLRulePatch.DestinationPortMax
	}
	if !core.IsNil(networkACLRulePatch.DestinationPortMin) {
		_patch["destination_port_min"] = networkACLRulePatch.DestinationPortMin
	}
	if !core.IsNil(networkACLRulePatch.Direction) {
		_patch["direction"] = networkACLRulePatch.Direction
	}
	if !core.IsNil(networkACLRulePatch.Name) {
		_patch["name"] = networkACLRulePatch.Name
	}
	if !core.IsNil(networkACLRulePatch.Source) {
		_patch["source"] = networkACLRulePatch.Source
	}
	if !core.IsNil(networkACLRulePatch.SourcePortMax) {
		_patch["source_port_max"] = networkACLRulePatch.SourcePortMax
	}
	if !core.IsNil(networkACLRulePatch.SourcePortMin) {
		_patch["source_port_min"] = networkACLRulePatch.SourcePortMin
	}
	if !core.IsNil(networkACLRulePatch.Type) {
		_patch["type"] = networkACLRulePatch.Type
	}

	return
}

// NetworkACLRulePrototype : NetworkACLRulePrototype struct
// Models which "extend" this model:
// - NetworkACLRulePrototypeNetworkACLRuleProtocolAllPrototype
// - NetworkACLRulePrototypeNetworkACLRuleProtocolIcmpPrototype
// - NetworkACLRulePrototypeNetworkACLRuleProtocolTcpudpPrototype
type NetworkACLRulePrototype struct {
	// The action to perform for a packet matching the rule.
	Action *string `json:"action" validate:"required"`

	// The rule to insert this rule immediately before.
	//
	// If unspecified, this rule will be inserted after all existing rules.
	Before NetworkACLRuleBeforePrototypeIntf `json:"before,omitempty"`

	// The destination IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all destination addresses.
	Destination *string `json:"destination" validate:"required"`

	// The direction of traffic to match.
	Direction *string `json:"direction" validate:"required"`

	// The IP version for this rule.
	IPVersion *string `json:"ip_version,omitempty"`

	// The name for this network ACL rule. The name must not be used by another rule for the network ACL. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The network protocol.
	Protocol *string `json:"protocol" validate:"required"`

	// The source IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all source addresses.
	Source *string `json:"source" validate:"required"`

	// The ICMP traffic code to match.
	//
	// If specified, `type` must also be specified.  If unspecified, all codes are matched.
	Code *int64 `json:"code,omitempty"`

	// The ICMP traffic type to match.
	//
	// If unspecified, all types are matched.
	Type *int64 `json:"type,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	//
	// If specified, `destination_port_min` must also be specified, and must not be larger. If unspecified,
	// `destination_port_min` must also be unspecified, allowing traffic for all destination ports.
	DestinationPortMax *int64 `json:"destination_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	//
	// If specified, `destination_port_max` must also be specified, and must not be smaller. If unspecified,
	// `destination_port_max` must also be unspecified, allowing traffic for all destination ports.
	DestinationPortMin *int64 `json:"destination_port_min,omitempty"`

	// The inclusive upper bound of the TCP or UDP source port range.
	//
	// If specified, `source_port_min` must also be specified, and must not be larger. If unspecified, `source_port_min`
	// must also be unspecified, allowing traffic for all source ports.
	SourcePortMax *int64 `json:"source_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP source port range.
	//
	// If specified, `source_port_max` must also be specified, and must not be smaller. If unspecified, `source_port_max`
	// must also be unspecified, allowing traffic for all source ports.
	SourcePortMin *int64 `json:"source_port_min,omitempty"`
}

// Constants associated with the NetworkACLRulePrototype.Action property.
// The action to perform for a packet matching the rule.
const (
	NetworkACLRulePrototypeActionAllowConst = "allow"
	NetworkACLRulePrototypeActionDenyConst  = "deny"
)

// Constants associated with the NetworkACLRulePrototype.Direction property.
// The direction of traffic to match.
const (
	NetworkACLRulePrototypeDirectionInboundConst  = "inbound"
	NetworkACLRulePrototypeDirectionOutboundConst = "outbound"
)

// Constants associated with the NetworkACLRulePrototype.IPVersion property.
// The IP version for this rule.
const (
	NetworkACLRulePrototypeIPVersionIpv4Const = "ipv4"
)

// Constants associated with the NetworkACLRulePrototype.Protocol property.
// The network protocol.
const (
	NetworkACLRulePrototypeProtocolAllConst  = "all"
	NetworkACLRulePrototypeProtocolIcmpConst = "icmp"
	NetworkACLRulePrototypeProtocolTCPConst  = "tcp"
	NetworkACLRulePrototypeProtocolUDPConst  = "udp"
)

func (*NetworkACLRulePrototype) isaNetworkACLRulePrototype() bool {
	return true
}

type NetworkACLRulePrototypeIntf interface {
	isaNetworkACLRulePrototype() bool
}

// UnmarshalNetworkACLRulePrototype unmarshals an instance of NetworkACLRulePrototype from the specified map of raw messages.
func UnmarshalNetworkACLRulePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRulePrototype)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "before", &obj.Before, UnmarshalNetworkACLRuleBeforePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "before-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination", &obj.Destination)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "direction", &obj.Direction)
	if err != nil {
		err = core.SDKErrorf(err, "", "direction-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source", &obj.Source)
	if err != nil {
		err = core.SDKErrorf(err, "", "source-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination_port_max", &obj.DestinationPortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination_port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination_port_min", &obj.DestinationPortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination_port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_port_max", &obj.SourcePortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_port_min", &obj.SourcePortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_port_min-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACLRulePrototypeNetworkACLContext : NetworkACLRulePrototypeNetworkACLContext struct
// Models which "extend" this model:
// - NetworkACLRulePrototypeNetworkACLContextNetworkACLRuleProtocolAllPrototype
// - NetworkACLRulePrototypeNetworkACLContextNetworkACLRuleProtocolIcmpPrototype
// - NetworkACLRulePrototypeNetworkACLContextNetworkACLRuleProtocolTcpudpPrototype
type NetworkACLRulePrototypeNetworkACLContext struct {
	// The action to perform for a packet matching the rule.
	Action *string `json:"action" validate:"required"`

	// The destination IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all destination addresses.
	Destination *string `json:"destination" validate:"required"`

	// The direction of traffic to match.
	Direction *string `json:"direction" validate:"required"`

	// The IP version for this rule.
	IPVersion *string `json:"ip_version,omitempty"`

	// The name for this network ACL rule. The name must not be used by another rule for the network ACL. If unspecified,
	// the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The network protocol.
	Protocol *string `json:"protocol" validate:"required"`

	// The source IP address or CIDR block to match. The CIDR block `0.0.0.0/0` matches all source addresses.
	Source *string `json:"source" validate:"required"`

	// The ICMP traffic code to match.
	//
	// If specified, `type` must also be specified.  If unspecified, all codes are matched.
	Code *int64 `json:"code,omitempty"`

	// The ICMP traffic type to match.
	//
	// If unspecified, all types are matched.
	Type *int64 `json:"type,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	//
	// If specified, `destination_port_min` must also be specified, and must not be larger. If unspecified,
	// `destination_port_min` must also be unspecified, allowing traffic for all destination ports.
	DestinationPortMax *int64 `json:"destination_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	//
	// If specified, `destination_port_max` must also be specified, and must not be smaller. If unspecified,
	// `destination_port_max` must also be unspecified, allowing traffic for all destination ports.
	DestinationPortMin *int64 `json:"destination_port_min,omitempty"`

	// The inclusive upper bound of the TCP or UDP source port range.
	//
	// If specified, `source_port_min` must also be specified, and must not be larger. If unspecified, `source_port_min`
	// must also be unspecified, allowing traffic for all source ports.
	SourcePortMax *int64 `json:"source_port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP source port range.
	//
	// If specified, `source_port_max` must also be specified, and must not be smaller. If unspecified, `source_port_max`
	// must also be unspecified, allowing traffic for all source ports.
	SourcePortMin *int64 `json:"source_port_min,omitempty"`
}

// Constants associated with the NetworkACLRulePrototypeNetworkACLContext.Action property.
// The action to perform for a packet matching the rule.
const (
	NetworkACLRulePrototypeNetworkACLContextActionAllowConst = "allow"
	NetworkACLRulePrototypeNetworkACLContextActionDenyConst  = "deny"
)

// Constants associated with the NetworkACLRulePrototypeNetworkACLContext.Direction property.
// The direction of traffic to match.
const (
	NetworkACLRulePrototypeNetworkACLContextDirectionInboundConst  = "inbound"
	NetworkACLRulePrototypeNetworkACLContextDirectionOutboundConst = "outbound"
)

// Constants associated with the NetworkACLRulePrototypeNetworkACLContext.IPVersion property.
// The IP version for this rule.
const (
	NetworkACLRulePrototypeNetworkACLContextIPVersionIpv4Const = "ipv4"
)

// Constants associated with the NetworkACLRulePrototypeNetworkACLContext.Protocol property.
// The network protocol.
const (
	NetworkACLRulePrototypeNetworkACLContextProtocolAllConst  = "all"
	NetworkACLRulePrototypeNetworkACLContextProtocolIcmpConst = "icmp"
	NetworkACLRulePrototypeNetworkACLContextProtocolTCPConst  = "tcp"
	NetworkACLRulePrototypeNetworkACLContextProtocolUDPConst  = "udp"
)

func (*NetworkACLRulePrototypeNetworkACLContext) isaNetworkACLRulePrototypeNetworkACLContext() bool {
	return true
}

type NetworkACLRulePrototypeNetworkACLContextIntf interface {
	isaNetworkACLRulePrototypeNetworkACLContext() bool
}

// UnmarshalNetworkACLRulePrototypeNetworkACLContext unmarshals an instance of NetworkACLRulePrototypeNetworkACLContext from the specified map of raw messages.
func UnmarshalNetworkACLRulePrototypeNetworkACLContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRulePrototypeNetworkACLContext)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination", &obj.Destination)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "direction", &obj.Direction)
	if err != nil {
		err = core.SDKErrorf(err, "", "direction-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source", &obj.Source)
	if err != nil {
		err = core.SDKErrorf(err, "", "source-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination_port_max", &obj.DestinationPortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination_port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination_port_min", &obj.DestinationPortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination_port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_port_max", &obj.SourcePortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "source_port_min", &obj.SourcePortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_port_min-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkACLRuleReference : NetworkACLRuleReference struct
type NetworkACLRuleReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this network ACL rule.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this network ACL rule.
	ID *string `json:"id" validate:"required"`

	// The name for this network ACL rule. The name is unique across all rules for the network ACL.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalNetworkACLRuleReference unmarshals an instance of NetworkACLRuleReference from the specified map of raw messages.
func UnmarshalNetworkACLRuleReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkACLRuleReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkInterface : NetworkInterface struct
type NetworkInterface struct {
	// Indicates whether source IP spoofing is allowed on this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing" validate:"required"`

	// The date and time that the instance network interface was created.
	//
	// If this instance has network attachments, this network interface was created as a [read-only
	// representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) when its corresponding
	// network attachment was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The floating IPs associated with this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the floating IPs are associated
	// with the attached virtual network interface.
	FloatingIps []FloatingIPReference `json:"floating_ips" validate:"required"`

	// The URL for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the name matches its corresponding
	// network attachment.
	Name *string `json:"name" validate:"required"`

	// The instance network interface port speed in Mbps.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the port speed is that of its
	// corresponding network attachment.
	PortSpeed *int64 `json:"port_speed" validate:"required"`

	// The primary IP address of this instance network interface.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The security groups targeting this instance network interface.
	//
	// If this instance has network attachments, this network interface is a [read-only
	// representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its corresponding network
	// attachment and its attached virtual network interface, and the security groups are associated with the attached
	// virtual network interface.
	SecurityGroups []SecurityGroupReference `json:"security_groups" validate:"required"`

	// The status of the instance network interface.
	//
	// If this instance has network attachments, this network interface is a read-only representation of its corresponding
	// network attachment and its attached virtual network interface, and the status is [computed from
	// them](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients).
	Status *string `json:"status" validate:"required"`

	// The associated subnet.
	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The instance network interface type.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the type is that of its
	// corresponding network attachment.
	Type *string `json:"type" validate:"required"`
}

// Constants associated with the NetworkInterface.ResourceType property.
// The resource type.
const (
	NetworkInterfaceResourceTypeNetworkInterfaceConst = "network_interface"
)

// Constants associated with the NetworkInterface.Status property.
// The status of the instance network interface.
//
// If this instance has network attachments, this network interface is a read-only representation of its corresponding
// network attachment and its attached virtual network interface, and the status is [computed from
// them](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients).
const (
	NetworkInterfaceStatusAvailableConst = "available"
	NetworkInterfaceStatusDeletingConst  = "deleting"
	NetworkInterfaceStatusFailedConst    = "failed"
	NetworkInterfaceStatusPendingConst   = "pending"
)

// Constants associated with the NetworkInterface.Type property.
// The instance network interface type.
//
// If this instance has network attachments, this network interface is a
// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
// corresponding network attachment and its attached virtual network interface, and the type is that of its
// corresponding network attachment.
const (
	NetworkInterfaceTypePrimaryConst   = "primary"
	NetworkInterfaceTypeSecondaryConst = "secondary"
)

// UnmarshalNetworkInterface unmarshals an instance of NetworkInterface from the specified map of raw messages.
func UnmarshalNetworkInterface(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterface)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "floating_ips", &obj.FloatingIps, UnmarshalFloatingIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "floating_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_speed", &obj.PortSpeed)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_speed-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkInterfaceBareMetalServerContextReference : NetworkInterfaceBareMetalServerContextReference struct
type NetworkInterfaceBareMetalServerContextReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this bare metal server network interface.
	Name *string `json:"name" validate:"required"`

	// The primary IP address of this bare metal server network interface.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The associated subnet.
	Subnet *SubnetReference `json:"subnet" validate:"required"`
}

// Constants associated with the NetworkInterfaceBareMetalServerContextReference.ResourceType property.
// The resource type.
const (
	NetworkInterfaceBareMetalServerContextReferenceResourceTypeNetworkInterfaceConst = "network_interface"
)

// UnmarshalNetworkInterfaceBareMetalServerContextReference unmarshals an instance of NetworkInterfaceBareMetalServerContextReference from the specified map of raw messages.
func UnmarshalNetworkInterfaceBareMetalServerContextReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterfaceBareMetalServerContextReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkInterfaceIPPrototype : NetworkInterfaceIPPrototype struct
// Models which "extend" this model:
// - NetworkInterfaceIPPrototypeReservedIPIdentity
// - NetworkInterfaceIPPrototypeReservedIPPrototypeNetworkInterfaceContext
type NetworkInterfaceIPPrototype struct {
	// The unique identifier for this reserved IP.
	ID *string `json:"id,omitempty"`

	// The URL for this reserved IP.
	Href *string `json:"href,omitempty"`

	// The IP address to reserve, which must not already be reserved on the subnet.
	//
	// If unspecified, an available address on the subnet will automatically be selected.
	Address *string `json:"address,omitempty"`

	// Indicates whether this reserved IP member will be automatically deleted when either
	// `target` is deleted, or the reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this reserved IP. The name must not be used by another reserved IP in the subnet. Names starting with
	// `ibm-` are reserved for provider-owned resources, and are not allowed. If unspecified, the name will be a hyphenated
	// list of randomly-selected words.
	Name *string `json:"name,omitempty"`
}

func (*NetworkInterfaceIPPrototype) isaNetworkInterfaceIPPrototype() bool {
	return true
}

type NetworkInterfaceIPPrototypeIntf interface {
	isaNetworkInterfaceIPPrototype() bool
}

// UnmarshalNetworkInterfaceIPPrototype unmarshals an instance of NetworkInterfaceIPPrototype from the specified map of raw messages.
func UnmarshalNetworkInterfaceIPPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterfaceIPPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkInterfaceInstanceContextReference : NetworkInterfaceInstanceContextReference struct
type NetworkInterfaceInstanceContextReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id" validate:"required"`

	// The name for this instance network interface.
	Name *string `json:"name" validate:"required"`

	// The primary IP address of this instance network interface.
	PrimaryIP *ReservedIPReference `json:"primary_ip" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The associated subnet.
	Subnet *SubnetReference `json:"subnet" validate:"required"`
}

// Constants associated with the NetworkInterfaceInstanceContextReference.ResourceType property.
// The resource type.
const (
	NetworkInterfaceInstanceContextReferenceResourceTypeNetworkInterfaceConst = "network_interface"
)

// UnmarshalNetworkInterfaceInstanceContextReference unmarshals an instance of NetworkInterfaceInstanceContextReference from the specified map of raw messages.
func UnmarshalNetworkInterfaceInstanceContextReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterfaceInstanceContextReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkInterfacePatch : NetworkInterfacePatch struct
type NetworkInterfacePatch struct {
	// Indicates whether source IP spoofing is allowed on this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// The name for the instance network interface. The name must not be used by another network interface on the virtual
	// server instance.
	Name *string `json:"name,omitempty"`
}

// UnmarshalNetworkInterfacePatch unmarshals an instance of NetworkInterfacePatch from the specified map of raw messages.
func UnmarshalNetworkInterfacePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterfacePatch)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the NetworkInterfacePatch
func (networkInterfacePatch *NetworkInterfacePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(networkInterfacePatch.AllowIPSpoofing) {
		_patch["allow_ip_spoofing"] = networkInterfacePatch.AllowIPSpoofing
	}
	if !core.IsNil(networkInterfacePatch.Name) {
		_patch["name"] = networkInterfacePatch.Name
	}

	return
}

// NetworkInterfacePrototype : NetworkInterfacePrototype struct
type NetworkInterfacePrototype struct {
	// Indicates whether source IP spoofing is allowed on this instance network interface.
	//
	// If this instance has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and source IP spoofing is managed on
	// the attached virtual network interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// The name for the instance network interface. The name must not be used by another network interface on the virtual
	// server instance. If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the instance network interface. This can be
	// specified using an existing reserved IP, or a prototype object for a new reserved IP.
	//
	// If an existing reserved IP or a prototype object with an address is specified, it must
	// be available on the instance network interface's subnet. Otherwise, an
	// available address on the subnet will be automatically selected and reserved.
	PrimaryIP NetworkInterfaceIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The security groups to use for this instance network interface. If unspecified, the VPC's default security group is
	// used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet.
	Subnet SubnetIdentityIntf `json:"subnet" validate:"required"`
}

// NewNetworkInterfacePrototype : Instantiate NetworkInterfacePrototype (Generic Model Constructor)
func (*VpcV1) NewNetworkInterfacePrototype(subnet SubnetIdentityIntf) (_model *NetworkInterfacePrototype, err error) {
	_model = &NetworkInterfacePrototype{
		Subnet: subnet,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalNetworkInterfacePrototype unmarshals an instance of NetworkInterfacePrototype from the specified map of raw messages.
func UnmarshalNetworkInterfacePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterfacePrototype)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalNetworkInterfaceIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// NetworkInterfaceUnpaginatedCollection : NetworkInterfaceUnpaginatedCollection struct
type NetworkInterfaceUnpaginatedCollection struct {
	// The network interfaces for the instance.
	NetworkInterfaces []NetworkInterface `json:"network_interfaces" validate:"required"`
}

// UnmarshalNetworkInterfaceUnpaginatedCollection unmarshals an instance of NetworkInterfaceUnpaginatedCollection from the specified map of raw messages.
func UnmarshalNetworkInterfaceUnpaginatedCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(NetworkInterfaceUnpaginatedCollection)
	err = core.UnmarshalModel(m, "network_interfaces", &obj.NetworkInterfaces, UnmarshalNetworkInterface)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_interfaces-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ObsoleteImageOptions : The ObsoleteImage options.
type ObsoleteImageOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewObsoleteImageOptions : Instantiate ObsoleteImageOptions
func (*VpcV1) NewObsoleteImageOptions(id string) *ObsoleteImageOptions {
	return &ObsoleteImageOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *ObsoleteImageOptions) SetID(id string) *ObsoleteImageOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ObsoleteImageOptions) SetHeaders(param map[string]string) *ObsoleteImageOptions {
	options.Headers = param
	return options
}

// OperatingSystem : OperatingSystem struct
type OperatingSystem struct {
	// Indicates that users may create new images with this operating system.
	AllowUserImageCreation *bool `json:"allow_user_image_creation" validate:"required"`

	// The operating system architecture.
	Architecture *string `json:"architecture" validate:"required"`

	// Indicates that images with this operating system can only be used on dedicated hosts and dedicated host groups.
	DedicatedHostOnly *bool `json:"dedicated_host_only" validate:"required"`

	// A unique, display-friendly name for the operating system.
	DisplayName *string `json:"display_name" validate:"required"`

	// The software family for this operating system.
	Family *string `json:"family" validate:"required"`

	// The URL for this operating system.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this operating system.
	Name *string `json:"name" validate:"required"`

	// The user data format for this operating system:
	// - `cloud_init`: `user_data` will be interpreted according to the cloud-init standard
	// - `esxi_kickstart`: `user_data` will be interpreted as a VMware ESXi installation script
	// - `ipxe`: `user_data` will be interpreted as a single URL to an iPXE script or as the
	//   text of an iPXE script.
	UserDataFormat *string `json:"user_data_format" validate:"required"`

	// The vendor of the operating system.
	Vendor *string `json:"vendor" validate:"required"`

	// The major release version of this operating system.
	Version *string `json:"version" validate:"required"`
}

// Constants associated with the OperatingSystem.UserDataFormat property.
// The user data format for this operating system:
//   - `cloud_init`: `user_data` will be interpreted according to the cloud-init standard
//   - `esxi_kickstart`: `user_data` will be interpreted as a VMware ESXi installation script
//   - `ipxe`: `user_data` will be interpreted as a single URL to an iPXE script or as the
//     text of an iPXE script.
const (
	OperatingSystemUserDataFormatCloudInitConst     = "cloud_init"
	OperatingSystemUserDataFormatEsxiKickstartConst = "esxi_kickstart"
	OperatingSystemUserDataFormatIpxeConst          = "ipxe"
)

// UnmarshalOperatingSystem unmarshals an instance of OperatingSystem from the specified map of raw messages.
func UnmarshalOperatingSystem(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(OperatingSystem)
	err = core.UnmarshalPrimitive(m, "allow_user_image_creation", &obj.AllowUserImageCreation)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_user_image_creation-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "architecture", &obj.Architecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "dedicated_host_only", &obj.DedicatedHostOnly)
	if err != nil {
		err = core.SDKErrorf(err, "", "dedicated_host_only-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "display_name", &obj.DisplayName)
	if err != nil {
		err = core.SDKErrorf(err, "", "display_name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_data_format", &obj.UserDataFormat)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_data_format-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "vendor", &obj.Vendor)
	if err != nil {
		err = core.SDKErrorf(err, "", "vendor-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "version", &obj.Version)
	if err != nil {
		err = core.SDKErrorf(err, "", "version-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// OperatingSystemCollection : OperatingSystemCollection struct
type OperatingSystemCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of operating systems.
	OperatingSystems []OperatingSystem `json:"operating_systems" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalOperatingSystemCollection unmarshals an instance of OperatingSystemCollection from the specified map of raw messages.
func UnmarshalOperatingSystemCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(OperatingSystemCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "operating_systems", &obj.OperatingSystems, UnmarshalOperatingSystem)
	if err != nil {
		err = core.SDKErrorf(err, "", "operating_systems-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *OperatingSystemCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// OperatingSystemIdentity : Identifies an operating system by a unique property.
// Models which "extend" this model:
// - OperatingSystemIdentityByName
// - OperatingSystemIdentityByHref
type OperatingSystemIdentity struct {
	// The globally unique name for this operating system.
	Name *string `json:"name,omitempty"`

	// The URL for this operating system.
	Href *string `json:"href,omitempty"`
}

func (*OperatingSystemIdentity) isaOperatingSystemIdentity() bool {
	return true
}

type OperatingSystemIdentityIntf interface {
	isaOperatingSystemIdentity() bool
}

// UnmarshalOperatingSystemIdentity unmarshals an instance of OperatingSystemIdentity from the specified map of raw messages.
func UnmarshalOperatingSystemIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(OperatingSystemIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PageLink : PageLink struct
type PageLink struct {
	// The URL for a page of resources.
	Href *string `json:"href" validate:"required"`
}

// UnmarshalPageLink unmarshals an instance of PageLink from the specified map of raw messages.
func UnmarshalPageLink(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PageLink)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions : The PermitPrivatePathServiceGatewayEndpointGatewayBinding options.
type PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The endpoint gateway binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Indicates whether this will become the access policy for any `pending` and future endpoint gateway bindings from the
	// same account.
	//
	// If set to `true`:
	//
	// - If the account has an existing access policy, that policy will be updated to
	//   `permit`. Otherwise, a new `permit` access policy will be created for the account.
	// - All `pending` endpoint gateway bindings for the account will be permitted.
	//
	// If set to `false`:
	//
	// - No access policies will be created or updated
	// - All `pending` endpoint gateway bindings for the account will remain `pending`.
	SetAccountPolicy *bool `json:"set_account_policy,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewPermitPrivatePathServiceGatewayEndpointGatewayBindingOptions : Instantiate PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions
func (*VpcV1) NewPermitPrivatePathServiceGatewayEndpointGatewayBindingOptions(privatePathServiceGatewayID string, id string) *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	return &PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		ID:                          core.StringPtr(id),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetID(id string) *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSetAccountPolicy : Allow user to set SetAccountPolicy
func (_options *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetSetAccountPolicy(setAccountPolicy bool) *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	_options.SetAccountPolicy = core.BoolPtr(setAccountPolicy)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions) SetHeaders(param map[string]string) *PermitPrivatePathServiceGatewayEndpointGatewayBindingOptions {
	options.Headers = param
	return options
}

// PlacementGroup : PlacementGroup struct
type PlacementGroup struct {
	// The date and time that the placement group was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this placement group.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this placement group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this placement group.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the placement group.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this placement group. The name is unique across all placement groups in the region.
	Name *string `json:"name" validate:"required"`

	// The resource group for this placement group.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The strategy for this placement group:
	// - `host_spread`: place on different compute hosts
	// - `power_spread`: place on compute hosts that use different power sources
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Strategy *string `json:"strategy" validate:"required"`
}

// Constants associated with the PlacementGroup.LifecycleState property.
// The lifecycle state of the placement group.
const (
	PlacementGroupLifecycleStateDeletingConst  = "deleting"
	PlacementGroupLifecycleStateFailedConst    = "failed"
	PlacementGroupLifecycleStatePendingConst   = "pending"
	PlacementGroupLifecycleStateStableConst    = "stable"
	PlacementGroupLifecycleStateSuspendedConst = "suspended"
	PlacementGroupLifecycleStateUpdatingConst  = "updating"
	PlacementGroupLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the PlacementGroup.ResourceType property.
// The resource type.
const (
	PlacementGroupResourceTypePlacementGroupConst = "placement_group"
)

// Constants associated with the PlacementGroup.Strategy property.
// The strategy for this placement group:
// - `host_spread`: place on different compute hosts
// - `power_spread`: place on compute hosts that use different power sources
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	PlacementGroupStrategyHostSpreadConst  = "host_spread"
	PlacementGroupStrategyPowerSpreadConst = "power_spread"
)

// UnmarshalPlacementGroup unmarshals an instance of PlacementGroup from the specified map of raw messages.
func UnmarshalPlacementGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PlacementGroup)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "strategy", &obj.Strategy)
	if err != nil {
		err = core.SDKErrorf(err, "", "strategy-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PlacementGroupCollection : PlacementGroupCollection struct
type PlacementGroupCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of placement groups.
	PlacementGroups []PlacementGroup `json:"placement_groups" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalPlacementGroupCollection unmarshals an instance of PlacementGroupCollection from the specified map of raw messages.
func UnmarshalPlacementGroupCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PlacementGroupCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "placement_groups", &obj.PlacementGroups, UnmarshalPlacementGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "placement_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *PlacementGroupCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// PlacementGroupPatch : PlacementGroupPatch struct
type PlacementGroupPatch struct {
	// The name for this placement group. The name must not be used by another placement group in the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalPlacementGroupPatch unmarshals an instance of PlacementGroupPatch from the specified map of raw messages.
func UnmarshalPlacementGroupPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PlacementGroupPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the PlacementGroupPatch
func (placementGroupPatch *PlacementGroupPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(placementGroupPatch.Name) {
		_patch["name"] = placementGroupPatch.Name
	}

	return
}

// PrivatePathServiceGateway : PrivatePathServiceGateway struct
type PrivatePathServiceGateway struct {
	// The date and time that the private path service gateway was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this private path service gateway.
	CRN *string `json:"crn" validate:"required"`

	// The policy to use for bindings from accounts without an explicit account policy.
	DefaultAccessPolicy *string `json:"default_access_policy" validate:"required"`

	// Indicates whether endpoint gateway bindings will be automatically deleted after
	// `endpoint_gateway_binding_auto_delete_timeout` hours have passed. At present, this is always `true`, but may be
	// modifiable in the future.
	EndpointGatewayBindingAutoDelete *bool `json:"endpoint_gateway_binding_auto_delete" validate:"required"`

	// If `endpoint_gateway_binding_auto_delete` is `true`, the hours after which endpoint gateway bindings will be
	// automatically deleted. If the value is `0`, `abandoned` endpoint gateway bindings will be deleted immediately. At
	// present, this is always set to `0`. This value may be modifiable in the future.
	EndpointGatewayBindingAutoDeleteTimeout *int64 `json:"endpoint_gateway_binding_auto_delete_timeout" validate:"required"`

	// The number of active endpoint gateways using this private path service gateway.
	EndpointGatewayCount *int64 `json:"endpoint_gateway_count" validate:"required"`

	// The URL for this private path service gateway.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this private path service gateway.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the private path service gateway.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The load balancer for this private path service gateway.
	LoadBalancer *LoadBalancerReference `json:"load_balancer" validate:"required"`

	// The name for this private path service gateway. The name is unique across all private path service gateways in the
	// VPC.
	Name *string `json:"name" validate:"required"`

	// Indicates the availability of this private path service gateway
	// - `true`: Any account can request access to this private path service gateway.
	// - `false`: Access is restricted to the account that created this private path service gateway.
	Published *bool `json:"published" validate:"required"`

	// The resource group for this private path service gateway.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The fully qualified domain names for this private path service gateway. The domains are used for endpoint gateways
	// to connect to the service and are configured in the VPC for each endpoint gateway.
	ServiceEndpoints []string `json:"service_endpoints" validate:"required"`

	// The VPC this private path service gateway resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// Indicates whether this private path service gateway has zonal affinity.
	// - `true`:  Traffic to the service from a zone the service resides in will remain in
	//            that zone.
	// - `false`: Traffic to the service from a zone will be load balanced across all zones
	//            in the region the service resides in.
	ZonalAffinity *bool `json:"zonal_affinity" validate:"required"`
}

// Constants associated with the PrivatePathServiceGateway.DefaultAccessPolicy property.
// The policy to use for bindings from accounts without an explicit account policy.
const (
	PrivatePathServiceGatewayDefaultAccessPolicyDenyConst   = "deny"
	PrivatePathServiceGatewayDefaultAccessPolicyPermitConst = "permit"
	PrivatePathServiceGatewayDefaultAccessPolicyReviewConst = "review"
)

// Constants associated with the PrivatePathServiceGateway.LifecycleState property.
// The lifecycle state of the private path service gateway.
const (
	PrivatePathServiceGatewayLifecycleStateDeletingConst  = "deleting"
	PrivatePathServiceGatewayLifecycleStateFailedConst    = "failed"
	PrivatePathServiceGatewayLifecycleStatePendingConst   = "pending"
	PrivatePathServiceGatewayLifecycleStateStableConst    = "stable"
	PrivatePathServiceGatewayLifecycleStateSuspendedConst = "suspended"
	PrivatePathServiceGatewayLifecycleStateUpdatingConst  = "updating"
	PrivatePathServiceGatewayLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the PrivatePathServiceGateway.ResourceType property.
// The resource type.
const (
	PrivatePathServiceGatewayResourceTypePrivatePathServiceGatewayConst = "private_path_service_gateway"
)

// UnmarshalPrivatePathServiceGateway unmarshals an instance of PrivatePathServiceGateway from the specified map of raw messages.
func UnmarshalPrivatePathServiceGateway(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGateway)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default_access_policy", &obj.DefaultAccessPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_access_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "endpoint_gateway_binding_auto_delete", &obj.EndpointGatewayBindingAutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint_gateway_binding_auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "endpoint_gateway_binding_auto_delete_timeout", &obj.EndpointGatewayBindingAutoDeleteTimeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint_gateway_binding_auto_delete_timeout-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "endpoint_gateway_count", &obj.EndpointGatewayCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint_gateway_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "load_balancer", &obj.LoadBalancer, UnmarshalLoadBalancerReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "load_balancer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "published", &obj.Published)
	if err != nil {
		err = core.SDKErrorf(err, "", "published-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "service_endpoints", &obj.ServiceEndpoints)
	if err != nil {
		err = core.SDKErrorf(err, "", "service_endpoints-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "zonal_affinity", &obj.ZonalAffinity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zonal_affinity-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PrivatePathServiceGatewayAccountPolicy : PrivatePathServiceGatewayAccountPolicy struct
type PrivatePathServiceGatewayAccountPolicy struct {
	// The access policy for the account:
	// - permit: access will be permitted
	// - deny:  access will be denied
	// - review: access will be manually reviewed
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AccessPolicy *string `json:"access_policy" validate:"required"`

	// The account for this access policy.
	Account *AccountReference `json:"account" validate:"required"`

	// The date and time that the account policy was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this account policy.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this account policy.
	ID *string `json:"id" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the PrivatePathServiceGatewayAccountPolicy.AccessPolicy property.
// The access policy for the account:
// - permit: access will be permitted
// - deny:  access will be denied
// - review: access will be manually reviewed
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	PrivatePathServiceGatewayAccountPolicyAccessPolicyDenyConst   = "deny"
	PrivatePathServiceGatewayAccountPolicyAccessPolicyPermitConst = "permit"
	PrivatePathServiceGatewayAccountPolicyAccessPolicyReviewConst = "review"
)

// Constants associated with the PrivatePathServiceGatewayAccountPolicy.ResourceType property.
// The resource type.
const (
	PrivatePathServiceGatewayAccountPolicyResourceTypePrivatePathServiceGatewayAccountPolicyConst = "private_path_service_gateway_account_policy"
)

// UnmarshalPrivatePathServiceGatewayAccountPolicy unmarshals an instance of PrivatePathServiceGatewayAccountPolicy from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayAccountPolicy(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayAccountPolicy)
	err = core.UnmarshalPrimitive(m, "access_policy", &obj.AccessPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PrivatePathServiceGatewayAccountPolicyCollection : PrivatePathServiceGatewayAccountPolicyCollection struct
type PrivatePathServiceGatewayAccountPolicyCollection struct {
	// A page of account policies for the private path service gateway.
	AccountPolicies []PrivatePathServiceGatewayAccountPolicy `json:"account_policies" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalPrivatePathServiceGatewayAccountPolicyCollection unmarshals an instance of PrivatePathServiceGatewayAccountPolicyCollection from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayAccountPolicyCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayAccountPolicyCollection)
	err = core.UnmarshalModel(m, "account_policies", &obj.AccountPolicies, UnmarshalPrivatePathServiceGatewayAccountPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "account_policies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *PrivatePathServiceGatewayAccountPolicyCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// PrivatePathServiceGatewayAccountPolicyPatch : PrivatePathServiceGatewayAccountPolicyPatch struct
type PrivatePathServiceGatewayAccountPolicyPatch struct {
	// The access policy for the account. Updating the access policy only affects pending and future endpoint gateway
	// bindings.
	// - permit: access will be permitted
	// - deny: access will be denied
	// - review: access will be manually reviewed
	//
	// - Updating to `review` sets the status of future endpoint gateway bindings from
	//    this account to `pending`.
	// - Updating to `permit` updates both the status of any `pending` and future endpoint
	//   gateway bindings from this account to `permitted`.
	// - Updating to `deny` updates both the status of any `pending` and future endpoint
	//   gateway bindings from this account to `denied`.
	AccessPolicy *string `json:"access_policy,omitempty"`
}

// Constants associated with the PrivatePathServiceGatewayAccountPolicyPatch.AccessPolicy property.
// The access policy for the account. Updating the access policy only affects pending and future endpoint gateway
// bindings.
// - permit: access will be permitted
// - deny: access will be denied
// - review: access will be manually reviewed
//
//   - Updating to `review` sets the status of future endpoint gateway bindings from
//     this account to `pending`.
//   - Updating to `permit` updates both the status of any `pending` and future endpoint
//     gateway bindings from this account to `permitted`.
//   - Updating to `deny` updates both the status of any `pending` and future endpoint
//     gateway bindings from this account to `denied`.
const (
	PrivatePathServiceGatewayAccountPolicyPatchAccessPolicyDenyConst   = "deny"
	PrivatePathServiceGatewayAccountPolicyPatchAccessPolicyPermitConst = "permit"
	PrivatePathServiceGatewayAccountPolicyPatchAccessPolicyReviewConst = "review"
)

// UnmarshalPrivatePathServiceGatewayAccountPolicyPatch unmarshals an instance of PrivatePathServiceGatewayAccountPolicyPatch from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayAccountPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayAccountPolicyPatch)
	err = core.UnmarshalPrimitive(m, "access_policy", &obj.AccessPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_policy-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the PrivatePathServiceGatewayAccountPolicyPatch
func (privatePathServiceGatewayAccountPolicyPatch *PrivatePathServiceGatewayAccountPolicyPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(privatePathServiceGatewayAccountPolicyPatch.AccessPolicy) {
		_patch["access_policy"] = privatePathServiceGatewayAccountPolicyPatch.AccessPolicy
	}

	return
}

// PrivatePathServiceGatewayCollection : PrivatePathServiceGatewayCollection struct
type PrivatePathServiceGatewayCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of private path service gateways.
	PrivatePathServiceGateways []PrivatePathServiceGateway `json:"private_path_service_gateways" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalPrivatePathServiceGatewayCollection unmarshals an instance of PrivatePathServiceGatewayCollection from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "private_path_service_gateways", &obj.PrivatePathServiceGateways, UnmarshalPrivatePathServiceGateway)
	if err != nil {
		err = core.SDKErrorf(err, "", "private_path_service_gateways-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *PrivatePathServiceGatewayCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// PrivatePathServiceGatewayEndpointGatewayBinding : PrivatePathServiceGatewayEndpointGatewayBinding struct
type PrivatePathServiceGatewayEndpointGatewayBinding struct {
	// The account that created the endpoint gateway.
	Account *AccountReference `json:"account" validate:"required"`

	// The date and time that the endpoint gateway binding was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The expiration date and time for the endpoint gateway binding. At binding creation, this property will be set to 14
	// days after the creation time, and will remain while the `status` of the binding is `pending`. If the date and time
	// are reached while the binding is still `pending`, the binding will transition to `expired`.
	//
	// This property will be present if the `status` is `pending` or `expired`.
	ExpirationAt *strfmt.DateTime `json:"expiration_at,omitempty"`

	// The URL for this endpoint gateway binding.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this endpoint gateway binding.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the endpoint gateway binding.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of the endpoint gateway binding:
	// - `abandoned`: endpoint gateway binding is inactive, awaiting deletion.
	// - `denied`: endpoint gateway binding was denied
	// - `expired`: endpoint gateway binding has expired
	// - `pending`: endpoint gateway binding is awaiting review
	// - `permitted`: endpoint gateway binding was permitted
	//
	// An endpoint gateway binding will be automatically deleted when its associated endpoint gateway is deleted.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`
}

// Constants associated with the PrivatePathServiceGatewayEndpointGatewayBinding.LifecycleState property.
// The lifecycle state of the endpoint gateway binding.
const (
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStateDeletingConst  = "deleting"
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStateFailedConst    = "failed"
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStatePendingConst   = "pending"
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStateStableConst    = "stable"
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStateSuspendedConst = "suspended"
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStateUpdatingConst  = "updating"
	PrivatePathServiceGatewayEndpointGatewayBindingLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the PrivatePathServiceGatewayEndpointGatewayBinding.ResourceType property.
// The resource type.
const (
	PrivatePathServiceGatewayEndpointGatewayBindingResourceTypePrivatePathServiceGatewayEndpointGatewayBindingConst = "private_path_service_gateway_endpoint_gateway_binding"
)

// Constants associated with the PrivatePathServiceGatewayEndpointGatewayBinding.Status property.
// The status of the endpoint gateway binding:
// - `abandoned`: endpoint gateway binding is inactive, awaiting deletion.
// - `denied`: endpoint gateway binding was denied
// - `expired`: endpoint gateway binding has expired
// - `pending`: endpoint gateway binding is awaiting review
// - `permitted`: endpoint gateway binding was permitted
//
// An endpoint gateway binding will be automatically deleted when its associated endpoint gateway is deleted.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	PrivatePathServiceGatewayEndpointGatewayBindingStatusAbandonedConst = "abandoned"
	PrivatePathServiceGatewayEndpointGatewayBindingStatusDeniedConst    = "denied"
	PrivatePathServiceGatewayEndpointGatewayBindingStatusExpiredConst   = "expired"
	PrivatePathServiceGatewayEndpointGatewayBindingStatusPendingConst   = "pending"
	PrivatePathServiceGatewayEndpointGatewayBindingStatusPermittedConst = "permitted"
)

// UnmarshalPrivatePathServiceGatewayEndpointGatewayBinding unmarshals an instance of PrivatePathServiceGatewayEndpointGatewayBinding from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayEndpointGatewayBinding(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayEndpointGatewayBinding)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "expiration_at", &obj.ExpirationAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "expiration_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PrivatePathServiceGatewayEndpointGatewayBindingCollection : PrivatePathServiceGatewayEndpointGatewayBindingCollection struct
type PrivatePathServiceGatewayEndpointGatewayBindingCollection struct {
	// A page of endpoint gateway bindings for the private path service gateway.
	EndpointGatewayBindings []PrivatePathServiceGatewayEndpointGatewayBinding `json:"endpoint_gateway_bindings" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalPrivatePathServiceGatewayEndpointGatewayBindingCollection unmarshals an instance of PrivatePathServiceGatewayEndpointGatewayBindingCollection from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayEndpointGatewayBindingCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayEndpointGatewayBindingCollection)
	err = core.UnmarshalModel(m, "endpoint_gateway_bindings", &obj.EndpointGatewayBindings, UnmarshalPrivatePathServiceGatewayEndpointGatewayBinding)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint_gateway_bindings-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *PrivatePathServiceGatewayEndpointGatewayBindingCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// PrivatePathServiceGatewayPatch : PrivatePathServiceGatewayPatch struct
type PrivatePathServiceGatewayPatch struct {
	// The policy to use for bindings from accounts without an explicit account policy.
	DefaultAccessPolicy *string `json:"default_access_policy,omitempty"`

	// The load balancer for this private path service gateway. The load balancer must
	// have `is_private_path` set to `true`, and must be in the same VPC as the private
	// path service gateway.
	LoadBalancer LoadBalancerIdentityIntf `json:"load_balancer,omitempty"`

	// The name for this private path service gateway. The name must not be used by another private path service gateway in
	// the VPC.
	Name *string `json:"name,omitempty"`

	// Indicates whether this private path service gateway has zonal affinity.
	//
	// Updating the value of `zonal_affinity` changes how traffic for existing and future endpoint gateway bindings will be
	// routed:
	// - `true`:  Traffic to the service from a zone the service resides in will remain in
	//            that zone.
	// - `false`: Traffic to the service from a zone will be load balanced across all zones
	//            in the region the service resides in.
	ZonalAffinity *bool `json:"zonal_affinity,omitempty"`
}

// Constants associated with the PrivatePathServiceGatewayPatch.DefaultAccessPolicy property.
// The policy to use for bindings from accounts without an explicit account policy.
const (
	PrivatePathServiceGatewayPatchDefaultAccessPolicyDenyConst   = "deny"
	PrivatePathServiceGatewayPatchDefaultAccessPolicyPermitConst = "permit"
	PrivatePathServiceGatewayPatchDefaultAccessPolicyReviewConst = "review"
)

// UnmarshalPrivatePathServiceGatewayPatch unmarshals an instance of PrivatePathServiceGatewayPatch from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayPatch)
	err = core.UnmarshalPrimitive(m, "default_access_policy", &obj.DefaultAccessPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_access_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "load_balancer", &obj.LoadBalancer, UnmarshalLoadBalancerIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "load_balancer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "zonal_affinity", &obj.ZonalAffinity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zonal_affinity-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the PrivatePathServiceGatewayPatch
func (privatePathServiceGatewayPatch *PrivatePathServiceGatewayPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(privatePathServiceGatewayPatch.DefaultAccessPolicy) {
		_patch["default_access_policy"] = privatePathServiceGatewayPatch.DefaultAccessPolicy
	}
	if !core.IsNil(privatePathServiceGatewayPatch.LoadBalancer) {
		_patch["load_balancer"] = privatePathServiceGatewayPatch.LoadBalancer.asPatch()
	}
	if !core.IsNil(privatePathServiceGatewayPatch.Name) {
		_patch["name"] = privatePathServiceGatewayPatch.Name
	}
	if !core.IsNil(privatePathServiceGatewayPatch.ZonalAffinity) {
		_patch["zonal_affinity"] = privatePathServiceGatewayPatch.ZonalAffinity
	}

	return
}

// PrivatePathServiceGatewayRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type PrivatePathServiceGatewayRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`

	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalPrivatePathServiceGatewayRemote unmarshals an instance of PrivatePathServiceGatewayRemote from the specified map of raw messages.
func UnmarshalPrivatePathServiceGatewayRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PrivatePathServiceGatewayRemote)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicAddressRange : PublicAddressRange struct
type PublicAddressRange struct {
	// The public IPv4 range, expressed in CIDR format.
	CIDR *string `json:"cidr" validate:"required"`

	// The date and time that the public address range was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this public address range.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this public address range.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this public address range.
	ID *string `json:"id" validate:"required"`

	// The number of IPv4 addresses in this public address range.
	Ipv4AddressCount *int64 `json:"ipv4_address_count" validate:"required"`

	// The lifecycle state of the public address range.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this public address range. The name is unique across all public address ranges in the region.
	Name *string `json:"name" validate:"required"`

	// The resource group for this public address range.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The target this public address range is bound to.
	//
	// If absent, this pubic address range is not bound to a target.
	//
	// The target resources supported by this property is expected to
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future. Future
	// targets may omit the `vpc` property.
	Target *PublicAddressRangeTarget `json:"target,omitempty"`
}

// Constants associated with the PublicAddressRange.LifecycleState property.
// The lifecycle state of the public address range.
const (
	PublicAddressRangeLifecycleStateDeletingConst  = "deleting"
	PublicAddressRangeLifecycleStateFailedConst    = "failed"
	PublicAddressRangeLifecycleStatePendingConst   = "pending"
	PublicAddressRangeLifecycleStateStableConst    = "stable"
	PublicAddressRangeLifecycleStateSuspendedConst = "suspended"
	PublicAddressRangeLifecycleStateUpdatingConst  = "updating"
	PublicAddressRangeLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the PublicAddressRange.ResourceType property.
// The resource type.
const (
	PublicAddressRangeResourceTypePublicAddressRangeConst = "public_address_range"
)

// UnmarshalPublicAddressRange unmarshals an instance of PublicAddressRange from the specified map of raw messages.
func UnmarshalPublicAddressRange(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRange)
	err = core.UnmarshalPrimitive(m, "cidr", &obj.CIDR)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ipv4_address_count", &obj.Ipv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalPublicAddressRangeTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicAddressRangeCollection : PublicAddressRangeCollection struct
type PublicAddressRangeCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of public address ranges.
	PublicAddressRanges []PublicAddressRange `json:"public_address_ranges" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalPublicAddressRangeCollection unmarshals an instance of PublicAddressRangeCollection from the specified map of raw messages.
func UnmarshalPublicAddressRangeCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRangeCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_address_ranges", &obj.PublicAddressRanges, UnmarshalPublicAddressRange)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_address_ranges-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *PublicAddressRangeCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// PublicAddressRangePatch : PublicAddressRangePatch struct
type PublicAddressRangePatch struct {
	// The name for this public address range. The name must not be used by another public address range in the region.
	Name *string `json:"name,omitempty"`

	// The target to bind this public address range to.
	//
	// If the public address range is not currently bound to a target, both `target.vpc` and
	// `target.zone` must be specified.
	//
	// Specify `null` to unbind the public address range from any existing target.
	Target *PublicAddressRangeTargetPatch `json:"target,omitempty"`
}

// UnmarshalPublicAddressRangePatch unmarshals an instance of PublicAddressRangePatch from the specified map of raw messages.
func UnmarshalPublicAddressRangePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRangePatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalPublicAddressRangeTargetPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the PublicAddressRangePatch
func (publicAddressRangePatch *PublicAddressRangePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(publicAddressRangePatch.Name) {
		_patch["name"] = publicAddressRangePatch.Name
	}
	if !core.IsNil(publicAddressRangePatch.Target) {
		_patch["target"] = publicAddressRangePatch.Target.asPatch()
	}

	return
}

// PublicAddressRangeReference : PublicAddressRangeReference struct
type PublicAddressRangeReference struct {
	// The CRN for this public address range.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this public address range.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this public address range.
	ID *string `json:"id" validate:"required"`

	// The name for this public address range. The name is unique across all public address ranges in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the PublicAddressRangeReference.ResourceType property.
// The resource type.
const (
	PublicAddressRangeReferenceResourceTypePublicAddressRangeConst = "public_address_range"
)

// UnmarshalPublicAddressRangeReference unmarshals an instance of PublicAddressRangeReference from the specified map of raw messages.
func UnmarshalPublicAddressRangeReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRangeReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicAddressRangeTarget : The target this public address range is bound to.
//
// If absent, this pubic address range is not bound to a target.
//
// The target resources supported by this property is expected to
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future. Future targets may omit the `vpc`
// property.
type PublicAddressRangeTarget struct {
	// The VPC this public address range is bound to.
	VPC *VPCReference `json:"vpc,omitempty"`

	// The zone this public address range resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// UnmarshalPublicAddressRangeTarget unmarshals an instance of PublicAddressRangeTarget from the specified map of raw messages.
func UnmarshalPublicAddressRangeTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRangeTarget)
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicAddressRangeTargetPatch : The target to bind this public address range to.
//
// If the public address range is not currently bound to a target, both `target.vpc` and
// `target.zone` must be specified.
//
// Specify `null` to unbind the public address range from any existing target.
type PublicAddressRangeTargetPatch struct {
	// The VPC to bind this public address range to, replacing any existing VPC.
	VPC VPCIdentityIntf `json:"vpc,omitempty"`

	// The zone this public address range will reside in, replacing any existing zone.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`
}

// UnmarshalPublicAddressRangeTargetPatch unmarshals an instance of PublicAddressRangeTargetPatch from the specified map of raw messages.
func UnmarshalPublicAddressRangeTargetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRangeTargetPatch)
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the PublicAddressRangeTargetPatch
func (publicAddressRangeTargetPatch *PublicAddressRangeTargetPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(publicAddressRangeTargetPatch.VPC) {
		_patch["vpc"] = publicAddressRangeTargetPatch.VPC.asPatch()
	}
	if !core.IsNil(publicAddressRangeTargetPatch.Zone) {
		_patch["zone"] = publicAddressRangeTargetPatch.Zone.asPatch()
	}

	return
}

// PublicAddressRangeTargetPrototype : The target to bind this public address range to. If unspecified, the public address range will not be bound to a
// target at creation.
type PublicAddressRangeTargetPrototype struct {
	// The VPC to bind this public address range to.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The zone this public address range will reside in.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`
}

// NewPublicAddressRangeTargetPrototype : Instantiate PublicAddressRangeTargetPrototype (Generic Model Constructor)
func (*VpcV1) NewPublicAddressRangeTargetPrototype(vpc VPCIdentityIntf, zone ZoneIdentityIntf) (_model *PublicAddressRangeTargetPrototype, err error) {
	_model = &PublicAddressRangeTargetPrototype{
		VPC:  vpc,
		Zone: zone,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalPublicAddressRangeTargetPrototype unmarshals an instance of PublicAddressRangeTargetPrototype from the specified map of raw messages.
func UnmarshalPublicAddressRangeTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicAddressRangeTargetPrototype)
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicGateway : PublicGateway struct
type PublicGateway struct {
	// The date and time that the public gateway was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this public gateway.
	CRN *string `json:"crn" validate:"required"`

	// The floating IP bound to this public gateway.
	FloatingIP *PublicGatewayFloatingIP `json:"floating_ip" validate:"required"`

	// The URL for this public gateway.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this public gateway.
	ID *string `json:"id" validate:"required"`

	// The name for this public gateway. The name is unique across all public gateways in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this public gateway.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of this public gateway.
	Status *string `json:"status" validate:"required"`

	// The VPC this public gateway resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The zone this public gateway resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the PublicGateway.ResourceType property.
// The resource type.
const (
	PublicGatewayResourceTypePublicGatewayConst = "public_gateway"
)

// Constants associated with the PublicGateway.Status property.
// The status of this public gateway.
const (
	PublicGatewayStatusAvailableConst = "available"
	PublicGatewayStatusDeletingConst  = "deleting"
	PublicGatewayStatusFailedConst    = "failed"
	PublicGatewayStatusPendingConst   = "pending"
)

// UnmarshalPublicGateway unmarshals an instance of PublicGateway from the specified map of raw messages.
func UnmarshalPublicGateway(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGateway)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "floating_ip", &obj.FloatingIP, UnmarshalPublicGatewayFloatingIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "floating_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicGatewayCollection : PublicGatewayCollection struct
type PublicGatewayCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of public gateways.
	PublicGateways []PublicGateway `json:"public_gateways" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalPublicGatewayCollection unmarshals an instance of PublicGatewayCollection from the specified map of raw messages.
func UnmarshalPublicGatewayCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGatewayCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_gateways", &obj.PublicGateways, UnmarshalPublicGateway)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_gateways-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *PublicGatewayCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// PublicGatewayFloatingIP : The floating IP bound to this public gateway.
type PublicGatewayFloatingIP struct {
	// The globally unique IP address.
	Address *string `json:"address" validate:"required"`

	// The CRN for this floating IP.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this floating IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this floating IP.
	ID *string `json:"id" validate:"required"`

	// The name for this floating IP. The name is unique across all floating IPs in the region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalPublicGatewayFloatingIP unmarshals an instance of PublicGatewayFloatingIP from the specified map of raw messages.
func UnmarshalPublicGatewayFloatingIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGatewayFloatingIP)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicGatewayFloatingIPPrototype : PublicGatewayFloatingIPPrototype struct
// Models which "extend" this model:
// - PublicGatewayFloatingIPPrototypeFloatingIPIdentity
// - PublicGatewayFloatingIPPrototypeFloatingIPPrototypeTargetContext
type PublicGatewayFloatingIPPrototype struct {
	// The unique identifier for this floating IP.
	ID *string `json:"id,omitempty"`

	// The CRN for this floating IP.
	CRN *string `json:"crn,omitempty"`

	// The URL for this floating IP.
	Href *string `json:"href,omitempty"`

	// The globally unique IP address.
	Address *string `json:"address,omitempty"`

	// The name for this floating IP. The name must not be used by another floating IP in the region. If unspecified, the
	// name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`
}

func (*PublicGatewayFloatingIPPrototype) isaPublicGatewayFloatingIPPrototype() bool {
	return true
}

type PublicGatewayFloatingIPPrototypeIntf interface {
	isaPublicGatewayFloatingIPPrototype() bool
}

// UnmarshalPublicGatewayFloatingIPPrototype unmarshals an instance of PublicGatewayFloatingIPPrototype from the specified map of raw messages.
func UnmarshalPublicGatewayFloatingIPPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGatewayFloatingIPPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicGatewayIdentity : Identifies a public gateway by a unique property.
// Models which "extend" this model:
// - PublicGatewayIdentityPublicGatewayIdentityByID
// - PublicGatewayIdentityPublicGatewayIdentityByCRN
// - PublicGatewayIdentityPublicGatewayIdentityByHref
type PublicGatewayIdentity struct {
	// The unique identifier for this public gateway.
	ID *string `json:"id,omitempty"`

	// The CRN for this public gateway.
	CRN *string `json:"crn,omitempty"`

	// The URL for this public gateway.
	Href *string `json:"href,omitempty"`
}

func (*PublicGatewayIdentity) isaPublicGatewayIdentity() bool {
	return true
}

type PublicGatewayIdentityIntf interface {
	isaPublicGatewayIdentity() bool
}

// UnmarshalPublicGatewayIdentity unmarshals an instance of PublicGatewayIdentity from the specified map of raw messages.
func UnmarshalPublicGatewayIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGatewayIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublicGatewayPatch : PublicGatewayPatch struct
type PublicGatewayPatch struct {
	// The name for this public gateway. The name must not be used by another public gateway in the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalPublicGatewayPatch unmarshals an instance of PublicGatewayPatch from the specified map of raw messages.
func UnmarshalPublicGatewayPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGatewayPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the PublicGatewayPatch
func (publicGatewayPatch *PublicGatewayPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(publicGatewayPatch.Name) {
		_patch["name"] = publicGatewayPatch.Name
	}

	return
}

// PublicGatewayReference : PublicGatewayReference struct
type PublicGatewayReference struct {
	// The CRN for this public gateway.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this public gateway.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this public gateway.
	ID *string `json:"id" validate:"required"`

	// The name for this public gateway. The name is unique across all public gateways in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the PublicGatewayReference.ResourceType property.
// The resource type.
const (
	PublicGatewayReferenceResourceTypePublicGatewayConst = "public_gateway"
)

// UnmarshalPublicGatewayReference unmarshals an instance of PublicGatewayReference from the specified map of raw messages.
func UnmarshalPublicGatewayReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(PublicGatewayReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// PublishPrivatePathServiceGatewayOptions : The PublishPrivatePathServiceGateway options.
type PublishPrivatePathServiceGatewayOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewPublishPrivatePathServiceGatewayOptions : Instantiate PublishPrivatePathServiceGatewayOptions
func (*VpcV1) NewPublishPrivatePathServiceGatewayOptions(privatePathServiceGatewayID string) *PublishPrivatePathServiceGatewayOptions {
	return &PublishPrivatePathServiceGatewayOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *PublishPrivatePathServiceGatewayOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *PublishPrivatePathServiceGatewayOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *PublishPrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *PublishPrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// Region : Region struct
type Region struct {
	// The API endpoint for this region.
	Endpoint *string `json:"endpoint" validate:"required"`

	// The URL for this region.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this region.
	Name *string `json:"name" validate:"required"`

	// The availability status of this region.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`
}

// Constants associated with the Region.Status property.
// The availability status of this region.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	RegionStatusAvailableConst   = "available"
	RegionStatusUnavailableConst = "unavailable"
)

// UnmarshalRegion unmarshals an instance of Region from the specified map of raw messages.
func UnmarshalRegion(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Region)
	err = core.UnmarshalPrimitive(m, "endpoint", &obj.Endpoint)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RegionCollection : RegionCollection struct
type RegionCollection struct {
	// The regions for the account.
	Regions []Region `json:"regions" validate:"required"`
}

// UnmarshalRegionCollection unmarshals an instance of RegionCollection from the specified map of raw messages.
func UnmarshalRegionCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RegionCollection)
	err = core.UnmarshalModel(m, "regions", &obj.Regions, UnmarshalRegion)
	if err != nil {
		err = core.SDKErrorf(err, "", "regions-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RegionIdentity : Identifies a region by a unique property.
// Models which "extend" this model:
// - RegionIdentityByName
// - RegionIdentityByHref
type RegionIdentity struct {
	// The globally unique name for this region.
	Name *string `json:"name,omitempty"`

	// The URL for this region.
	Href *string `json:"href,omitempty"`
}

func (*RegionIdentity) isaRegionIdentity() bool {
	return true
}

type RegionIdentityIntf interface {
	isaRegionIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalRegionIdentity unmarshals an instance of RegionIdentity from the specified map of raw messages.
func UnmarshalRegionIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RegionIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the RegionIdentity
func (regionIdentity *RegionIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(regionIdentity.Name) {
		_patch["name"] = regionIdentity.Name
	}
	if !core.IsNil(regionIdentity.Href) {
		_patch["href"] = regionIdentity.Href
	}

	return
}

// RegionReference : RegionReference struct
type RegionReference struct {
	// The URL for this region.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this region.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalRegionReference unmarshals an instance of RegionReference from the specified map of raw messages.
func UnmarshalRegionReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RegionReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RemoveBareMetalServerNetworkInterfaceFloatingIPOptions : The RemoveBareMetalServerNetworkInterfaceFloatingIP options.
type RemoveBareMetalServerNetworkInterfaceFloatingIPOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveBareMetalServerNetworkInterfaceFloatingIPOptions : Instantiate RemoveBareMetalServerNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewRemoveBareMetalServerNetworkInterfaceFloatingIPOptions(bareMetalServerID string, networkInterfaceID string, id string) *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions {
	return &RemoveBareMetalServerNetworkInterfaceFloatingIPOptions{
		BareMetalServerID:  core.StringPtr(bareMetalServerID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions) SetBareMetalServerID(bareMetalServerID string) *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions) SetID(id string) *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *RemoveBareMetalServerNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// RemoveEndpointGatewayIPOptions : The RemoveEndpointGatewayIP options.
type RemoveEndpointGatewayIPOptions struct {
	// The endpoint gateway identifier.
	EndpointGatewayID *string `json:"endpoint_gateway_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveEndpointGatewayIPOptions : Instantiate RemoveEndpointGatewayIPOptions
func (*VpcV1) NewRemoveEndpointGatewayIPOptions(endpointGatewayID string, id string) *RemoveEndpointGatewayIPOptions {
	return &RemoveEndpointGatewayIPOptions{
		EndpointGatewayID: core.StringPtr(endpointGatewayID),
		ID:                core.StringPtr(id),
	}
}

// SetEndpointGatewayID : Allow user to set EndpointGatewayID
func (_options *RemoveEndpointGatewayIPOptions) SetEndpointGatewayID(endpointGatewayID string) *RemoveEndpointGatewayIPOptions {
	_options.EndpointGatewayID = core.StringPtr(endpointGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveEndpointGatewayIPOptions) SetID(id string) *RemoveEndpointGatewayIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveEndpointGatewayIPOptions) SetHeaders(param map[string]string) *RemoveEndpointGatewayIPOptions {
	options.Headers = param
	return options
}

// RemoveInstanceNetworkInterfaceFloatingIPOptions : The RemoveInstanceNetworkInterfaceFloatingIP options.
type RemoveInstanceNetworkInterfaceFloatingIPOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	NetworkInterfaceID *string `json:"network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveInstanceNetworkInterfaceFloatingIPOptions : Instantiate RemoveInstanceNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewRemoveInstanceNetworkInterfaceFloatingIPOptions(instanceID string, networkInterfaceID string, id string) *RemoveInstanceNetworkInterfaceFloatingIPOptions {
	return &RemoveInstanceNetworkInterfaceFloatingIPOptions{
		InstanceID:         core.StringPtr(instanceID),
		NetworkInterfaceID: core.StringPtr(networkInterfaceID),
		ID:                 core.StringPtr(id),
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *RemoveInstanceNetworkInterfaceFloatingIPOptions) SetInstanceID(instanceID string) *RemoveInstanceNetworkInterfaceFloatingIPOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetNetworkInterfaceID : Allow user to set NetworkInterfaceID
func (_options *RemoveInstanceNetworkInterfaceFloatingIPOptions) SetNetworkInterfaceID(networkInterfaceID string) *RemoveInstanceNetworkInterfaceFloatingIPOptions {
	_options.NetworkInterfaceID = core.StringPtr(networkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveInstanceNetworkInterfaceFloatingIPOptions) SetID(id string) *RemoveInstanceNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveInstanceNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *RemoveInstanceNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// RemoveNetworkInterfaceFloatingIPOptions : The RemoveNetworkInterfaceFloatingIP options.
type RemoveNetworkInterfaceFloatingIPOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveNetworkInterfaceFloatingIPOptions : Instantiate RemoveNetworkInterfaceFloatingIPOptions
func (*VpcV1) NewRemoveNetworkInterfaceFloatingIPOptions(virtualNetworkInterfaceID string, id string) *RemoveNetworkInterfaceFloatingIPOptions {
	return &RemoveNetworkInterfaceFloatingIPOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
		ID:                        core.StringPtr(id),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *RemoveNetworkInterfaceFloatingIPOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *RemoveNetworkInterfaceFloatingIPOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveNetworkInterfaceFloatingIPOptions) SetID(id string) *RemoveNetworkInterfaceFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveNetworkInterfaceFloatingIPOptions) SetHeaders(param map[string]string) *RemoveNetworkInterfaceFloatingIPOptions {
	options.Headers = param
	return options
}

// RemoveVirtualNetworkInterfaceIPOptions : The RemoveVirtualNetworkInterfaceIP options.
type RemoveVirtualNetworkInterfaceIPOptions struct {
	// The virtual network interface identifier.
	VirtualNetworkInterfaceID *string `json:"virtual_network_interface_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveVirtualNetworkInterfaceIPOptions : Instantiate RemoveVirtualNetworkInterfaceIPOptions
func (*VpcV1) NewRemoveVirtualNetworkInterfaceIPOptions(virtualNetworkInterfaceID string, id string) *RemoveVirtualNetworkInterfaceIPOptions {
	return &RemoveVirtualNetworkInterfaceIPOptions{
		VirtualNetworkInterfaceID: core.StringPtr(virtualNetworkInterfaceID),
		ID:                        core.StringPtr(id),
	}
}

// SetVirtualNetworkInterfaceID : Allow user to set VirtualNetworkInterfaceID
func (_options *RemoveVirtualNetworkInterfaceIPOptions) SetVirtualNetworkInterfaceID(virtualNetworkInterfaceID string) *RemoveVirtualNetworkInterfaceIPOptions {
	_options.VirtualNetworkInterfaceID = core.StringPtr(virtualNetworkInterfaceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveVirtualNetworkInterfaceIPOptions) SetID(id string) *RemoveVirtualNetworkInterfaceIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveVirtualNetworkInterfaceIPOptions) SetHeaders(param map[string]string) *RemoveVirtualNetworkInterfaceIPOptions {
	options.Headers = param
	return options
}

// RemoveVPNGatewayConnectionsLocalCIDROptions : The RemoveVPNGatewayConnectionsLocalCIDR options.
type RemoveVPNGatewayConnectionsLocalCIDROptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IP address range in CIDR block notation.
	CIDR *string `json:"cidr" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveVPNGatewayConnectionsLocalCIDROptions : Instantiate RemoveVPNGatewayConnectionsLocalCIDROptions
func (*VpcV1) NewRemoveVPNGatewayConnectionsLocalCIDROptions(vpnGatewayID string, id string, cidr string) *RemoveVPNGatewayConnectionsLocalCIDROptions {
	return &RemoveVPNGatewayConnectionsLocalCIDROptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
		CIDR:         core.StringPtr(cidr),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *RemoveVPNGatewayConnectionsLocalCIDROptions) SetVPNGatewayID(vpnGatewayID string) *RemoveVPNGatewayConnectionsLocalCIDROptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveVPNGatewayConnectionsLocalCIDROptions) SetID(id string) *RemoveVPNGatewayConnectionsLocalCIDROptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *RemoveVPNGatewayConnectionsLocalCIDROptions) SetCIDR(cidr string) *RemoveVPNGatewayConnectionsLocalCIDROptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveVPNGatewayConnectionsLocalCIDROptions) SetHeaders(param map[string]string) *RemoveVPNGatewayConnectionsLocalCIDROptions {
	options.Headers = param
	return options
}

// RemoveVPNGatewayConnectionsPeerCIDROptions : The RemoveVPNGatewayConnectionsPeerCIDR options.
type RemoveVPNGatewayConnectionsPeerCIDROptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IP address range in CIDR block notation.
	CIDR *string `json:"cidr" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRemoveVPNGatewayConnectionsPeerCIDROptions : Instantiate RemoveVPNGatewayConnectionsPeerCIDROptions
func (*VpcV1) NewRemoveVPNGatewayConnectionsPeerCIDROptions(vpnGatewayID string, id string, cidr string) *RemoveVPNGatewayConnectionsPeerCIDROptions {
	return &RemoveVPNGatewayConnectionsPeerCIDROptions{
		VPNGatewayID: core.StringPtr(vpnGatewayID),
		ID:           core.StringPtr(id),
		CIDR:         core.StringPtr(cidr),
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *RemoveVPNGatewayConnectionsPeerCIDROptions) SetVPNGatewayID(vpnGatewayID string) *RemoveVPNGatewayConnectionsPeerCIDROptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *RemoveVPNGatewayConnectionsPeerCIDROptions) SetID(id string) *RemoveVPNGatewayConnectionsPeerCIDROptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetCIDR : Allow user to set CIDR
func (_options *RemoveVPNGatewayConnectionsPeerCIDROptions) SetCIDR(cidr string) *RemoveVPNGatewayConnectionsPeerCIDROptions {
	_options.CIDR = core.StringPtr(cidr)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RemoveVPNGatewayConnectionsPeerCIDROptions) SetHeaders(param map[string]string) *RemoveVPNGatewayConnectionsPeerCIDROptions {
	options.Headers = param
	return options
}

// ReplaceBareMetalServerInitializationOptions : The ReplaceBareMetalServerInitialization options.
type ReplaceBareMetalServerInitializationOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The image to be used when provisioning the bare metal server.
	Image ImageIdentityIntf `json:"image" validate:"required"`

	// The public SSH keys to install on the bare metal server. Keys will be made available to the bare metal server as
	// cloud-init vendor data. For cloud-init enabled images, these keys will also be added as SSH authorized keys for the
	// [default user](https://cloud.ibm.com/docs/vpc?topic=vpc-vsi_is_connecting_linux#determining-default-user-account).
	//
	// For Windows images, at least one key must be specified, and one will be selected to encrypt the administrator
	// password. Keys are optional for other images, but if no keys are specified, the bare metal server will be
	// inaccessible unless the specified image provides another means of access.
	Keys []KeyIdentityIntf `json:"keys" validate:"required"`

	// The user data to be made available when initializing the bare metal server.
	UserData *string `json:"user_data,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewReplaceBareMetalServerInitializationOptions : Instantiate ReplaceBareMetalServerInitializationOptions
func (*VpcV1) NewReplaceBareMetalServerInitializationOptions(id string, image ImageIdentityIntf, keys []KeyIdentityIntf) *ReplaceBareMetalServerInitializationOptions {
	return &ReplaceBareMetalServerInitializationOptions{
		ID:    core.StringPtr(id),
		Image: image,
		Keys:  keys,
	}
}

// SetID : Allow user to set ID
func (_options *ReplaceBareMetalServerInitializationOptions) SetID(id string) *ReplaceBareMetalServerInitializationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetImage : Allow user to set Image
func (_options *ReplaceBareMetalServerInitializationOptions) SetImage(image ImageIdentityIntf) *ReplaceBareMetalServerInitializationOptions {
	_options.Image = image
	return _options
}

// SetKeys : Allow user to set Keys
func (_options *ReplaceBareMetalServerInitializationOptions) SetKeys(keys []KeyIdentityIntf) *ReplaceBareMetalServerInitializationOptions {
	_options.Keys = keys
	return _options
}

// SetUserData : Allow user to set UserData
func (_options *ReplaceBareMetalServerInitializationOptions) SetUserData(userData string) *ReplaceBareMetalServerInitializationOptions {
	_options.UserData = core.StringPtr(userData)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ReplaceBareMetalServerInitializationOptions) SetHeaders(param map[string]string) *ReplaceBareMetalServerInitializationOptions {
	options.Headers = param
	return options
}

// ReplaceLoadBalancerPoolMembersOptions : The ReplaceLoadBalancerPoolMembers options.
type ReplaceLoadBalancerPoolMembersOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	PoolID *string `json:"pool_id" validate:"required,ne="`

	// The member prototype objects for this pool.
	Members []LoadBalancerPoolMemberPrototype `json:"members" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewReplaceLoadBalancerPoolMembersOptions : Instantiate ReplaceLoadBalancerPoolMembersOptions
func (*VpcV1) NewReplaceLoadBalancerPoolMembersOptions(loadBalancerID string, poolID string, members []LoadBalancerPoolMemberPrototype) *ReplaceLoadBalancerPoolMembersOptions {
	return &ReplaceLoadBalancerPoolMembersOptions{
		LoadBalancerID: core.StringPtr(loadBalancerID),
		PoolID:         core.StringPtr(poolID),
		Members:        members,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *ReplaceLoadBalancerPoolMembersOptions) SetLoadBalancerID(loadBalancerID string) *ReplaceLoadBalancerPoolMembersOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetPoolID : Allow user to set PoolID
func (_options *ReplaceLoadBalancerPoolMembersOptions) SetPoolID(poolID string) *ReplaceLoadBalancerPoolMembersOptions {
	_options.PoolID = core.StringPtr(poolID)
	return _options
}

// SetMembers : Allow user to set Members
func (_options *ReplaceLoadBalancerPoolMembersOptions) SetMembers(members []LoadBalancerPoolMemberPrototype) *ReplaceLoadBalancerPoolMembersOptions {
	_options.Members = members
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ReplaceLoadBalancerPoolMembersOptions) SetHeaders(param map[string]string) *ReplaceLoadBalancerPoolMembersOptions {
	options.Headers = param
	return options
}

// ReplaceSubnetNetworkACLOptions : The ReplaceSubnetNetworkACL options.
type ReplaceSubnetNetworkACLOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The network ACL identity.
	NetworkACLIdentity NetworkACLIdentityIntf `json:"NetworkACLIdentity" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewReplaceSubnetNetworkACLOptions : Instantiate ReplaceSubnetNetworkACLOptions
func (*VpcV1) NewReplaceSubnetNetworkACLOptions(id string, networkACLIdentity NetworkACLIdentityIntf) *ReplaceSubnetNetworkACLOptions {
	return &ReplaceSubnetNetworkACLOptions{
		ID:                 core.StringPtr(id),
		NetworkACLIdentity: networkACLIdentity,
	}
}

// SetID : Allow user to set ID
func (_options *ReplaceSubnetNetworkACLOptions) SetID(id string) *ReplaceSubnetNetworkACLOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetNetworkACLIdentity : Allow user to set NetworkACLIdentity
func (_options *ReplaceSubnetNetworkACLOptions) SetNetworkACLIdentity(networkACLIdentity NetworkACLIdentityIntf) *ReplaceSubnetNetworkACLOptions {
	_options.NetworkACLIdentity = networkACLIdentity
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ReplaceSubnetNetworkACLOptions) SetHeaders(param map[string]string) *ReplaceSubnetNetworkACLOptions {
	options.Headers = param
	return options
}

// ReplaceSubnetRoutingTableOptions : The ReplaceSubnetRoutingTable options.
type ReplaceSubnetRoutingTableOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The routing table identity.
	RoutingTableIdentity RoutingTableIdentityIntf `json:"RoutingTableIdentity" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewReplaceSubnetRoutingTableOptions : Instantiate ReplaceSubnetRoutingTableOptions
func (*VpcV1) NewReplaceSubnetRoutingTableOptions(id string, routingTableIdentity RoutingTableIdentityIntf) *ReplaceSubnetRoutingTableOptions {
	return &ReplaceSubnetRoutingTableOptions{
		ID:                   core.StringPtr(id),
		RoutingTableIdentity: routingTableIdentity,
	}
}

// SetID : Allow user to set ID
func (_options *ReplaceSubnetRoutingTableOptions) SetID(id string) *ReplaceSubnetRoutingTableOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetRoutingTableIdentity : Allow user to set RoutingTableIdentity
func (_options *ReplaceSubnetRoutingTableOptions) SetRoutingTableIdentity(routingTableIdentity RoutingTableIdentityIntf) *ReplaceSubnetRoutingTableOptions {
	_options.RoutingTableIdentity = routingTableIdentity
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *ReplaceSubnetRoutingTableOptions) SetHeaders(param map[string]string) *ReplaceSubnetRoutingTableOptions {
	options.Headers = param
	return options
}

// Reservation : Reservation struct
type Reservation struct {
	// The affinity policy to use for this reservation:
	// - `automatic`: The reservation will be automatically selected
	// - `restricted`: The reservation must be manually requested
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AffinityPolicy *string `json:"affinity_policy" validate:"required"`

	// The capacity configuration for this reservation
	//
	// If absent, this reservation has no assigned capacity.
	Capacity *ReservationCapacity `json:"capacity,omitempty"`

	// The committed use configuration for this reservation.
	//
	// If absent, this reservation has no commitment for use.
	CommittedUse *ReservationCommittedUse `json:"committed_use,omitempty"`

	// The date and time that the reservation was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this reservation.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this reservation.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this reservation.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of this reservation.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this reservation. The name is unique across all reservations in the region.
	Name *string `json:"name" validate:"required"`

	// The [instance profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) or
	// [bare metal server
	// profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile)
	// for this reservation.
	Profile ReservationProfileIntf `json:"profile" validate:"required"`

	// The resource group for this reservation.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of the reservation.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []ReservationStatusReason `json:"status_reasons" validate:"required"`

	// The zone for this reservation.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the Reservation.AffinityPolicy property.
// The affinity policy to use for this reservation:
// - `automatic`: The reservation will be automatically selected
// - `restricted`: The reservation must be manually requested
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ReservationAffinityPolicyAutomaticConst  = "automatic"
	ReservationAffinityPolicyRestrictedConst = "restricted"
)

// Constants associated with the Reservation.LifecycleState property.
// The lifecycle state of this reservation.
const (
	ReservationLifecycleStateDeletingConst  = "deleting"
	ReservationLifecycleStateFailedConst    = "failed"
	ReservationLifecycleStatePendingConst   = "pending"
	ReservationLifecycleStateStableConst    = "stable"
	ReservationLifecycleStateSuspendedConst = "suspended"
	ReservationLifecycleStateUpdatingConst  = "updating"
	ReservationLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the Reservation.ResourceType property.
// The resource type.
const (
	ReservationResourceTypeReservationConst = "reservation"
)

// Constants associated with the Reservation.Status property.
// The status of the reservation.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ReservationStatusActivatingConst   = "activating"
	ReservationStatusActiveConst       = "active"
	ReservationStatusDeactivatingConst = "deactivating"
	ReservationStatusExpiredConst      = "expired"
	ReservationStatusFailedConst       = "failed"
	ReservationStatusInactiveConst     = "inactive"
)

// UnmarshalReservation unmarshals an instance of Reservation from the specified map of raw messages.
func UnmarshalReservation(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Reservation)
	err = core.UnmarshalPrimitive(m, "affinity_policy", &obj.AffinityPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "affinity_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "capacity", &obj.Capacity, UnmarshalReservationCapacity)
	if err != nil {
		err = core.SDKErrorf(err, "", "capacity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "committed_use", &obj.CommittedUse, UnmarshalReservationCommittedUse)
	if err != nil {
		err = core.SDKErrorf(err, "", "committed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalReservationProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalReservationStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationCapacity : The capacity configuration for this reservation
//
// If absent, this reservation has no assigned capacity.
type ReservationCapacity struct {
	// The amount allocated to this capacity reservation.
	Allocated *int64 `json:"allocated" validate:"required"`

	// The amount of this capacity reservation available for new attachments.
	Available *int64 `json:"available" validate:"required"`

	// The status of the capacity reservation:
	// - `allocating`: The capacity reservation is being allocated for use
	// - `allocated`: The total capacity of the reservation has been allocated for use
	// - `degraded`: The capacity reservation has been allocated for use, but some of the
	//   capacity is not available. See [capacity status
	//   reasons](https://cloud.ibm.com/docs/vpc?topic=vpc-reserved-capacity-status-reasons)
	//   for more information.
	// - `unallocated`: The capacity reservation is not allocated for use
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The total amount of this capacity reservation.
	Total *int64 `json:"total" validate:"required"`

	// The amount of this capacity reservation used by existing attachments.
	Used *int64 `json:"used" validate:"required"`
}

// Constants associated with the ReservationCapacity.Status property.
// The status of the capacity reservation:
//   - `allocating`: The capacity reservation is being allocated for use
//   - `allocated`: The total capacity of the reservation has been allocated for use
//   - `degraded`: The capacity reservation has been allocated for use, but some of the
//     capacity is not available. See [capacity status
//     reasons](https://cloud.ibm.com/docs/vpc?topic=vpc-reserved-capacity-status-reasons)
//     for more information.
//   - `unallocated`: The capacity reservation is not allocated for use
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ReservationCapacityStatusAllocatedConst   = "allocated"
	ReservationCapacityStatusAllocatingConst  = "allocating"
	ReservationCapacityStatusDegradedConst    = "degraded"
	ReservationCapacityStatusUnallocatedConst = "unallocated"
)

// UnmarshalReservationCapacity unmarshals an instance of ReservationCapacity from the specified map of raw messages.
func UnmarshalReservationCapacity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCapacity)
	err = core.UnmarshalPrimitive(m, "allocated", &obj.Allocated)
	if err != nil {
		err = core.SDKErrorf(err, "", "allocated-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "available", &obj.Available)
	if err != nil {
		err = core.SDKErrorf(err, "", "available-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total", &obj.Total)
	if err != nil {
		err = core.SDKErrorf(err, "", "total-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "used", &obj.Used)
	if err != nil {
		err = core.SDKErrorf(err, "", "used-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationCapacityPatch : The capacity reservation configuration to use.
//
// The configuration can only be changed for reservations with a `status` of `inactive`.
type ReservationCapacityPatch struct {
	// The total amount to use for this capacity reservation.
	Total *int64 `json:"total,omitempty"`
}

// UnmarshalReservationCapacityPatch unmarshals an instance of ReservationCapacityPatch from the specified map of raw messages.
func UnmarshalReservationCapacityPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCapacityPatch)
	err = core.UnmarshalPrimitive(m, "total", &obj.Total)
	if err != nil {
		err = core.SDKErrorf(err, "", "total-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ReservationCapacityPatch
func (reservationCapacityPatch *ReservationCapacityPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(reservationCapacityPatch.Total) {
		_patch["total"] = reservationCapacityPatch.Total
	}

	return
}

// ReservationCapacityPrototype : The capacity reservation configuration to use.
type ReservationCapacityPrototype struct {
	// The total amount to use for this capacity reservation.
	Total *int64 `json:"total" validate:"required"`
}

// NewReservationCapacityPrototype : Instantiate ReservationCapacityPrototype (Generic Model Constructor)
func (*VpcV1) NewReservationCapacityPrototype(total int64) (_model *ReservationCapacityPrototype, err error) {
	_model = &ReservationCapacityPrototype{
		Total: core.Int64Ptr(total),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalReservationCapacityPrototype unmarshals an instance of ReservationCapacityPrototype from the specified map of raw messages.
func UnmarshalReservationCapacityPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCapacityPrototype)
	err = core.UnmarshalPrimitive(m, "total", &obj.Total)
	if err != nil {
		err = core.SDKErrorf(err, "", "total-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationCollection : ReservationCollection struct
type ReservationCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of reservations.
	Reservations []Reservation `json:"reservations" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalReservationCollection unmarshals an instance of ReservationCollection from the specified map of raw messages.
func UnmarshalReservationCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reservations", &obj.Reservations, UnmarshalReservation)
	if err != nil {
		err = core.SDKErrorf(err, "", "reservations-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ReservationCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ReservationCommittedUse : The committed use reservation configuration.
type ReservationCommittedUse struct {
	// The expiration date and time for this committed use reservation.
	//
	// This property will be absent if the reservation has a `status` of `inactive`.
	ExpirationAt *strfmt.DateTime `json:"expiration_at,omitempty"`

	// The policy to apply when the committed use term expires:
	// - `release`: Release any available capacity and let the reservation expire.
	// - `renew`: Renew for another term, provided the term remains listed in the
	//   `reservation_terms` for the profile. Otherwise, let the reservation expire.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ExpirationPolicy *string `json:"expiration_policy" validate:"required"`

	// The term for this committed use reservation:
	// - `one_year`: 1 year
	// - `three_year`: 3 years
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Term *string `json:"term" validate:"required"`
}

// Constants associated with the ReservationCommittedUse.ExpirationPolicy property.
// The policy to apply when the committed use term expires:
//   - `release`: Release any available capacity and let the reservation expire.
//   - `renew`: Renew for another term, provided the term remains listed in the
//     `reservation_terms` for the profile. Otherwise, let the reservation expire.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ReservationCommittedUseExpirationPolicyReleaseConst = "release"
	ReservationCommittedUseExpirationPolicyRenewConst   = "renew"
)

// UnmarshalReservationCommittedUse unmarshals an instance of ReservationCommittedUse from the specified map of raw messages.
func UnmarshalReservationCommittedUse(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCommittedUse)
	err = core.UnmarshalPrimitive(m, "expiration_at", &obj.ExpirationAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "expiration_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "expiration_policy", &obj.ExpirationPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "expiration_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "term", &obj.Term)
	if err != nil {
		err = core.SDKErrorf(err, "", "term-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationCommittedUsePatch : ReservationCommittedUsePatch struct
type ReservationCommittedUsePatch struct {
	// The policy to apply when the committed use term expires:
	// - `release`: Release any available capacity and let the reservation expire.
	// - `renew`: Renew for another term, provided the term remains listed in the
	//   `reservation_terms` for the profile. Otherwise, let the reservation expire.
	ExpirationPolicy *string `json:"expiration_policy,omitempty"`

	// The term for this committed use reservation:
	// - `one_year`: 1 year
	// - `three_year`: 3 years
	//
	// The specified value must be listed in the `reservation_terms` in the profile for this reservation. The term can only
	// be changed for a reservation with a `status` of
	// `inactive`.
	Term *string `json:"term,omitempty"`
}

// Constants associated with the ReservationCommittedUsePatch.ExpirationPolicy property.
// The policy to apply when the committed use term expires:
//   - `release`: Release any available capacity and let the reservation expire.
//   - `renew`: Renew for another term, provided the term remains listed in the
//     `reservation_terms` for the profile. Otherwise, let the reservation expire.
const (
	ReservationCommittedUsePatchExpirationPolicyReleaseConst = "release"
	ReservationCommittedUsePatchExpirationPolicyRenewConst   = "renew"
)

// UnmarshalReservationCommittedUsePatch unmarshals an instance of ReservationCommittedUsePatch from the specified map of raw messages.
func UnmarshalReservationCommittedUsePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCommittedUsePatch)
	err = core.UnmarshalPrimitive(m, "expiration_policy", &obj.ExpirationPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "expiration_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "term", &obj.Term)
	if err != nil {
		err = core.SDKErrorf(err, "", "term-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ReservationCommittedUsePatch
func (reservationCommittedUsePatch *ReservationCommittedUsePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(reservationCommittedUsePatch.ExpirationPolicy) {
		_patch["expiration_policy"] = reservationCommittedUsePatch.ExpirationPolicy
	}
	if !core.IsNil(reservationCommittedUsePatch.Term) {
		_patch["term"] = reservationCommittedUsePatch.Term
	}

	return
}

// ReservationCommittedUsePrototype : ReservationCommittedUsePrototype struct
type ReservationCommittedUsePrototype struct {
	// The policy to apply when the committed use term expires:
	// - `release`: Release any available capacity and let the reservation expire.
	// - `renew`: Renew for another term, provided the term remains listed in the
	//   `reservation_terms` for the profile. Otherwise, let the reservation expire.
	ExpirationPolicy *string `json:"expiration_policy,omitempty"`

	// The term for this committed use reservation:
	// - `one_year`: 1 year
	// - `three_year`: 3 years
	//
	// The specified value must be listed in the `reservation_terms` in the profile for this reservation.
	Term *string `json:"term" validate:"required"`
}

// Constants associated with the ReservationCommittedUsePrototype.ExpirationPolicy property.
// The policy to apply when the committed use term expires:
//   - `release`: Release any available capacity and let the reservation expire.
//   - `renew`: Renew for another term, provided the term remains listed in the
//     `reservation_terms` for the profile. Otherwise, let the reservation expire.
const (
	ReservationCommittedUsePrototypeExpirationPolicyReleaseConst = "release"
	ReservationCommittedUsePrototypeExpirationPolicyRenewConst   = "renew"
)

// NewReservationCommittedUsePrototype : Instantiate ReservationCommittedUsePrototype (Generic Model Constructor)
func (*VpcV1) NewReservationCommittedUsePrototype(term string) (_model *ReservationCommittedUsePrototype, err error) {
	_model = &ReservationCommittedUsePrototype{
		Term: core.StringPtr(term),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalReservationCommittedUsePrototype unmarshals an instance of ReservationCommittedUsePrototype from the specified map of raw messages.
func UnmarshalReservationCommittedUsePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationCommittedUsePrototype)
	err = core.UnmarshalPrimitive(m, "expiration_policy", &obj.ExpirationPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "expiration_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "term", &obj.Term)
	if err != nil {
		err = core.SDKErrorf(err, "", "term-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationIdentity : Identifies a reservation by a unique property.
// Models which "extend" this model:
// - ReservationIdentityByID
// - ReservationIdentityByCRN
// - ReservationIdentityByHref
type ReservationIdentity struct {
	// The unique identifier for this reservation.
	ID *string `json:"id,omitempty"`

	// The CRN for this reservation.
	CRN *string `json:"crn,omitempty"`

	// The URL for this reservation.
	Href *string `json:"href,omitempty"`
}

func (*ReservationIdentity) isaReservationIdentity() bool {
	return true
}

type ReservationIdentityIntf interface {
	isaReservationIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalReservationIdentity unmarshals an instance of ReservationIdentity from the specified map of raw messages.
func UnmarshalReservationIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ReservationIdentity
func (reservationIdentity *ReservationIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(reservationIdentity.ID) {
		_patch["id"] = reservationIdentity.ID
	}
	if !core.IsNil(reservationIdentity.CRN) {
		_patch["crn"] = reservationIdentity.CRN
	}
	if !core.IsNil(reservationIdentity.Href) {
		_patch["href"] = reservationIdentity.Href
	}

	return
}

// ReservationPatch : ReservationPatch struct
type ReservationPatch struct {
	// The affinity policy to use for this reservation:
	// - `automatic`: The reservation will be automatically selected
	// - `restricted`: The reservation must be manually requested
	//
	// The affinity policy can only be changed for a reservation with a `status` of `inactive`.
	AffinityPolicy *string `json:"affinity_policy,omitempty"`

	// The capacity reservation configuration to use.
	//
	// The configuration can only be changed for reservations with a `status` of `inactive`.
	Capacity *ReservationCapacityPatch `json:"capacity,omitempty"`

	// The committed use configuration to use for this reservation.
	CommittedUse *ReservationCommittedUsePatch `json:"committed_use,omitempty"`

	// The name for this reservation. The name must not be used by another reservation in the region.
	Name *string `json:"name,omitempty"`

	// The [instance profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) or
	// [bare metal server
	// profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile)
	// to use for this reservation.
	Profile *ReservationProfilePatch `json:"profile,omitempty"`
}

// Constants associated with the ReservationPatch.AffinityPolicy property.
// The affinity policy to use for this reservation:
// - `automatic`: The reservation will be automatically selected
// - `restricted`: The reservation must be manually requested
//
// The affinity policy can only be changed for a reservation with a `status` of `inactive`.
const (
	ReservationPatchAffinityPolicyAutomaticConst  = "automatic"
	ReservationPatchAffinityPolicyRestrictedConst = "restricted"
)

// UnmarshalReservationPatch unmarshals an instance of ReservationPatch from the specified map of raw messages.
func UnmarshalReservationPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationPatch)
	err = core.UnmarshalPrimitive(m, "affinity_policy", &obj.AffinityPolicy)
	if err != nil {
		err = core.SDKErrorf(err, "", "affinity_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "capacity", &obj.Capacity, UnmarshalReservationCapacityPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "capacity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "committed_use", &obj.CommittedUse, UnmarshalReservationCommittedUsePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "committed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalReservationProfilePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ReservationPatch
func (reservationPatch *ReservationPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(reservationPatch.AffinityPolicy) {
		_patch["affinity_policy"] = reservationPatch.AffinityPolicy
	}
	if !core.IsNil(reservationPatch.Capacity) {
		_patch["capacity"] = reservationPatch.Capacity.asPatch()
	}
	if !core.IsNil(reservationPatch.CommittedUse) {
		_patch["committed_use"] = reservationPatch.CommittedUse.asPatch()
	}
	if !core.IsNil(reservationPatch.Name) {
		_patch["name"] = reservationPatch.Name
	}
	if !core.IsNil(reservationPatch.Profile) {
		_patch["profile"] = reservationPatch.Profile.asPatch()
	}

	return
}

// ReservationProfile : The [instance profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) or
// [bare metal server profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile) for this
// reservation.
// Models which "extend" this model:
// - ReservationProfileInstanceProfileReference
// - ReservationProfileBareMetalServerProfileReference
type ReservationProfile struct {
	// The URL for this virtual server instance profile.
	Href *string `json:"href,omitempty"`

	// The globally unique name for this virtual server instance profile.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ReservationProfile.ResourceType property.
// The resource type.
const (
	ReservationProfileResourceTypeInstanceProfileConst = "instance_profile"
)

func (*ReservationProfile) isaReservationProfile() bool {
	return true
}

type ReservationProfileIntf interface {
	isaReservationProfile() bool
}

// UnmarshalReservationProfile unmarshals an instance of ReservationProfile from the specified map of raw messages.
func UnmarshalReservationProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationProfile)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationProfilePatch : The [instance profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) or
// [bare metal server profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile) to use for this
// reservation.
type ReservationProfilePatch struct {
	// The globally unique name of the profile.
	Name *string `json:"name,omitempty"`

	// The resource type of the profile.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ReservationProfilePatch.ResourceType property.
// The resource type of the profile.
const (
	ReservationProfilePatchResourceTypeBareMetalServerProfileConst = "bare_metal_server_profile"
	ReservationProfilePatchResourceTypeInstanceProfileConst        = "instance_profile"
)

// UnmarshalReservationProfilePatch unmarshals an instance of ReservationProfilePatch from the specified map of raw messages.
func UnmarshalReservationProfilePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationProfilePatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ReservationProfilePatch
func (reservationProfilePatch *ReservationProfilePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(reservationProfilePatch.Name) {
		_patch["name"] = reservationProfilePatch.Name
	}
	if !core.IsNil(reservationProfilePatch.ResourceType) {
		_patch["resource_type"] = reservationProfilePatch.ResourceType
	}

	return
}

// ReservationProfilePrototype : The [instance profile](https://cloud.ibm.com/docs/vpc?topic=vpc-profiles) or
// [bare metal server profile](https://cloud.ibm.com/docs/vpc?topic=vpc-bare-metal-servers-profile) to use for this
// reservation.
type ReservationProfilePrototype struct {
	// The globally unique name of the profile.
	Name *string `json:"name" validate:"required"`

	// The resource type of the profile.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ReservationProfilePrototype.ResourceType property.
// The resource type of the profile.
const (
	ReservationProfilePrototypeResourceTypeBareMetalServerProfileConst = "bare_metal_server_profile"
	ReservationProfilePrototypeResourceTypeInstanceProfileConst        = "instance_profile"
)

// NewReservationProfilePrototype : Instantiate ReservationProfilePrototype (Generic Model Constructor)
func (*VpcV1) NewReservationProfilePrototype(name string, resourceType string) (_model *ReservationProfilePrototype, err error) {
	_model = &ReservationProfilePrototype{
		Name:         core.StringPtr(name),
		ResourceType: core.StringPtr(resourceType),
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalReservationProfilePrototype unmarshals an instance of ReservationProfilePrototype from the specified map of raw messages.
func UnmarshalReservationProfilePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationProfilePrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationReference : ReservationReference struct
type ReservationReference struct {
	// The CRN for this reservation.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this reservation.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this reservation.
	ID *string `json:"id" validate:"required"`

	// The name for this reservation. The name is unique across all reservations in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ReservationReference.ResourceType property.
// The resource type.
const (
	ReservationReferenceResourceTypeReservationConst = "reservation"
)

// UnmarshalReservationReference unmarshals an instance of ReservationReference from the specified map of raw messages.
func UnmarshalReservationReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservationStatusReason : ReservationStatusReason struct
type ReservationStatusReason struct {
	// A snake case string succinctly identifying the status reason.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ReservationStatusReason.Code property.
// A snake case string succinctly identifying the status reason.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ReservationStatusReasonCodeCannotActivateNoCapacityAvailableConst = "cannot_activate_no_capacity_available"
	ReservationStatusReasonCodeCannotRenewUnsupportedProfileTermConst = "cannot_renew_unsupported_profile_term"
)

// UnmarshalReservationStatusReason unmarshals an instance of ReservationStatusReason from the specified map of raw messages.
func UnmarshalReservationStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservationStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservedIP : ReservedIP struct
type ReservedIP struct {
	// The IP address.
	//
	// If the address has not yet been selected, the value will be `0.0.0.0`.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address" validate:"required"`

	// Indicates whether this reserved IP member will be automatically deleted when either
	// `target` is deleted, or the reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete" validate:"required"`

	// The date and time that the reserved IP was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this reserved IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this reserved IP.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the reserved IP.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this reserved IP. The name is unique across all reserved IPs in a subnet.
	Name *string `json:"name" validate:"required"`

	// The owner of the reserved IP.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Owner *string `json:"owner" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The target this reserved IP is bound to.
	//
	// If absent, this reserved IP is provider-owned or unbound.
	//
	// The resources supported by this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Target ReservedIPTargetIntf `json:"target,omitempty"`
}

// Constants associated with the ReservedIP.LifecycleState property.
// The lifecycle state of the reserved IP.
const (
	ReservedIPLifecycleStateDeletingConst  = "deleting"
	ReservedIPLifecycleStateFailedConst    = "failed"
	ReservedIPLifecycleStatePendingConst   = "pending"
	ReservedIPLifecycleStateStableConst    = "stable"
	ReservedIPLifecycleStateSuspendedConst = "suspended"
	ReservedIPLifecycleStateUpdatingConst  = "updating"
	ReservedIPLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ReservedIP.Owner property.
// The owner of the reserved IP.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ReservedIPOwnerProviderConst = "provider"
	ReservedIPOwnerUserConst     = "user"
)

// Constants associated with the ReservedIP.ResourceType property.
// The resource type.
const (
	ReservedIPResourceTypeSubnetReservedIPConst = "subnet_reserved_ip"
)

// UnmarshalReservedIP unmarshals an instance of ReservedIP from the specified map of raw messages.
func UnmarshalReservedIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIP)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "owner", &obj.Owner)
	if err != nil {
		err = core.SDKErrorf(err, "", "owner-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "target", &obj.Target, UnmarshalReservedIPTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "target-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservedIPCollection : ReservedIPCollection struct
type ReservedIPCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of reserved IPs in the subnet.
	ReservedIps []ReservedIP `json:"reserved_ips" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalReservedIPCollection unmarshals an instance of ReservedIPCollection from the specified map of raw messages.
func UnmarshalReservedIPCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "reserved_ips", &obj.ReservedIps, UnmarshalReservedIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "reserved_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ReservedIPCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ReservedIPCollectionBareMetalServerNetworkInterfaceContext : ReservedIPCollectionBareMetalServerNetworkInterfaceContext struct
type ReservedIPCollectionBareMetalServerNetworkInterfaceContext struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of reserved IPs bound to the bare metal server network interface.
	Ips []ReservedIP `json:"ips" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalReservedIPCollectionBareMetalServerNetworkInterfaceContext unmarshals an instance of ReservedIPCollectionBareMetalServerNetworkInterfaceContext from the specified map of raw messages.
func UnmarshalReservedIPCollectionBareMetalServerNetworkInterfaceContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPCollectionBareMetalServerNetworkInterfaceContext)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalReservedIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservedIPCollectionEndpointGatewayContext : ReservedIPCollectionEndpointGatewayContext struct
type ReservedIPCollectionEndpointGatewayContext struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of reserved IPs bound to the endpoint gateway.
	Ips []ReservedIP `json:"ips" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalReservedIPCollectionEndpointGatewayContext unmarshals an instance of ReservedIPCollectionEndpointGatewayContext from the specified map of raw messages.
func UnmarshalReservedIPCollectionEndpointGatewayContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPCollectionEndpointGatewayContext)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalReservedIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ReservedIPCollectionEndpointGatewayContext) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ReservedIPCollectionInstanceNetworkInterfaceContext : ReservedIPCollectionInstanceNetworkInterfaceContext struct
type ReservedIPCollectionInstanceNetworkInterfaceContext struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of reserved IPs bound to the instance network interface.
	Ips []ReservedIP `json:"ips" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalReservedIPCollectionInstanceNetworkInterfaceContext unmarshals an instance of ReservedIPCollectionInstanceNetworkInterfaceContext from the specified map of raw messages.
func UnmarshalReservedIPCollectionInstanceNetworkInterfaceContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPCollectionInstanceNetworkInterfaceContext)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalReservedIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ReservedIPCollectionInstanceNetworkInterfaceContext) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ReservedIPCollectionVirtualNetworkInterfaceContext : ReservedIPCollectionVirtualNetworkInterfaceContext struct
type ReservedIPCollectionVirtualNetworkInterfaceContext struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of reserved IPs bound to the virtual network interface specified by the identifier in the URL.
	Ips []ReservedIPReference `json:"ips" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalReservedIPCollectionVirtualNetworkInterfaceContext unmarshals an instance of ReservedIPCollectionVirtualNetworkInterfaceContext from the specified map of raw messages.
func UnmarshalReservedIPCollectionVirtualNetworkInterfaceContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPCollectionVirtualNetworkInterfaceContext)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ReservedIPCollectionVirtualNetworkInterfaceContext) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ReservedIPPatch : ReservedIPPatch struct
type ReservedIPPatch struct {
	// Indicates whether this reserved IP member will be automatically deleted when either
	// `target` is deleted, or the reserved IP is unbound. Must be `false` if the reserved IP is unbound.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// The name for this reserved IP. The name must not be used by another reserved IP in the subnet. Names starting with
	// `ibm-` are reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`
}

// UnmarshalReservedIPPatch unmarshals an instance of ReservedIPPatch from the specified map of raw messages.
func UnmarshalReservedIPPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPPatch)
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ReservedIPPatch
func (reservedIPPatch *ReservedIPPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(reservedIPPatch.AutoDelete) {
		_patch["auto_delete"] = reservedIPPatch.AutoDelete
	}
	if !core.IsNil(reservedIPPatch.Name) {
		_patch["name"] = reservedIPPatch.Name
	}

	return
}

// ReservedIPReference : ReservedIPReference struct
type ReservedIPReference struct {
	// The IP address.
	//
	// If the address has not yet been selected, the value will be `0.0.0.0`.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this reserved IP.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this reserved IP.
	ID *string `json:"id" validate:"required"`

	// The name for this reserved IP. The name is unique across all reserved IPs in a subnet.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ReservedIPReference.ResourceType property.
// The resource type.
const (
	ReservedIPReferenceResourceTypeSubnetReservedIPConst = "subnet_reserved_ip"
)

// UnmarshalReservedIPReference unmarshals an instance of ReservedIPReference from the specified map of raw messages.
func UnmarshalReservedIPReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPReference)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservedIPTarget : The target this reserved IP is bound to.
//
// If absent, this reserved IP is provider-owned or unbound.
//
// The resources supported by this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
// Models which "extend" this model:
// - ReservedIPTargetEndpointGatewayReference
// - ReservedIPTargetVirtualNetworkInterfaceReferenceReservedIPTargetContext
// - ReservedIPTargetNetworkInterfaceReferenceTargetContext
// - ReservedIPTargetBareMetalServerNetworkInterfaceReferenceTargetContext
// - ReservedIPTargetLoadBalancerReference
// - ReservedIPTargetVPNGatewayReference
// - ReservedIPTargetVPNServerReference
// - ReservedIPTargetGenericResourceReference
type ReservedIPTarget struct {
	// The CRN for this endpoint gateway.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this endpoint gateway.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this endpoint gateway.
	ID *string `json:"id,omitempty"`

	// The name for this endpoint gateway. The name is unique across all endpoint gateways in the VPC.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ReservedIPTarget.ResourceType property.
// The resource type.
const (
	ReservedIPTargetResourceTypeEndpointGatewayConst = "endpoint_gateway"
)

func (*ReservedIPTarget) isaReservedIPTarget() bool {
	return true
}

type ReservedIPTargetIntf interface {
	isaReservedIPTarget() bool
}

// UnmarshalReservedIPTarget unmarshals an instance of ReservedIPTarget from the specified map of raw messages.
func UnmarshalReservedIPTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPTarget)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ReservedIPTargetPrototype : The target to bind this reserved IP to.  The target must be in the same VPC.
//
// The following targets are supported:
// - An endpoint gateway not already bound to a reserved IP in the subnet's zone.
// - A virtual network interface.
//
// If unspecified, the reserved IP will be created unbound.
// Models which "extend" this model:
// - ReservedIPTargetPrototypeEndpointGatewayIdentity
// - ReservedIPTargetPrototypeVirtualNetworkInterfaceIdentity
type ReservedIPTargetPrototype struct {
	// The unique identifier for this endpoint gateway.
	ID *string `json:"id,omitempty"`

	// The CRN for this endpoint gateway.
	CRN *string `json:"crn,omitempty"`

	// The URL for this endpoint gateway.
	Href *string `json:"href,omitempty"`
}

func (*ReservedIPTargetPrototype) isaReservedIPTargetPrototype() bool {
	return true
}

type ReservedIPTargetPrototypeIntf interface {
	isaReservedIPTargetPrototype() bool
}

// UnmarshalReservedIPTargetPrototype unmarshals an instance of ReservedIPTargetPrototype from the specified map of raw messages.
func UnmarshalReservedIPTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ReservedIPTargetPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ResourceFilter : Identifies one or more resources according to the specified filter property.
type ResourceFilter struct {
	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// UnmarshalResourceFilter unmarshals an instance of ResourceFilter from the specified map of raw messages.
func UnmarshalResourceFilter(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ResourceFilter)
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ResourceFilter
func (resourceFilter *ResourceFilter) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(resourceFilter.ResourceType) {
		_patch["resource_type"] = resourceFilter.ResourceType
	}

	return
}

// ResourceGroupIdentity : The resource group to use. If unspecified, the account's [default resource
// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
// Models which "extend" this model:
// - ResourceGroupIdentityByID
type ResourceGroupIdentity struct {
	// The unique identifier for this resource group.
	ID *string `json:"id,omitempty"`
}

func (*ResourceGroupIdentity) isaResourceGroupIdentity() bool {
	return true
}

type ResourceGroupIdentityIntf interface {
	isaResourceGroupIdentity() bool
}

// UnmarshalResourceGroupIdentity unmarshals an instance of ResourceGroupIdentity from the specified map of raw messages.
func UnmarshalResourceGroupIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ResourceGroupIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ResourceGroupReference : ResourceGroupReference struct
type ResourceGroupReference struct {
	// The URL for this resource group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this resource group.
	ID *string `json:"id" validate:"required"`

	// The name for this resource group.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalResourceGroupReference unmarshals an instance of ResourceGroupReference from the specified map of raw messages.
func UnmarshalResourceGroupReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ResourceGroupReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RestartBareMetalServerOptions : The RestartBareMetalServer options.
type RestartBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRestartBareMetalServerOptions : Instantiate RestartBareMetalServerOptions
func (*VpcV1) NewRestartBareMetalServerOptions(id string) *RestartBareMetalServerOptions {
	return &RestartBareMetalServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *RestartBareMetalServerOptions) SetID(id string) *RestartBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RestartBareMetalServerOptions) SetHeaders(param map[string]string) *RestartBareMetalServerOptions {
	options.Headers = param
	return options
}

// RevokeAccountForPrivatePathServiceGatewayOptions : The RevokeAccountForPrivatePathServiceGateway options.
type RevokeAccountForPrivatePathServiceGatewayOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The account that will be revoked access to the private path service gateway.
	Account AccountIdentityIntf `json:"account" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewRevokeAccountForPrivatePathServiceGatewayOptions : Instantiate RevokeAccountForPrivatePathServiceGatewayOptions
func (*VpcV1) NewRevokeAccountForPrivatePathServiceGatewayOptions(privatePathServiceGatewayID string, account AccountIdentityIntf) *RevokeAccountForPrivatePathServiceGatewayOptions {
	return &RevokeAccountForPrivatePathServiceGatewayOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		Account:                     account,
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *RevokeAccountForPrivatePathServiceGatewayOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *RevokeAccountForPrivatePathServiceGatewayOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetAccount : Allow user to set Account
func (_options *RevokeAccountForPrivatePathServiceGatewayOptions) SetAccount(account AccountIdentityIntf) *RevokeAccountForPrivatePathServiceGatewayOptions {
	_options.Account = account
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *RevokeAccountForPrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *RevokeAccountForPrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// Route : Route struct
type Route struct {
	// The action to perform with a packet matching the route:
	// - `delegate`: delegate to system-provided routes
	// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
	// - `deliver`: deliver the packet to the specified `next_hop`
	// - `drop`: drop the packet
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Action *string `json:"action" validate:"required"`

	// Indicates whether this route will be advertised to the ingress sources specified by the `advertise_routes_to`
	// routing table property.
	Advertise *bool `json:"advertise" validate:"required"`

	// The date and time that the route was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// If present, the resource that created the route. Routes with this property present cannot
	// be directly deleted. All routes with an `origin` of `service` will have this property set,
	// and future `origin` values may also have this property set.
	Creator RouteCreatorIntf `json:"creator,omitempty"`

	// The destination CIDR of the route.
	Destination *string `json:"destination" validate:"required"`

	// The URL for this route.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this route.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the route.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this route. The name is unique across all routes in the routing table.
	Name *string `json:"name" validate:"required"`

	// If `action` is `deliver`, the next hop that packets will be delivered to.  For
	// other `action` values, its `address` will be `0.0.0.0`.
	NextHop RouteNextHopIntf `json:"next_hop" validate:"required"`

	// The origin of this route:
	// - `service`: route was directly created by a service
	// - `user`: route was directly created by a user
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Origin *string `json:"origin" validate:"required"`

	// The priority of this route. Smaller values have higher priority.
	//
	// If a routing table contains multiple routes with the same `zone` and `destination`, the route with the highest
	// priority (smallest value) is selected. If two routes have the same `destination` and `priority`, traffic is
	// distributed between them.
	Priority *int64 `json:"priority" validate:"required"`

	// The zone the route applies to.
	//
	// If subnets are attached to the route's routing table, egress traffic from those
	// subnets in this zone will be subject to this route. If this route's routing table
	// has any of `route_direct_link_ingress`, `route_internet_ingress`,
	// `route_transit_gateway_ingress` or `route_vpc_zone_ingress`  set to`true`, traffic
	// from those ingress sources arriving in this zone will be subject to this route.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the Route.Action property.
// The action to perform with a packet matching the route:
// - `delegate`: delegate to system-provided routes
// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
// - `deliver`: deliver the packet to the specified `next_hop`
// - `drop`: drop the packet
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	RouteActionDelegateConst    = "delegate"
	RouteActionDelegateVPCConst = "delegate_vpc"
	RouteActionDeliverConst     = "deliver"
	RouteActionDropConst        = "drop"
)

// Constants associated with the Route.LifecycleState property.
// The lifecycle state of the route.
const (
	RouteLifecycleStateDeletingConst  = "deleting"
	RouteLifecycleStateFailedConst    = "failed"
	RouteLifecycleStatePendingConst   = "pending"
	RouteLifecycleStateStableConst    = "stable"
	RouteLifecycleStateSuspendedConst = "suspended"
	RouteLifecycleStateUpdatingConst  = "updating"
	RouteLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the Route.Origin property.
// The origin of this route:
// - `service`: route was directly created by a service
// - `user`: route was directly created by a user
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	RouteOriginServiceConst = "service"
	RouteOriginUserConst    = "user"
)

// UnmarshalRoute unmarshals an instance of Route from the specified map of raw messages.
func UnmarshalRoute(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Route)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "advertise", &obj.Advertise)
	if err != nil {
		err = core.SDKErrorf(err, "", "advertise-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "creator", &obj.Creator, UnmarshalRouteCreator)
	if err != nil {
		err = core.SDKErrorf(err, "", "creator-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination", &obj.Destination)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next_hop", &obj.NextHop, UnmarshalRouteNextHop)
	if err != nil {
		err = core.SDKErrorf(err, "", "next_hop-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "origin", &obj.Origin)
	if err != nil {
		err = core.SDKErrorf(err, "", "origin-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "priority", &obj.Priority)
	if err != nil {
		err = core.SDKErrorf(err, "", "priority-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RouteCollection : RouteCollection struct
type RouteCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of routes in the VPC routing table.
	Routes []Route `json:"routes" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalRouteCollection unmarshals an instance of RouteCollection from the specified map of raw messages.
func UnmarshalRouteCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routes", &obj.Routes, UnmarshalRoute)
	if err != nil {
		err = core.SDKErrorf(err, "", "routes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *RouteCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// RouteCollectionVPCContext : RouteCollectionVPCContext struct
type RouteCollectionVPCContext struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of routes in the VPC default routing table.
	Routes []Route `json:"routes" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalRouteCollectionVPCContext unmarshals an instance of RouteCollectionVPCContext from the specified map of raw messages.
func UnmarshalRouteCollectionVPCContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteCollectionVPCContext)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routes", &obj.Routes, UnmarshalRoute)
	if err != nil {
		err = core.SDKErrorf(err, "", "routes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *RouteCollectionVPCContext) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// RouteCreator : If present, the resource that created the route. Routes with this property present cannot be directly deleted. All
// routes with an `origin` of `service` will have this property set, and future `origin` values may also have this
// property set.
// Models which "extend" this model:
// - RouteCreatorVPNGatewayReference
// - RouteCreatorVPNServerReference
type RouteCreator struct {
	// The CRN for this VPN gateway.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this VPN gateway.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this VPN gateway.
	ID *string `json:"id,omitempty"`

	// The name for this VPN gateway. The name is unique across all VPN gateways in the VPC.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the RouteCreator.ResourceType property.
// The resource type.
const (
	RouteCreatorResourceTypeVPNGatewayConst = "vpn_gateway"
)

func (*RouteCreator) isaRouteCreator() bool {
	return true
}

type RouteCreatorIntf interface {
	isaRouteCreator() bool
}

// UnmarshalRouteCreator unmarshals an instance of RouteCreator from the specified map of raw messages.
func UnmarshalRouteCreator(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteCreator)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RouteNextHop : RouteNextHop struct
// Models which "extend" this model:
// - RouteNextHopIP
// - RouteNextHopVPNGatewayConnectionReference
type RouteNextHop struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this VPN gateway connection.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this VPN gateway connection.
	ID *string `json:"id,omitempty"`

	// The name for this VPN gateway connection. The name is unique across all connections for the VPN gateway.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the RouteNextHop.ResourceType property.
// The resource type.
const (
	RouteNextHopResourceTypeVPNGatewayConnectionConst = "vpn_gateway_connection"
)

func (*RouteNextHop) isaRouteNextHop() bool {
	return true
}

type RouteNextHopIntf interface {
	isaRouteNextHop() bool
}

// UnmarshalRouteNextHop unmarshals an instance of RouteNextHop from the specified map of raw messages.
func UnmarshalRouteNextHop(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteNextHop)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RouteNextHopPatch : If `action` is `deliver`, the next hop that packets will be delivered to (must not be
// `0.0.0.0`). For other `action` values, specify `0.0.0.0` or remove it by specifying
// `null`.
//
// At most two routes per `zone` in a table can have the same `destination` and `priority`, and only when each route has
// an `action` of `deliver` and `next_hop` is an IP address.
// Models which "extend" this model:
// - RouteNextHopPatchRouteNextHopIP
// - RouteNextHopPatchVPNGatewayConnectionIdentity
type RouteNextHopPatch struct {
	// The sentinel IP address (`0.0.0.0`).
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The unique identifier for this VPN gateway connection.
	ID *string `json:"id,omitempty"`

	// The URL for this VPN gateway connection.
	Href *string `json:"href,omitempty"`
}

func (*RouteNextHopPatch) isaRouteNextHopPatch() bool {
	return true
}

type RouteNextHopPatchIntf interface {
	isaRouteNextHopPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalRouteNextHopPatch unmarshals an instance of RouteNextHopPatch from the specified map of raw messages.
func UnmarshalRouteNextHopPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteNextHopPatch)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the RouteNextHopPatch
func (routeNextHopPatch *RouteNextHopPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(routeNextHopPatch.Address) {
		_patch["address"] = routeNextHopPatch.Address
	}
	if !core.IsNil(routeNextHopPatch.ID) {
		_patch["id"] = routeNextHopPatch.ID
	}
	if !core.IsNil(routeNextHopPatch.Href) {
		_patch["href"] = routeNextHopPatch.Href
	}

	return
}

// RouteNextHopPrototype : If `action` is `deliver`, the next hop that packets will be delivered to (must not be
// `0.0.0.0`). For other `action` values, it must be omitted or specified as `0.0.0.0`.
//
// At most two routes per `zone` in a table can have the same `destination` and `priority`, and only when each route has
// an `action` of `deliver` and `next_hop` is an IP address.
// Models which "extend" this model:
// - RouteNextHopPrototypeRouteNextHopIP
// - RouteNextHopPrototypeVPNGatewayConnectionIdentity
type RouteNextHopPrototype struct {
	// The sentinel IP address (`0.0.0.0`).
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The unique identifier for this VPN gateway connection.
	ID *string `json:"id,omitempty"`

	// The URL for this VPN gateway connection.
	Href *string `json:"href,omitempty"`
}

func (*RouteNextHopPrototype) isaRouteNextHopPrototype() bool {
	return true
}

type RouteNextHopPrototypeIntf interface {
	isaRouteNextHopPrototype() bool
}

// UnmarshalRouteNextHopPrototype unmarshals an instance of RouteNextHopPrototype from the specified map of raw messages.
func UnmarshalRouteNextHopPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteNextHopPrototype)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RoutePatch : RoutePatch struct
type RoutePatch struct {
	// Indicates whether this route will be advertised to the ingress sources specified by the `advertise_routes_to`
	// routing table property.
	//
	// Since all routes in a routing table with the same `destination` and `zone` must have the same `advertise` value,
	// this property can only be changed for routes with a unique
	// `destination` and `zone` in the routing table. For more information, see [Advertising
	// routes](https://cloud.ibm.com/docs/vpc?topic=vpc-about-custom-routes#rt-advertising-routes).
	Advertise *bool `json:"advertise,omitempty"`

	// The name for this route. The name must not be used by another route in the routing table. Names starting with `ibm-`
	// are reserved for system-provided routes, and are not allowed.
	Name *string `json:"name,omitempty"`

	// If `action` is `deliver`, the next hop that packets will be delivered to (must not be
	// `0.0.0.0`). For other `action` values, specify `0.0.0.0` or remove it by specifying
	// `null`.
	//
	// At most two routes per `zone` in a table can have the same `destination` and `priority`,
	// and only when each route has an `action` of `deliver` and `next_hop` is an IP address.
	NextHop RouteNextHopPatchIntf `json:"next_hop,omitempty"`

	// The priority of this route. Smaller values have higher priority.
	//
	// If a routing table contains multiple routes with the same `zone` and `destination`, the route with the highest
	// priority (smallest value) is selected. If two routes have the same `destination` and `priority`, traffic is
	// distributed between them.
	Priority *int64 `json:"priority,omitempty"`
}

// UnmarshalRoutePatch unmarshals an instance of RoutePatch from the specified map of raw messages.
func UnmarshalRoutePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutePatch)
	err = core.UnmarshalPrimitive(m, "advertise", &obj.Advertise)
	if err != nil {
		err = core.SDKErrorf(err, "", "advertise-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next_hop", &obj.NextHop, UnmarshalRouteNextHopPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "next_hop-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "priority", &obj.Priority)
	if err != nil {
		err = core.SDKErrorf(err, "", "priority-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the RoutePatch
func (routePatch *RoutePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(routePatch.Advertise) {
		_patch["advertise"] = routePatch.Advertise
	}
	if !core.IsNil(routePatch.Name) {
		_patch["name"] = routePatch.Name
	}
	if !core.IsNil(routePatch.NextHop) {
		_patch["next_hop"] = routePatch.NextHop.asPatch()
	}
	if !core.IsNil(routePatch.Priority) {
		_patch["priority"] = routePatch.Priority
	}

	return
}

// RoutePrototype : RoutePrototype struct
type RoutePrototype struct {
	// The action to perform with a packet matching the route:
	// - `delegate`: delegate to system-provided routes
	// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
	// - `deliver`: deliver the packet to the specified `next_hop`
	// - `drop`: drop the packet.
	Action *string `json:"action,omitempty"`

	// Indicates whether this route will be advertised to the ingress sources specified by the `advertise_routes_to`
	// routing table property.
	//
	// All routes in a routing table with the same `destination` and `zone` must have the same
	// `advertise` value.
	Advertise *bool `json:"advertise,omitempty"`

	// The destination CIDR of the route. The host identifier in the CIDR must be zero.
	//
	// At most two routes per `zone` in a table can have the same `destination` and
	// `priority`, and only if both routes have an `action` of `deliver` and the `next_hop` is an IP address.
	Destination *string `json:"destination" validate:"required"`

	// The name for this route. The name must not be used by another route in the routing table. Names starting with `ibm-`
	// are reserved for system-provided routes, and are not allowed. If unspecified, the name will be a hyphenated list of
	// randomly-selected words.
	Name *string `json:"name,omitempty"`

	// If `action` is `deliver`, the next hop that packets will be delivered to (must not be
	// `0.0.0.0`). For other `action` values, it must be omitted or specified as `0.0.0.0`.
	//
	// At most two routes per `zone` in a table can have the same `destination` and `priority`,
	// and only when each route has an `action` of `deliver` and `next_hop` is an IP address.
	NextHop RouteNextHopPrototypeIntf `json:"next_hop,omitempty"`

	// The priority of this route. Smaller values have higher priority.
	//
	// If a routing table contains multiple routes with the same `zone` and `destination`, the route with the highest
	// priority (smallest value) is selected. If two routes have the same `destination` and `priority`, traffic is
	// distributed between them.
	Priority *int64 `json:"priority,omitempty"`

	// The zone to apply the route to.
	//
	// If subnets are attached to the route's routing table, egress traffic from those
	// subnets in this zone will be subject to this route. If this route's routing table
	// has any of `route_direct_link_ingress`, `route_internet_ingress`,
	// `route_transit_gateway_ingress` or `route_vpc_zone_ingress`  set to`true`, traffic
	// from those ingress sources arriving in this zone will be subject to this route.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`
}

// Constants associated with the RoutePrototype.Action property.
// The action to perform with a packet matching the route:
// - `delegate`: delegate to system-provided routes
// - `delegate_vpc`: delegate to system-provided routes, ignoring Internet-bound routes
// - `deliver`: deliver the packet to the specified `next_hop`
// - `drop`: drop the packet.
const (
	RoutePrototypeActionDelegateConst    = "delegate"
	RoutePrototypeActionDelegateVPCConst = "delegate_vpc"
	RoutePrototypeActionDeliverConst     = "deliver"
	RoutePrototypeActionDropConst        = "drop"
)

// NewRoutePrototype : Instantiate RoutePrototype (Generic Model Constructor)
func (*VpcV1) NewRoutePrototype(destination string, zone ZoneIdentityIntf) (_model *RoutePrototype, err error) {
	_model = &RoutePrototype{
		Destination: core.StringPtr(destination),
		Zone:        zone,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalRoutePrototype unmarshals an instance of RoutePrototype from the specified map of raw messages.
func UnmarshalRoutePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutePrototype)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "advertise", &obj.Advertise)
	if err != nil {
		err = core.SDKErrorf(err, "", "advertise-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "destination", &obj.Destination)
	if err != nil {
		err = core.SDKErrorf(err, "", "destination-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next_hop", &obj.NextHop, UnmarshalRouteNextHopPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "next_hop-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "priority", &obj.Priority)
	if err != nil {
		err = core.SDKErrorf(err, "", "priority-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RouteReference : RouteReference struct
type RouteReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this route.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this route.
	ID *string `json:"id" validate:"required"`

	// The name for this route. The name is unique across all routes in the routing table.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalRouteReference unmarshals an instance of RouteReference from the specified map of raw messages.
func UnmarshalRouteReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RouteReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RoutingTable : RoutingTable struct
type RoutingTable struct {
	// The filters specifying the resources that may create routes in this routing table.
	//
	// The resources and types of filters supported by this property is expected to
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AcceptRoutesFrom []ResourceFilter `json:"accept_routes_from" validate:"required"`

	// The ingress sources to advertise routes to. Routes in the table with `advertise` enabled will be advertised to these
	// sources.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AdvertiseRoutesTo []string `json:"advertise_routes_to" validate:"required"`

	// The date and time that this routing table was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this VPC routing table.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this routing table.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this routing table.
	ID *string `json:"id" validate:"required"`

	// Indicates whether this is the default routing table for this VPC.
	IsDefault *bool `json:"is_default" validate:"required"`

	// The lifecycle state of the routing table.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this routing table. The name is unique across all routing tables for the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this routing table.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from
	// [Direct Link](https://cloud.ibm.com/docs/dl) to this VPC.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteDirectLinkIngress *bool `json:"route_direct_link_ingress" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from the internet.
	//
	// Incoming traffic will be routed according to the routing table with two exceptions:
	// - Traffic destined for IP addresses associated with public gateways will not be
	//   subject to routes in this routing table.
	// - Routes with an `action` of `deliver` are treated as `drop` unless the `next_hop` is
	//   an IP address in a subnet in the route's `zone` that is able to accept traffic.
	//   Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	//   connection, the packet will be dropped.
	RouteInternetIngress *bool `json:"route_internet_ingress" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from from [Transit
	// Gateway](https://cloud.ibm.com/docs/transit-gateway) to this VPC.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteTransitGatewayIngress *bool `json:"route_transit_gateway_ingress" validate:"required"`

	// Indicates whether this routing table is used to route traffic that originates from subnets in other zones in this
	// VPC.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteVPCZoneIngress *bool `json:"route_vpc_zone_ingress" validate:"required"`

	// The routes for this routing table.
	Routes []RouteReference `json:"routes" validate:"required"`

	// The subnets to which this routing table is attached.
	Subnets []SubnetReference `json:"subnets" validate:"required"`
}

// Constants associated with the RoutingTable.AdvertiseRoutesTo property.
// An ingress source that routes can be advertised to:
//
// - `direct_link` (requires `route_direct_link_ingress` be set to `true`)
// - `transit_gateway` (requires `route_transit_gateway_ingress` be set to `true`).
const (
	RoutingTableAdvertiseRoutesToDirectLinkConst     = "direct_link"
	RoutingTableAdvertiseRoutesToTransitGatewayConst = "transit_gateway"
)

// Constants associated with the RoutingTable.LifecycleState property.
// The lifecycle state of the routing table.
const (
	RoutingTableLifecycleStateDeletingConst  = "deleting"
	RoutingTableLifecycleStateFailedConst    = "failed"
	RoutingTableLifecycleStatePendingConst   = "pending"
	RoutingTableLifecycleStateStableConst    = "stable"
	RoutingTableLifecycleStateSuspendedConst = "suspended"
	RoutingTableLifecycleStateUpdatingConst  = "updating"
	RoutingTableLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the RoutingTable.ResourceType property.
// The resource type.
const (
	RoutingTableResourceTypeRoutingTableConst = "routing_table"
)

// UnmarshalRoutingTable unmarshals an instance of RoutingTable from the specified map of raw messages.
func UnmarshalRoutingTable(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutingTable)
	err = core.UnmarshalModel(m, "accept_routes_from", &obj.AcceptRoutesFrom, UnmarshalResourceFilter)
	if err != nil {
		err = core.SDKErrorf(err, "", "accept_routes_from-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "advertise_routes_to", &obj.AdvertiseRoutesTo)
	if err != nil {
		err = core.SDKErrorf(err, "", "advertise_routes_to-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "is_default", &obj.IsDefault)
	if err != nil {
		err = core.SDKErrorf(err, "", "is_default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_direct_link_ingress", &obj.RouteDirectLinkIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_direct_link_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_internet_ingress", &obj.RouteInternetIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_internet_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_transit_gateway_ingress", &obj.RouteTransitGatewayIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_transit_gateway_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_vpc_zone_ingress", &obj.RouteVPCZoneIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_vpc_zone_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routes", &obj.Routes, UnmarshalRouteReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "routes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// RoutingTableCollection : RoutingTableCollection struct
type RoutingTableCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of routing tables.
	RoutingTables []RoutingTable `json:"routing_tables" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalRoutingTableCollection unmarshals an instance of RoutingTableCollection from the specified map of raw messages.
func UnmarshalRoutingTableCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutingTableCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routing_tables", &obj.RoutingTables, UnmarshalRoutingTable)
	if err != nil {
		err = core.SDKErrorf(err, "", "routing_tables-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *RoutingTableCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// RoutingTableIdentity : Identifies a routing table by a unique property.
// Models which "extend" this model:
// - RoutingTableIdentityByCRN
// - RoutingTableIdentityByID
// - RoutingTableIdentityByHref
type RoutingTableIdentity struct {
	// The CRN for this VPC routing table.
	CRN *string `json:"crn,omitempty"`

	// The unique identifier for this routing table.
	ID *string `json:"id,omitempty"`

	// The URL for this routing table.
	Href *string `json:"href,omitempty"`
}

func (*RoutingTableIdentity) isaRoutingTableIdentity() bool {
	return true
}

type RoutingTableIdentityIntf interface {
	isaRoutingTableIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalRoutingTableIdentity unmarshals an instance of RoutingTableIdentity from the specified map of raw messages.
func UnmarshalRoutingTableIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutingTableIdentity)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the RoutingTableIdentity
func (routingTableIdentity *RoutingTableIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(routingTableIdentity.CRN) {
		_patch["crn"] = routingTableIdentity.CRN
	}
	if !core.IsNil(routingTableIdentity.ID) {
		_patch["id"] = routingTableIdentity.ID
	}
	if !core.IsNil(routingTableIdentity.Href) {
		_patch["href"] = routingTableIdentity.Href
	}

	return
}

// RoutingTablePatch : RoutingTablePatch struct
type RoutingTablePatch struct {
	// The filters specifying the resources that may create routes in this routing table
	// (replacing any existing filters). All routes created by resources that match a given filter will be removed when an
	// existing filter is removed. Therefore, if an empty array is specified, all filters will be removed, resulting in all
	// routes not directly created by the user being removed.
	//
	// If specified, `resource_type` must be `vpn_gateway` or `vpn_server`.
	AcceptRoutesFrom []ResourceFilter `json:"accept_routes_from,omitempty"`

	// The ingress sources to advertise routes to, replacing any existing sources to advertise to. Routes in the table with
	// `advertise` enabled will be advertised to these sources.
	AdvertiseRoutesTo []string `json:"advertise_routes_to,omitempty"`

	// The name for this routing table. The name must not be used by another routing table in the VPC.
	Name *string `json:"name,omitempty"`

	// Indicates whether this routing table is used to route traffic that originates from
	// [Direct Link](https://cloud.ibm.com/docs/dl/) to this VPC. Updating to `true` selects this routing table, provided
	// no other routing table in the VPC already has this property set to `true`, and no subnets are attached to this
	// routing table. Updating to
	// `false` deselects this routing table, provided `direct_link` is absent from
	// `advertise_routes_to`.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteDirectLinkIngress *bool `json:"route_direct_link_ingress,omitempty"`

	// Indicates whether this routing table is used to route traffic that originates from the internet.  Updating to `true`
	// selects this routing table, provided no other routing table in the VPC already has this property set to `true`.
	// Updating to `false` deselects this routing table.
	//
	// Incoming traffic will be routed according to the routing table with two exceptions:
	// -  Traffic destined for IP addresses associated with public gateways will not be subject
	//    to routes in this routing table.
	// -  Routes with an `action` of `deliver` are treated as `drop` unless the `next_hop` is an
	//    IP address in a subnet in the route's `zone` that is able to accept traffic.
	//    Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	//    connection, the packet will be dropped.
	RouteInternetIngress *bool `json:"route_internet_ingress,omitempty"`

	// Indicates whether this routing table is used to route traffic that originates from
	// [Transit Gateway](https://cloud.ibm.com/docs/transit-gateway) to this VPC. Updating to
	// `true` selects this routing table, provided no other routing table in the VPC already has this property set to
	// `true`, and no subnets are attached to this routing table. Updating to `false` deselects this routing table,
	// provided `transit_gateway` is absent from `advertise_routes_to`.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	//
	// If [Classic Access](https://cloud.ibm.com/docs/vpc?topic=vpc-setting-up-access-to-classic-infrastructure) is enabled
	// for this VPC, and this property is set to `true`, its incoming traffic will also be routed according to this routing
	// table.
	RouteTransitGatewayIngress *bool `json:"route_transit_gateway_ingress,omitempty"`

	// Indicates whether this routing table is used to route traffic that originates from subnets in other zones in this
	// VPC. Updating to `true` selects this routing table, provided no other routing table in the VPC already has this
	// property set to `true`, and no subnets are attached to this routing table. Updating to `false` deselects this
	// routing table.
	//
	// Incoming traffic will be routed according to the routing table with one exception: routes with an `action` of
	// `deliver` are treated as `drop` unless the `next_hop` is an IP address in a subnet in the route's `zone` that is
	// able to accept traffic. Therefore, if an incoming packet matches a route with a `next_hop` of a VPN gateway
	// connection, the packet will be dropped.
	RouteVPCZoneIngress *bool `json:"route_vpc_zone_ingress,omitempty"`
}

// Constants associated with the RoutingTablePatch.AdvertiseRoutesTo property.
// An ingress source that routes can be advertised to:
//
// - `direct_link` (requires `route_direct_link_ingress` be set to `true`)
// - `transit_gateway` (requires `route_transit_gateway_ingress` be set to `true`).
const (
	RoutingTablePatchAdvertiseRoutesToDirectLinkConst     = "direct_link"
	RoutingTablePatchAdvertiseRoutesToTransitGatewayConst = "transit_gateway"
)

// UnmarshalRoutingTablePatch unmarshals an instance of RoutingTablePatch from the specified map of raw messages.
func UnmarshalRoutingTablePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutingTablePatch)
	err = core.UnmarshalModel(m, "accept_routes_from", &obj.AcceptRoutesFrom, UnmarshalResourceFilter)
	if err != nil {
		err = core.SDKErrorf(err, "", "accept_routes_from-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "advertise_routes_to", &obj.AdvertiseRoutesTo)
	if err != nil {
		err = core.SDKErrorf(err, "", "advertise_routes_to-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_direct_link_ingress", &obj.RouteDirectLinkIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_direct_link_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_internet_ingress", &obj.RouteInternetIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_internet_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_transit_gateway_ingress", &obj.RouteTransitGatewayIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_transit_gateway_ingress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "route_vpc_zone_ingress", &obj.RouteVPCZoneIngress)
	if err != nil {
		err = core.SDKErrorf(err, "", "route_vpc_zone_ingress-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the RoutingTablePatch
func (routingTablePatch *RoutingTablePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(routingTablePatch.AcceptRoutesFrom) {
		var acceptRoutesFromPatches []map[string]interface{}
		for _, acceptRoutesFrom := range routingTablePatch.AcceptRoutesFrom {
			acceptRoutesFromPatches = append(acceptRoutesFromPatches, acceptRoutesFrom.asPatch())
		}
		_patch["accept_routes_from"] = acceptRoutesFromPatches
	}
	if !core.IsNil(routingTablePatch.AdvertiseRoutesTo) {
		_patch["advertise_routes_to"] = routingTablePatch.AdvertiseRoutesTo
	}
	if !core.IsNil(routingTablePatch.Name) {
		_patch["name"] = routingTablePatch.Name
	}
	if !core.IsNil(routingTablePatch.RouteDirectLinkIngress) {
		_patch["route_direct_link_ingress"] = routingTablePatch.RouteDirectLinkIngress
	}
	if !core.IsNil(routingTablePatch.RouteInternetIngress) {
		_patch["route_internet_ingress"] = routingTablePatch.RouteInternetIngress
	}
	if !core.IsNil(routingTablePatch.RouteTransitGatewayIngress) {
		_patch["route_transit_gateway_ingress"] = routingTablePatch.RouteTransitGatewayIngress
	}
	if !core.IsNil(routingTablePatch.RouteVPCZoneIngress) {
		_patch["route_vpc_zone_ingress"] = routingTablePatch.RouteVPCZoneIngress
	}

	return
}

// RoutingTableReference : RoutingTableReference struct
type RoutingTableReference struct {
	// The CRN for this VPC routing table.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this routing table.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this routing table.
	ID *string `json:"id" validate:"required"`

	// The name for this routing table. The name is unique across all routing tables for the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the RoutingTableReference.ResourceType property.
// The resource type.
const (
	RoutingTableReferenceResourceTypeRoutingTableConst = "routing_table"
)

// UnmarshalRoutingTableReference unmarshals an instance of RoutingTableReference from the specified map of raw messages.
func UnmarshalRoutingTableReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(RoutingTableReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroup : SecurityGroup struct
type SecurityGroup struct {
	// The date and time that this security group was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this security group.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this security group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this security group.
	ID *string `json:"id" validate:"required"`

	// The name for this security group. The name is unique across all security groups for the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this security group.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The rules for this security group. If no rules exist, no traffic will be allowed.
	Rules []SecurityGroupRuleIntf `json:"rules" validate:"required"`

	// The targets for this security group.
	Targets []SecurityGroupTargetReferenceIntf `json:"targets" validate:"required"`

	// The VPC this security group resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// UnmarshalSecurityGroup unmarshals an instance of SecurityGroup from the specified map of raw messages.
func UnmarshalSecurityGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroup)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalSecurityGroupRule)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "targets", &obj.Targets, UnmarshalSecurityGroupTargetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupCollection : SecurityGroupCollection struct
type SecurityGroupCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of security groups.
	SecurityGroups []SecurityGroup `json:"security_groups" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalSecurityGroupCollection unmarshals an instance of SecurityGroupCollection from the specified map of raw messages.
func UnmarshalSecurityGroupCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *SecurityGroupCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// SecurityGroupIdentity : Identifies a security group by a unique property.
// Models which "extend" this model:
// - SecurityGroupIdentityByID
// - SecurityGroupIdentityByCRN
// - SecurityGroupIdentityByHref
type SecurityGroupIdentity struct {
	// The unique identifier for this security group.
	ID *string `json:"id,omitempty"`

	// The CRN for this security group.
	CRN *string `json:"crn,omitempty"`

	// The URL for this security group.
	Href *string `json:"href,omitempty"`
}

func (*SecurityGroupIdentity) isaSecurityGroupIdentity() bool {
	return true
}

type SecurityGroupIdentityIntf interface {
	isaSecurityGroupIdentity() bool
}

// UnmarshalSecurityGroupIdentity unmarshals an instance of SecurityGroupIdentity from the specified map of raw messages.
func UnmarshalSecurityGroupIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupPatch : SecurityGroupPatch struct
type SecurityGroupPatch struct {
	// The name for this security group. The name must not be used by another security group for the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalSecurityGroupPatch unmarshals an instance of SecurityGroupPatch from the specified map of raw messages.
func UnmarshalSecurityGroupPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the SecurityGroupPatch
func (securityGroupPatch *SecurityGroupPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(securityGroupPatch.Name) {
		_patch["name"] = securityGroupPatch.Name
	}

	return
}

// SecurityGroupReference : SecurityGroupReference struct
type SecurityGroupReference struct {
	// The CRN for this security group.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this security group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this security group.
	ID *string `json:"id" validate:"required"`

	// The name for this security group. The name is unique across all security groups for the VPC.
	Name *string `json:"name" validate:"required"`
}

// UnmarshalSecurityGroupReference unmarshals an instance of SecurityGroupReference from the specified map of raw messages.
func UnmarshalSecurityGroupReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupRule : SecurityGroupRule struct
// Models which "extend" this model:
// - SecurityGroupRuleSecurityGroupRuleProtocolAll
// - SecurityGroupRuleSecurityGroupRuleProtocolIcmp
// - SecurityGroupRuleSecurityGroupRuleProtocolTcpudp
type SecurityGroupRule struct {
	// The direction of traffic to allow.
	Direction *string `json:"direction" validate:"required"`

	// The URL for this security group rule.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this security group rule.
	ID *string `json:"id" validate:"required"`

	// The IP version to allow. The format of `local.address`, `remote.address`,
	// `local.cidr_block` or `remote.cidr_block` must match this property, if they are used.
	//
	// If `remote` references a security group, then this rule only applies to IP addresses in that group matching this IP
	// version.
	IPVersion *string `json:"ip_version" validate:"required"`

	// The local IP address or range of local IP addresses to which this rule will allow inbound
	// traffic (or from which, for outbound traffic). A CIDR block of `0.0.0.0/0` allows traffic
	// to all local IP addresses (or from all local IP addresses, for outbound rules).
	Local SecurityGroupRuleLocalIntf `json:"local" validate:"required"`

	// The network protocol.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Protocol *string `json:"protocol" validate:"required"`

	// The remote IP addresses or security groups from which this rule allows traffic (or to
	// which, for outbound rules). A CIDR block of `0.0.0.0/0` allows traffic from any source
	// (or to any destination, for outbound rules).
	Remote SecurityGroupRuleRemoteIntf `json:"remote" validate:"required"`

	// The ICMP traffic code to allow. If absent, all codes are allowed.
	Code *int64 `json:"code,omitempty"`

	// The ICMP traffic type to allow. If absent, all types are allowed.
	Type *int64 `json:"type,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	PortMax *int64 `json:"port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	PortMin *int64 `json:"port_min,omitempty"`
}

// Constants associated with the SecurityGroupRule.Direction property.
// The direction of traffic to allow.
const (
	SecurityGroupRuleDirectionInboundConst  = "inbound"
	SecurityGroupRuleDirectionOutboundConst = "outbound"
)

// Constants associated with the SecurityGroupRule.IPVersion property.
// The IP version to allow. The format of `local.address`, `remote.address`,
// `local.cidr_block` or `remote.cidr_block` must match this property, if they are used.
//
// If `remote` references a security group, then this rule only applies to IP addresses in that group matching this IP
// version.
const (
	SecurityGroupRuleIPVersionIpv4Const = "ipv4"
)

// Constants associated with the SecurityGroupRule.Protocol property.
// The network protocol.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	SecurityGroupRuleProtocolAllConst  = "all"
	SecurityGroupRuleProtocolIcmpConst = "icmp"
	SecurityGroupRuleProtocolTCPConst  = "tcp"
	SecurityGroupRuleProtocolUDPConst  = "udp"
)

func (*SecurityGroupRule) isaSecurityGroupRule() bool {
	return true
}

type SecurityGroupRuleIntf interface {
	isaSecurityGroupRule() bool
}

// UnmarshalSecurityGroupRule unmarshals an instance of SecurityGroupRule from the specified map of raw messages.
func UnmarshalSecurityGroupRule(m map[string]json.RawMessage, result interface{}) (err error) {
	// Retrieve discriminator value to determine correct "subclass".
	var discValue string
	err = core.UnmarshalPrimitive(m, "protocol", &discValue)
	if err != nil {
		errMsg := fmt.Sprintf("error unmarshalling discriminator property 'protocol': %s", err.Error())
		err = core.SDKErrorf(err, errMsg, "discriminator-unmarshal-error", common.GetComponentInfo())
		return
	}
	if discValue == "" {
		err = core.SDKErrorf(err, "required discriminator property 'protocol' not found in JSON object", "missing-discriminator", common.GetComponentInfo())
		return
	}
	if discValue == "all" {
		err = core.UnmarshalModel(m, "", result, UnmarshalSecurityGroupRuleSecurityGroupRuleProtocolAll)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-SecurityGroupRuleSecurityGroupRuleProtocolAll-error", common.GetComponentInfo())
		}
	} else if discValue == "icmp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalSecurityGroupRuleSecurityGroupRuleProtocolIcmp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-SecurityGroupRuleSecurityGroupRuleProtocolIcmp-error", common.GetComponentInfo())
		}
	} else if discValue == "tcp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalSecurityGroupRuleSecurityGroupRuleProtocolTcpudp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-SecurityGroupRuleSecurityGroupRuleProtocolTcpudp-error", common.GetComponentInfo())
		}
	} else if discValue == "udp" {
		err = core.UnmarshalModel(m, "", result, UnmarshalSecurityGroupRuleSecurityGroupRuleProtocolTcpudp)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-SecurityGroupRuleSecurityGroupRuleProtocolTcpudp-error", common.GetComponentInfo())
		}
	} else {
		errMsg := fmt.Sprintf("unrecognized value for discriminator property 'protocol': %s", discValue)
		err = core.SDKErrorf(err, errMsg, "invalid-discriminator", common.GetComponentInfo())
	}
	return
}

// SecurityGroupRuleCollection : SecurityGroupRuleCollection struct
type SecurityGroupRuleCollection struct {
	// The rules for the security group.
	Rules []SecurityGroupRuleIntf `json:"rules" validate:"required"`
}

// UnmarshalSecurityGroupRuleCollection unmarshals an instance of SecurityGroupRuleCollection from the specified map of raw messages.
func UnmarshalSecurityGroupRuleCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleCollection)
	err = core.UnmarshalModel(m, "rules", &obj.Rules, UnmarshalSecurityGroupRule)
	if err != nil {
		err = core.SDKErrorf(err, "", "rules-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupRuleLocal : The local IP address or range of local IP addresses to which this rule will allow inbound traffic (or from which, for
// outbound traffic). A CIDR block of `0.0.0.0/0` allows traffic to all local IP addresses (or from all local IP
// addresses, for outbound rules).
// Models which "extend" this model:
// - SecurityGroupRuleLocalIP
// - SecurityGroupRuleLocalCIDR
type SecurityGroupRuleLocal struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The CIDR block.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 address
	// blocks in the future.
	CIDRBlock *string `json:"cidr_block,omitempty"`
}

func (*SecurityGroupRuleLocal) isaSecurityGroupRuleLocal() bool {
	return true
}

type SecurityGroupRuleLocalIntf interface {
	isaSecurityGroupRuleLocal() bool
}

// UnmarshalSecurityGroupRuleLocal unmarshals an instance of SecurityGroupRuleLocal from the specified map of raw messages.
func UnmarshalSecurityGroupRuleLocal(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleLocal)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr_block", &obj.CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr_block-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupRuleLocalPatch : The local IP address or range of local IP addresses to which this rule will allow inbound traffic (or from which, for
// outbound traffic). Can be specified as an IP address or a CIDR block.
//
// Specify a CIDR block of `0.0.0.0/0` to allow traffic to all local IP addresses (or from all local IP addresses, for
// outbound rules).
// Models which "extend" this model:
// - SecurityGroupRuleLocalPatchIP
// - SecurityGroupRuleLocalPatchCIDR
type SecurityGroupRuleLocalPatch struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The CIDR block.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 address
	// blocks in the future.
	CIDRBlock *string `json:"cidr_block,omitempty"`
}

func (*SecurityGroupRuleLocalPatch) isaSecurityGroupRuleLocalPatch() bool {
	return true
}

type SecurityGroupRuleLocalPatchIntf interface {
	isaSecurityGroupRuleLocalPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalSecurityGroupRuleLocalPatch unmarshals an instance of SecurityGroupRuleLocalPatch from the specified map of raw messages.
func UnmarshalSecurityGroupRuleLocalPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleLocalPatch)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr_block", &obj.CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr_block-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the SecurityGroupRuleLocalPatch
func (securityGroupRuleLocalPatch *SecurityGroupRuleLocalPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(securityGroupRuleLocalPatch.Address) {
		_patch["address"] = securityGroupRuleLocalPatch.Address
	}
	if !core.IsNil(securityGroupRuleLocalPatch.CIDRBlock) {
		_patch["cidr_block"] = securityGroupRuleLocalPatch.CIDRBlock
	}

	return
}

// SecurityGroupRuleLocalPrototype : The local IP address or range of local IP addresses to which this rule will allow inbound traffic (or from which, for
// outbound traffic).
//
// If unspecified, a CIDR block of `0.0.0.0/0` will be used to allow traffic to all local IP addresses (or from all
// local IP addresses, for outbound rules).
// Models which "extend" this model:
// - SecurityGroupRuleLocalPrototypeIP
// - SecurityGroupRuleLocalPrototypeCIDR
type SecurityGroupRuleLocalPrototype struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The CIDR block.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 address
	// blocks in the future.
	CIDRBlock *string `json:"cidr_block,omitempty"`
}

func (*SecurityGroupRuleLocalPrototype) isaSecurityGroupRuleLocalPrototype() bool {
	return true
}

type SecurityGroupRuleLocalPrototypeIntf interface {
	isaSecurityGroupRuleLocalPrototype() bool
}

// UnmarshalSecurityGroupRuleLocalPrototype unmarshals an instance of SecurityGroupRuleLocalPrototype from the specified map of raw messages.
func UnmarshalSecurityGroupRuleLocalPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleLocalPrototype)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr_block", &obj.CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr_block-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupRulePatch : SecurityGroupRulePatch struct
type SecurityGroupRulePatch struct {
	// The ICMP traffic code to allow. If set, `type` must also be set.
	//
	// Specify `null` to remove an existing ICMP traffic code.
	Code *int64 `json:"code,omitempty"`

	// The direction of traffic to allow.
	Direction *string `json:"direction,omitempty"`

	// The IP version to allow. The format of `local.address`, `remote.address`,
	// `local.cidr_block` or `remote.cidr_block` must match this property, if they are used.
	//
	// If `remote` references a security group, then this rule only applies to IP addresses in that group matching this IP
	// version.
	IPVersion *string `json:"ip_version,omitempty"`

	// The local IP address or range of local IP addresses to which this rule will allow inbound
	// traffic (or from which, for outbound traffic). Can be specified as an IP address or a CIDR
	// block.
	//
	// Specify a CIDR block of `0.0.0.0/0` to allow traffic to all local IP addresses (or from all
	// local IP addresses, for outbound rules).
	Local SecurityGroupRuleLocalPatchIntf `json:"local,omitempty"`

	// The inclusive upper bound of the protocol destination port range. If set, `port_min` must also be set, and must not
	// be larger.
	//
	// Specify `null` to remove an existing upper bound.
	PortMax *int64 `json:"port_max,omitempty"`

	// The inclusive lower bound of the protocol destination port range. If set, `port_max` must also be set, and must not
	// be smaller.
	//
	// Specify `null` to remove an existing lower bound.
	PortMin *int64 `json:"port_min,omitempty"`

	// The remote IP addresses or security groups from which this rule will allow traffic (or to
	// which, for outbound rules). Can be specified as an IP address, a CIDR block, or a
	// security group. A CIDR block of `0.0.0.0/0` will allow traffic from any source (or to
	// any destination, for outbound rules).
	Remote SecurityGroupRuleRemotePatchIntf `json:"remote,omitempty"`

	// The ICMP traffic type to allow.
	//
	// Specify `null` to remove an existing ICMP traffic type value.
	Type *int64 `json:"type,omitempty"`
}

// Constants associated with the SecurityGroupRulePatch.Direction property.
// The direction of traffic to allow.
const (
	SecurityGroupRulePatchDirectionInboundConst  = "inbound"
	SecurityGroupRulePatchDirectionOutboundConst = "outbound"
)

// Constants associated with the SecurityGroupRulePatch.IPVersion property.
// The IP version to allow. The format of `local.address`, `remote.address`,
// `local.cidr_block` or `remote.cidr_block` must match this property, if they are used.
//
// If `remote` references a security group, then this rule only applies to IP addresses in that group matching this IP
// version.
const (
	SecurityGroupRulePatchIPVersionIpv4Const = "ipv4"
)

// UnmarshalSecurityGroupRulePatch unmarshals an instance of SecurityGroupRulePatch from the specified map of raw messages.
func UnmarshalSecurityGroupRulePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRulePatch)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "direction", &obj.Direction)
	if err != nil {
		err = core.SDKErrorf(err, "", "direction-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "local", &obj.Local, UnmarshalSecurityGroupRuleLocalPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "local-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_max", &obj.PortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_min", &obj.PortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalSecurityGroupRuleRemotePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the SecurityGroupRulePatch
func (securityGroupRulePatch *SecurityGroupRulePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(securityGroupRulePatch.Code) {
		_patch["code"] = securityGroupRulePatch.Code
	}
	if !core.IsNil(securityGroupRulePatch.Direction) {
		_patch["direction"] = securityGroupRulePatch.Direction
	}
	if !core.IsNil(securityGroupRulePatch.IPVersion) {
		_patch["ip_version"] = securityGroupRulePatch.IPVersion
	}
	if !core.IsNil(securityGroupRulePatch.Local) {
		_patch["local"] = securityGroupRulePatch.Local.asPatch()
	}
	if !core.IsNil(securityGroupRulePatch.PortMax) {
		_patch["port_max"] = securityGroupRulePatch.PortMax
	}
	if !core.IsNil(securityGroupRulePatch.PortMin) {
		_patch["port_min"] = securityGroupRulePatch.PortMin
	}
	if !core.IsNil(securityGroupRulePatch.Remote) {
		_patch["remote"] = securityGroupRulePatch.Remote.asPatch()
	}
	if !core.IsNil(securityGroupRulePatch.Type) {
		_patch["type"] = securityGroupRulePatch.Type
	}

	return
}

// SecurityGroupRulePrototype : SecurityGroupRulePrototype struct
// Models which "extend" this model:
// - SecurityGroupRulePrototypeSecurityGroupRuleProtocolAll
// - SecurityGroupRulePrototypeSecurityGroupRuleProtocolIcmp
// - SecurityGroupRulePrototypeSecurityGroupRuleProtocolTcpudp
type SecurityGroupRulePrototype struct {
	// The direction of traffic to allow.
	Direction *string `json:"direction" validate:"required"`

	// The IP version to allow. The format of `local.address`, `remote.address`,
	// `local.cidr_block` or `remote.cidr_block` must match this property, if they are used.
	//
	// If `remote` references a security group, then this rule only applies to IP addresses in that group matching this IP
	// version.
	IPVersion *string `json:"ip_version,omitempty"`

	// The local IP address or range of local IP addresses to which this rule will allow inbound
	// traffic (or from which, for outbound traffic).
	//
	// If unspecified, a CIDR block of `0.0.0.0/0` will be used to allow traffic to all local IP
	// addresses (or from all local IP addresses, for outbound rules).
	Local SecurityGroupRuleLocalPrototypeIntf `json:"local,omitempty"`

	// The network protocol.
	Protocol *string `json:"protocol" validate:"required"`

	// The remote IP addresses or security groups from which this rule will allow traffic (or to
	// which, for outbound rules). Can be specified as an IP address, a CIDR block, or a
	// security group within the VPC.
	//
	// If unspecified, a CIDR block of `0.0.0.0/0` will be used to allow traffic from any source
	// (or to any destination, for outbound rules).
	Remote SecurityGroupRuleRemotePrototypeIntf `json:"remote,omitempty"`

	// The ICMP traffic code to allow.
	//
	// If specified, `type` must also be specified.  If unspecified, all codes are allowed.
	Code *int64 `json:"code,omitempty"`

	// The ICMP traffic type to allow.
	//
	// If unspecified, all types are allowed.
	Type *int64 `json:"type,omitempty"`

	// The inclusive upper bound of the TCP or UDP destination port range.
	//
	// If specified, `port_min` must also be specified, and must not be larger. If unspecified,
	// `port_min` must also be unspecified, allowing traffic on all destination ports.
	PortMax *int64 `json:"port_max,omitempty"`

	// The inclusive lower bound of the TCP or UDP destination port range.
	//
	// If specified, `port_max` must also be specified, and must not be smaller. If unspecified, `port_max` must also be
	// unspecified, allowing traffic on all destination ports.
	PortMin *int64 `json:"port_min,omitempty"`
}

// Constants associated with the SecurityGroupRulePrototype.Direction property.
// The direction of traffic to allow.
const (
	SecurityGroupRulePrototypeDirectionInboundConst  = "inbound"
	SecurityGroupRulePrototypeDirectionOutboundConst = "outbound"
)

// Constants associated with the SecurityGroupRulePrototype.IPVersion property.
// The IP version to allow. The format of `local.address`, `remote.address`,
// `local.cidr_block` or `remote.cidr_block` must match this property, if they are used.
//
// If `remote` references a security group, then this rule only applies to IP addresses in that group matching this IP
// version.
const (
	SecurityGroupRulePrototypeIPVersionIpv4Const = "ipv4"
)

// Constants associated with the SecurityGroupRulePrototype.Protocol property.
// The network protocol.
const (
	SecurityGroupRulePrototypeProtocolAllConst  = "all"
	SecurityGroupRulePrototypeProtocolIcmpConst = "icmp"
	SecurityGroupRulePrototypeProtocolTCPConst  = "tcp"
	SecurityGroupRulePrototypeProtocolUDPConst  = "udp"
)

func (*SecurityGroupRulePrototype) isaSecurityGroupRulePrototype() bool {
	return true
}

type SecurityGroupRulePrototypeIntf interface {
	isaSecurityGroupRulePrototype() bool
}

// UnmarshalSecurityGroupRulePrototype unmarshals an instance of SecurityGroupRulePrototype from the specified map of raw messages.
func UnmarshalSecurityGroupRulePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRulePrototype)
	err = core.UnmarshalPrimitive(m, "direction", &obj.Direction)
	if err != nil {
		err = core.SDKErrorf(err, "", "direction-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "local", &obj.Local, UnmarshalSecurityGroupRuleLocalPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "local-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol", &obj.Protocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalSecurityGroupRuleRemotePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_max", &obj.PortMax)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "port_min", &obj.PortMin)
	if err != nil {
		err = core.SDKErrorf(err, "", "port_min-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupRuleRemote : The remote IP addresses or security groups from which this rule allows traffic (or to which, for outbound rules). A
// CIDR block of `0.0.0.0/0` allows traffic from any source
// (or to any destination, for outbound rules).
// Models which "extend" this model:
// - SecurityGroupRuleRemoteIP
// - SecurityGroupRuleRemoteCIDR
// - SecurityGroupRuleRemoteSecurityGroupReference
type SecurityGroupRuleRemote struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The CIDR block.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 address
	// blocks in the future.
	CIDRBlock *string `json:"cidr_block,omitempty"`

	// The CRN for this security group.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this security group.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this security group.
	ID *string `json:"id,omitempty"`

	// The name for this security group. The name is unique across all security groups for the VPC.
	Name *string `json:"name,omitempty"`
}

func (*SecurityGroupRuleRemote) isaSecurityGroupRuleRemote() bool {
	return true
}

type SecurityGroupRuleRemoteIntf interface {
	isaSecurityGroupRuleRemote() bool
}

// UnmarshalSecurityGroupRuleRemote unmarshals an instance of SecurityGroupRuleRemote from the specified map of raw messages.
func UnmarshalSecurityGroupRuleRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleRemote)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr_block", &obj.CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr_block-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupRuleRemotePatch : The remote IP addresses or security groups from which this rule will allow traffic (or to which, for outbound rules).
// Can be specified as an IP address, a CIDR block, or a security group. A CIDR block of `0.0.0.0/0` will allow traffic
// from any source (or to any destination, for outbound rules).
// Models which "extend" this model:
// - SecurityGroupRuleRemotePatchIP
// - SecurityGroupRuleRemotePatchCIDR
// - SecurityGroupRuleRemotePatchSecurityGroupIdentity
type SecurityGroupRuleRemotePatch struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The CIDR block.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 address
	// blocks in the future.
	CIDRBlock *string `json:"cidr_block,omitempty"`

	// The unique identifier for this security group.
	ID *string `json:"id,omitempty"`

	// The CRN for this security group.
	CRN *string `json:"crn,omitempty"`

	// The URL for this security group.
	Href *string `json:"href,omitempty"`
}

func (*SecurityGroupRuleRemotePatch) isaSecurityGroupRuleRemotePatch() bool {
	return true
}

type SecurityGroupRuleRemotePatchIntf interface {
	isaSecurityGroupRuleRemotePatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalSecurityGroupRuleRemotePatch unmarshals an instance of SecurityGroupRuleRemotePatch from the specified map of raw messages.
func UnmarshalSecurityGroupRuleRemotePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleRemotePatch)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr_block", &obj.CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr_block-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the SecurityGroupRuleRemotePatch
func (securityGroupRuleRemotePatch *SecurityGroupRuleRemotePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(securityGroupRuleRemotePatch.Address) {
		_patch["address"] = securityGroupRuleRemotePatch.Address
	}
	if !core.IsNil(securityGroupRuleRemotePatch.CIDRBlock) {
		_patch["cidr_block"] = securityGroupRuleRemotePatch.CIDRBlock
	}
	if !core.IsNil(securityGroupRuleRemotePatch.ID) {
		_patch["id"] = securityGroupRuleRemotePatch.ID
	}
	if !core.IsNil(securityGroupRuleRemotePatch.CRN) {
		_patch["crn"] = securityGroupRuleRemotePatch.CRN
	}
	if !core.IsNil(securityGroupRuleRemotePatch.Href) {
		_patch["href"] = securityGroupRuleRemotePatch.Href
	}

	return
}

// SecurityGroupRuleRemotePrototype : The remote IP addresses or security groups from which this rule will allow traffic (or to which, for outbound rules).
// Can be specified as an IP address, a CIDR block, or a security group within the VPC.
//
// If unspecified, a CIDR block of `0.0.0.0/0` will be used to allow traffic from any source
// (or to any destination, for outbound rules).
// Models which "extend" this model:
// - SecurityGroupRuleRemotePrototypeIP
// - SecurityGroupRuleRemotePrototypeCIDR
// - SecurityGroupRuleRemotePrototypeSecurityGroupIdentity
type SecurityGroupRuleRemotePrototype struct {
	// The IP address.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 addresses in
	// the future.
	Address *string `json:"address,omitempty"`

	// The CIDR block.
	//
	// This property may [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) to support IPv6 address
	// blocks in the future.
	CIDRBlock *string `json:"cidr_block,omitempty"`

	// The unique identifier for this security group.
	ID *string `json:"id,omitempty"`

	// The CRN for this security group.
	CRN *string `json:"crn,omitempty"`

	// The URL for this security group.
	Href *string `json:"href,omitempty"`
}

func (*SecurityGroupRuleRemotePrototype) isaSecurityGroupRuleRemotePrototype() bool {
	return true
}

type SecurityGroupRuleRemotePrototypeIntf interface {
	isaSecurityGroupRuleRemotePrototype() bool
}

// UnmarshalSecurityGroupRuleRemotePrototype unmarshals an instance of SecurityGroupRuleRemotePrototype from the specified map of raw messages.
func UnmarshalSecurityGroupRuleRemotePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupRuleRemotePrototype)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "cidr_block", &obj.CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidr_block-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SecurityGroupTargetCollection : SecurityGroupTargetCollection struct
type SecurityGroupTargetCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of targets for the security group.
	Targets []SecurityGroupTargetReferenceIntf `json:"targets" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalSecurityGroupTargetCollection unmarshals an instance of SecurityGroupTargetCollection from the specified map of raw messages.
func UnmarshalSecurityGroupTargetCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupTargetCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "targets", &obj.Targets, UnmarshalSecurityGroupTargetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *SecurityGroupTargetCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// SecurityGroupTargetReference : A target of this security group.
//
// The resources supported by this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
// Models which "extend" this model:
// - SecurityGroupTargetReferenceBareMetalServerNetworkInterfaceReferenceTargetContext
// - SecurityGroupTargetReferenceEndpointGatewayReference
// - SecurityGroupTargetReferenceLoadBalancerReference
// - SecurityGroupTargetReferenceNetworkInterfaceReferenceTargetContext
// - SecurityGroupTargetReferenceVirtualNetworkInterfaceReference
// - SecurityGroupTargetReferenceVPNServerReference
type SecurityGroupTargetReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this bare metal server network interface.
	//
	// If this bare metal server has network attachments, this network interface is a
	// [read-only representation](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#vni-old-api-clients) of its
	// corresponding network attachment and its attached virtual network interface, and the identifier is that of the
	// corresponding network attachment.
	ID *string `json:"id,omitempty"`

	// The name for this bare metal server network interface.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`

	// The CRN for this endpoint gateway.
	CRN *string `json:"crn,omitempty"`

	// The primary IP for this virtual network interface.
	PrimaryIP *ReservedIPReference `json:"primary_ip,omitempty"`

	// The associated subnet.
	Subnet *SubnetReference `json:"subnet,omitempty"`
}

// Constants associated with the SecurityGroupTargetReference.ResourceType property.
// The resource type.
const (
	SecurityGroupTargetReferenceResourceTypeNetworkInterfaceConst = "network_interface"
)

func (*SecurityGroupTargetReference) isaSecurityGroupTargetReference() bool {
	return true
}

type SecurityGroupTargetReferenceIntf interface {
	isaSecurityGroupTargetReference() bool
}

// UnmarshalSecurityGroupTargetReference unmarshals an instance of SecurityGroupTargetReference from the specified map of raw messages.
func UnmarshalSecurityGroupTargetReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SecurityGroupTargetReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SetSubnetPublicGatewayOptions : The SetSubnetPublicGateway options.
type SetSubnetPublicGatewayOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The public gateway identity.
	PublicGatewayIdentity PublicGatewayIdentityIntf `json:"PublicGatewayIdentity" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewSetSubnetPublicGatewayOptions : Instantiate SetSubnetPublicGatewayOptions
func (*VpcV1) NewSetSubnetPublicGatewayOptions(id string, publicGatewayIdentity PublicGatewayIdentityIntf) *SetSubnetPublicGatewayOptions {
	return &SetSubnetPublicGatewayOptions{
		ID:                    core.StringPtr(id),
		PublicGatewayIdentity: publicGatewayIdentity,
	}
}

// SetID : Allow user to set ID
func (_options *SetSubnetPublicGatewayOptions) SetID(id string) *SetSubnetPublicGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetPublicGatewayIdentity : Allow user to set PublicGatewayIdentity
func (_options *SetSubnetPublicGatewayOptions) SetPublicGatewayIdentity(publicGatewayIdentity PublicGatewayIdentityIntf) *SetSubnetPublicGatewayOptions {
	_options.PublicGatewayIdentity = publicGatewayIdentity
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *SetSubnetPublicGatewayOptions) SetHeaders(param map[string]string) *SetSubnetPublicGatewayOptions {
	options.Headers = param
	return options
}

// Share : Share struct
type Share struct {
	// The access control mode for the share:
	//
	// - `security_group`: The security groups on the virtual network interface for a mount
	//   target control access to the mount target.
	// - `vpc`: All clients in the VPC for a mount target have access to the mount target.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AccessControlMode *string `json:"access_control_mode" validate:"required"`

	// The accessor binding role of this file share:
	// - `none`: This file share is not participating in access with another file share
	// - `origin`: This file share is the origin for one or more file shares
	//   (which may be in other accounts)
	// - `accessor`: This file share is providing access to another file share
	//   (which may be in another account).
	AccessorBindingRole *string `json:"accessor_binding_role" validate:"required"`

	// The accessor bindings for this file share. Each accessor binding identifies a resource (possibly in another account)
	// with access to this file share's data and its snapshots.
	AccessorBindings []ShareAccessorBindingReference `json:"accessor_bindings" validate:"required"`

	// The transit encryption modes allowed for this share:
	// - `none`: Not encrypted in transit.
	// - `user_managed`: Encrypted in transit using an instance identity certificate.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AllowedTransitEncryptionModes []string `json:"allowed_transit_encryption_modes" validate:"required"`

	// The date and time that the file share is created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this file share.
	CRN *string `json:"crn" validate:"required"`

	// The type of encryption used for this file share.
	Encryption *string `json:"encryption" validate:"required"`

	// The key used to encrypt this file share.
	//
	// This property will be present if `encryption` is `user_managed`.
	EncryptionKey *EncryptionKeyReference `json:"encryption_key,omitempty"`

	// The URL for this file share.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this file share.
	ID *string `json:"id" validate:"required"`

	// The owner assigned to the file share at creation.
	InitialOwner *ShareInitialOwner `json:"initial_owner" validate:"required"`

	// The maximum input/output operations per second (IOPS) for the file share. In addition, each client accessing the
	// share will be restricted to 48,000 IOPS.
	//
	// The maximum IOPS for a share may increase in the future.
	Iops *int64 `json:"iops" validate:"required"`

	// The latest job associated with this file share.
	//
	// This property will be absent if no jobs have been created for this file share.
	LatestJob *ShareJob `json:"latest_job,omitempty"`

	// Information about the latest synchronization for this file share.
	//
	// This property will be present when the `replication_role` is `replica` and at least
	// one replication sync has been completed.
	LatestSync *ShareLatestSync `json:"latest_sync,omitempty"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []ShareLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the file share.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The mount targets for the file share.
	MountTargets []ShareMountTargetReference `json:"mount_targets" validate:"required"`

	// The name for this share. The name is unique across all shares in the region.
	Name *string `json:"name" validate:"required"`

	// The origin share this accessor share is referring to.
	//
	// This property will be present when the `accessor_binding_role` is `accessor`.
	OriginShare *ShareReference `json:"origin_share,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-file-storage-profiles) for
	// this file share.
	Profile *ShareProfileReference `json:"profile" validate:"required"`

	// The replica file share for this source file share.
	//
	// This property will be present when the `replication_role` is `source`.
	ReplicaShare *ShareReference `json:"replica_share,omitempty"`

	// The cron specification for the file share replication schedule.
	//
	// This property will be present when the `replication_role` is `replica`.
	ReplicationCronSpec *string `json:"replication_cron_spec,omitempty"`

	// The replication role of the file share:
	// - `none`: This share is not participating in replication.
	// - `replica`: This share is a replication target.
	// - `source`: This share is a replication source.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ReplicationRole *string `json:"replication_role" validate:"required"`

	// The replication status of the file share:
	// - `active`: This share is actively participating in replication, and the replica's data is up-to-date with the
	// replication schedule.
	// - `degraded`: This is share is participating in replication, but the replica's data has fallen behind the
	// replication schedule.
	// - `failover_pending`: This share is performing a replication failover.
	// - `initializing`: This share is initializing replication.
	// - `none`: This share is not participating in replication.
	// - `split_pending`: This share is performing a replication split.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ReplicationStatus *string `json:"replication_status" validate:"required"`

	// The reasons for the current replication status (if any).
	ReplicationStatusReasons []ShareReplicationStatusReason `json:"replication_status_reasons" validate:"required"`

	// The resource group for this file share.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The size of the file share (in gigabytes), excluding share snapshots.
	Size *int64 `json:"size" validate:"required"`

	// The total number of snapshots for this share.
	SnapshotCount *int64 `json:"snapshot_count" validate:"required"`

	// The total size (in gigabytes) of snapshots used for this file share.
	SnapshotSize *int64 `json:"snapshot_size" validate:"required"`

	// The source file share for this replica file share.
	//
	// This property will be present when the `replication_role` is `replica`.
	SourceShare *ShareReference `json:"source_share,omitempty"`

	// The snapshot this file share was cloned from.
	//
	// This property will be present when the share was created from a snapshot.
	//
	// The resources supported by this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the
	// future.
	SourceSnapshot ShareSourceSnapshotIntf `json:"source_snapshot,omitempty"`

	// The tags for this resource.
	UserTags []string `json:"user_tags" validate:"required"`

	// The zone this file share resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the Share.AccessControlMode property.
// The access control mode for the share:
//
//   - `security_group`: The security groups on the virtual network interface for a mount
//     target control access to the mount target.
//   - `vpc`: All clients in the VPC for a mount target have access to the mount target.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareAccessControlModeSecurityGroupConst = "security_group"
	ShareAccessControlModeVPCConst           = "vpc"
)

// Constants associated with the Share.AccessorBindingRole property.
// The accessor binding role of this file share:
//   - `none`: This file share is not participating in access with another file share
//   - `origin`: This file share is the origin for one or more file shares
//     (which may be in other accounts)
//   - `accessor`: This file share is providing access to another file share
//     (which may be in another account).
const (
	ShareAccessorBindingRoleAccessorConst = "accessor"
	ShareAccessorBindingRoleNoneConst     = "none"
	ShareAccessorBindingRoleOriginConst   = "origin"
)

// Constants associated with the Share.AllowedTransitEncryptionModes property.
const (
	ShareAllowedTransitEncryptionModesNoneConst        = "none"
	ShareAllowedTransitEncryptionModesUserManagedConst = "user_managed"
)

// Constants associated with the Share.Encryption property.
// The type of encryption used for this file share.
const (
	ShareEncryptionProviderManagedConst = "provider_managed"
	ShareEncryptionUserManagedConst     = "user_managed"
)

// Constants associated with the Share.LifecycleState property.
// The lifecycle state of the file share.
const (
	ShareLifecycleStateDeletingConst  = "deleting"
	ShareLifecycleStateFailedConst    = "failed"
	ShareLifecycleStatePendingConst   = "pending"
	ShareLifecycleStateStableConst    = "stable"
	ShareLifecycleStateSuspendedConst = "suspended"
	ShareLifecycleStateUpdatingConst  = "updating"
	ShareLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the Share.ReplicationRole property.
// The replication role of the file share:
// - `none`: This share is not participating in replication.
// - `replica`: This share is a replication target.
// - `source`: This share is a replication source.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareReplicationRoleNoneConst    = "none"
	ShareReplicationRoleReplicaConst = "replica"
	ShareReplicationRoleSourceConst  = "source"
)

// Constants associated with the Share.ReplicationStatus property.
// The replication status of the file share:
// - `active`: This share is actively participating in replication, and the replica's data is up-to-date with the
// replication schedule.
// - `degraded`: This is share is participating in replication, but the replica's data has fallen behind the replication
// schedule.
// - `failover_pending`: This share is performing a replication failover.
// - `initializing`: This share is initializing replication.
// - `none`: This share is not participating in replication.
// - `split_pending`: This share is performing a replication split.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareReplicationStatusActiveConst          = "active"
	ShareReplicationStatusDegradedConst        = "degraded"
	ShareReplicationStatusFailoverPendingConst = "failover_pending"
	ShareReplicationStatusInitializingConst    = "initializing"
	ShareReplicationStatusNoneConst            = "none"
	ShareReplicationStatusSplitPendingConst    = "split_pending"
)

// Constants associated with the Share.ResourceType property.
// The resource type.
const (
	ShareResourceTypeShareConst = "share"
)

// UnmarshalShare unmarshals an instance of Share from the specified map of raw messages.
func UnmarshalShare(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Share)
	err = core.UnmarshalPrimitive(m, "access_control_mode", &obj.AccessControlMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_control_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "accessor_binding_role", &obj.AccessorBindingRole)
	if err != nil {
		err = core.SDKErrorf(err, "", "accessor_binding_role-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "accessor_bindings", &obj.AccessorBindings, UnmarshalShareAccessorBindingReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "accessor_bindings-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_transit_encryption_modes", &obj.AllowedTransitEncryptionModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_transit_encryption_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption", &obj.Encryption)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "initial_owner", &obj.InitialOwner, UnmarshalShareInitialOwner)
	if err != nil {
		err = core.SDKErrorf(err, "", "initial_owner-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "iops", &obj.Iops)
	if err != nil {
		err = core.SDKErrorf(err, "", "iops-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "latest_job", &obj.LatestJob, UnmarshalShareJob)
	if err != nil {
		err = core.SDKErrorf(err, "", "latest_job-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "latest_sync", &obj.LatestSync, UnmarshalShareLatestSync)
	if err != nil {
		err = core.SDKErrorf(err, "", "latest_sync-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalShareLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "mount_targets", &obj.MountTargets, UnmarshalShareMountTargetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "mount_targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "origin_share", &obj.OriginShare, UnmarshalShareReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "origin_share-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalShareProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "replica_share", &obj.ReplicaShare, UnmarshalShareReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "replica_share-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "replication_cron_spec", &obj.ReplicationCronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "replication_role", &obj.ReplicationRole)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_role-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "replication_status", &obj.ReplicationStatus)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "replication_status_reasons", &obj.ReplicationStatusReasons, UnmarshalShareReplicationStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "snapshot_count", &obj.SnapshotCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshot_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "snapshot_size", &obj.SnapshotSize)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshot_size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_share", &obj.SourceShare, UnmarshalShareReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_share-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_snapshot", &obj.SourceSnapshot, UnmarshalShareSourceSnapshot)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_snapshot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareAccessorBinding : ShareAccessorBinding struct
type ShareAccessorBinding struct {
	// The accessor for this share accessor binding.
	Accessor ShareAccessorBindingAccessorIntf `json:"accessor" validate:"required"`

	// The date and time that the share accessor binding was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this share accessor binding.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this share accessor binding.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the file share accessor binding.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ShareAccessorBinding.LifecycleState property.
// The lifecycle state of the file share accessor binding.
const (
	ShareAccessorBindingLifecycleStateDeletingConst  = "deleting"
	ShareAccessorBindingLifecycleStateFailedConst    = "failed"
	ShareAccessorBindingLifecycleStatePendingConst   = "pending"
	ShareAccessorBindingLifecycleStateStableConst    = "stable"
	ShareAccessorBindingLifecycleStateSuspendedConst = "suspended"
	ShareAccessorBindingLifecycleStateUpdatingConst  = "updating"
	ShareAccessorBindingLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ShareAccessorBinding.ResourceType property.
// The resource type.
const (
	ShareAccessorBindingResourceTypeShareAccessorBindingConst = "share_accessor_binding"
)

// UnmarshalShareAccessorBinding unmarshals an instance of ShareAccessorBinding from the specified map of raw messages.
func UnmarshalShareAccessorBinding(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareAccessorBinding)
	err = core.UnmarshalModel(m, "accessor", &obj.Accessor, UnmarshalShareAccessorBindingAccessor)
	if err != nil {
		err = core.SDKErrorf(err, "", "accessor-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareAccessorBindingAccessor : The accessor for this share accessor binding.
// Models which "extend" this model:
// - ShareAccessorBindingAccessorShareReference
// - ShareAccessorBindingAccessorWatsonxMachineLearningReference
type ShareAccessorBindingAccessor struct {
	// The CRN for this file share.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this file share.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this file share.
	ID *string `json:"id,omitempty"`

	// The name for this share. The name is unique across all shares in the region.
	Name *string `json:"name,omitempty"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *ShareRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ShareAccessorBindingAccessor.ResourceType property.
// The resource type.
const (
	ShareAccessorBindingAccessorResourceTypeShareConst = "share"
)

func (*ShareAccessorBindingAccessor) isaShareAccessorBindingAccessor() bool {
	return true
}

type ShareAccessorBindingAccessorIntf interface {
	isaShareAccessorBindingAccessor() bool
}

// UnmarshalShareAccessorBindingAccessor unmarshals an instance of ShareAccessorBindingAccessor from the specified map of raw messages.
func UnmarshalShareAccessorBindingAccessor(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareAccessorBindingAccessor)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalShareRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareAccessorBindingCollection : ShareAccessorBindingCollection struct
type ShareAccessorBindingCollection struct {
	// A page of accessor bindings for the share.
	AccessorBindings []ShareAccessorBinding `json:"accessor_bindings" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalShareAccessorBindingCollection unmarshals an instance of ShareAccessorBindingCollection from the specified map of raw messages.
func UnmarshalShareAccessorBindingCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareAccessorBindingCollection)
	err = core.UnmarshalModel(m, "accessor_bindings", &obj.AccessorBindings, UnmarshalShareAccessorBinding)
	if err != nil {
		err = core.SDKErrorf(err, "", "accessor_bindings-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ShareAccessorBindingCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ShareAccessorBindingReference : ShareAccessorBindingReference struct
type ShareAccessorBindingReference struct {
	// The URL for this share accessor binding.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this share accessor binding.
	ID *string `json:"id" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ShareAccessorBindingReference.ResourceType property.
// The resource type.
const (
	ShareAccessorBindingReferenceResourceTypeShareAccessorBindingConst = "share_accessor_binding"
)

// UnmarshalShareAccessorBindingReference unmarshals an instance of ShareAccessorBindingReference from the specified map of raw messages.
func UnmarshalShareAccessorBindingReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareAccessorBindingReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareCollection : ShareCollection struct
type ShareCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of file shares.
	Shares []Share `json:"shares" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalShareCollection unmarshals an instance of ShareCollection from the specified map of raw messages.
func UnmarshalShareCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "shares", &obj.Shares, UnmarshalShare)
	if err != nil {
		err = core.SDKErrorf(err, "", "shares-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ShareCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ShareIdentity : Identifies a file share by a unique property.
// Models which "extend" this model:
// - ShareIdentityByID
// - ShareIdentityByCRN
// - ShareIdentityByHref
type ShareIdentity struct {
	// The unique identifier for this file share.
	ID *string `json:"id,omitempty"`

	// The CRN for this file share.
	CRN *string `json:"crn,omitempty"`

	// The URL for this file share.
	Href *string `json:"href,omitempty"`
}

func (*ShareIdentity) isaShareIdentity() bool {
	return true
}

type ShareIdentityIntf interface {
	isaShareIdentity() bool
}

// UnmarshalShareIdentity unmarshals an instance of ShareIdentity from the specified map of raw messages.
func UnmarshalShareIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareInitialOwner : ShareInitialOwner struct
type ShareInitialOwner struct {
	// The initial group identifier for the file share.
	Gid *int64 `json:"gid,omitempty"`

	// The initial user identifier for the file share.
	Uid *int64 `json:"uid,omitempty"`
}

// UnmarshalShareInitialOwner unmarshals an instance of ShareInitialOwner from the specified map of raw messages.
func UnmarshalShareInitialOwner(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareInitialOwner)
	err = core.UnmarshalPrimitive(m, "gid", &obj.Gid)
	if err != nil {
		err = core.SDKErrorf(err, "", "gid-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "uid", &obj.Uid)
	if err != nil {
		err = core.SDKErrorf(err, "", "uid-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareJob : ShareJob struct
type ShareJob struct {
	// The status of the file share job:
	// - `cancelled`: This job has been cancelled.
	// - `failed`: This job has failed.
	// - `queued`: This job is queued.
	// - `running`: This job is running.
	// - `succeeded`: This job completed successfully.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the file share job status (if any).
	StatusReasons []ShareJobStatusReason `json:"status_reasons" validate:"required"`

	// The type of the file share job:
	// - `replication_failover`: This is a share replication failover job.
	// - `replication_init`: This is a share replication is initialization job.
	// - `replication_split`: This is a share replication split job.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`
}

// Constants associated with the ShareJob.Status property.
// The status of the file share job:
// - `cancelled`: This job has been cancelled.
// - `failed`: This job has failed.
// - `queued`: This job is queued.
// - `running`: This job is running.
// - `succeeded`: This job completed successfully.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareJobStatusCancelledConst = "cancelled"
	ShareJobStatusFailedConst    = "failed"
	ShareJobStatusQueuedConst    = "queued"
	ShareJobStatusRunningConst   = "running"
	ShareJobStatusSucceededConst = "succeeded"
)

// Constants associated with the ShareJob.Type property.
// The type of the file share job:
// - `replication_failover`: This is a share replication failover job.
// - `replication_init`: This is a share replication is initialization job.
// - `replication_split`: This is a share replication split job.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareJobTypeReplicationFailoverConst = "replication_failover"
	ShareJobTypeReplicationInitConst     = "replication_init"
	ShareJobTypeReplicationSplitConst    = "replication_split"
)

// UnmarshalShareJob unmarshals an instance of ShareJob from the specified map of raw messages.
func UnmarshalShareJob(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareJob)
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalShareJobStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareJobStatusReason : ShareJobStatusReason struct
type ShareJobStatusReason struct {
	// A snake case string succinctly identifying the status reason.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ShareJobStatusReason.Code property.
// A snake case string succinctly identifying the status reason.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareJobStatusReasonCodeCannotInitializeReplicationConst = "cannot_initialize_replication"
	ShareJobStatusReasonCodeCannotReachReplicaShareConst     = "cannot_reach_replica_share"
	ShareJobStatusReasonCodeCannotReachSourceShareConst      = "cannot_reach_source_share"
)

// UnmarshalShareJobStatusReason unmarshals an instance of ShareJobStatusReason from the specified map of raw messages.
func UnmarshalShareJobStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareJobStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareLatestSync : Information about the latest synchronization for this file share.
//
// This property will be present when the `replication_role` is `replica` and at least one replication sync has been
// completed.
type ShareLatestSync struct {
	// The completed date and time of last synchronization between the replica share and its source.
	CompletedAt *strfmt.DateTime `json:"completed_at" validate:"required"`

	// The data transferred (in bytes) in the last synchronization between the replica and its source.
	DataTransferred *int64 `json:"data_transferred" validate:"required"`

	// The start date and time of last synchronization between the replica share and its source.
	StartedAt *strfmt.DateTime `json:"started_at" validate:"required"`
}

// UnmarshalShareLatestSync unmarshals an instance of ShareLatestSync from the specified map of raw messages.
func UnmarshalShareLatestSync(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareLatestSync)
	err = core.UnmarshalPrimitive(m, "completed_at", &obj.CompletedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "completed_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "data_transferred", &obj.DataTransferred)
	if err != nil {
		err = core.SDKErrorf(err, "", "data_transferred-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "started_at", &obj.StartedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "started_at-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareLifecycleReason : ShareLifecycleReason struct
type ShareLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `cloning_failed`: The file share could not be cloned from the snapshot
	//   (contact IBM support)
	// - `cloning_in_progress`: The file share is currently being cloned from the snapshot
	// - `internal_error`: internal error (contact IBM support)
	// - `origin_share_access_revoked`: The resource has been revoked by the share owner
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ShareLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `cloning_failed`: The file share could not be cloned from the snapshot
//     (contact IBM support)
//   - `cloning_in_progress`: The file share is currently being cloned from the snapshot
//   - `internal_error`: internal error (contact IBM support)
//   - `origin_share_access_revoked`: The resource has been revoked by the share owner
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareLifecycleReasonCodeCloningFailedConst               = "cloning_failed"
	ShareLifecycleReasonCodeCloningInProgressConst           = "cloning_in_progress"
	ShareLifecycleReasonCodeInternalErrorConst               = "internal_error"
	ShareLifecycleReasonCodeOriginShareAccessRevokedConst    = "origin_share_access_revoked"
	ShareLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalShareLifecycleReason unmarshals an instance of ShareLifecycleReason from the specified map of raw messages.
func UnmarshalShareLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareMountTarget : ShareMountTarget struct
type ShareMountTarget struct {
	// The access control mode for the share:
	//
	// - `security_group`: The security groups on the virtual network interface for a mount
	//   target control access to the mount target.
	// - `vpc`: All clients in the VPC for a mount target have access to the mount target.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AccessControlMode *string `json:"access_control_mode" validate:"required"`

	// The date and time that the share mount target was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The URL for this share mount target.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this share mount target.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the mount target.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The mount path for the share.  The server component of the mount path may be either an IP address or a fully
	// qualified domain name.
	//
	// This property will be absent if the `lifecycle_state` of the mount target is
	// 'pending', `failed`, or `deleting`.
	//
	// If the share's `access_control_mode` is:
	//
	// - `security_group`: The IP address used in the mount path is the `primary_ip`
	//   address of the virtual network interface for this share mount target.
	// - `vpc`: The fully-qualified domain name used in the mount path is an address that
	//   resolves to the share mount target.
	MountPath *string `json:"mount_path,omitempty"`

	// The name for this share mount target. The name is unique across all mount targets for the file share.
	Name *string `json:"name" validate:"required"`

	// The primary IP address of the virtual network interface for the share mount target.
	//
	// Absent if `access_control_mode` is `vpc`.
	PrimaryIP *ReservedIPReference `json:"primary_ip,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The subnet of the virtual network interface for the share mount target.
	//
	// Absent if `access_control_mode` is `vpc`.
	Subnet *SubnetReference `json:"subnet,omitempty"`

	// The transit encryption mode for this share mount target:
	// - `none`: Not encrypted in transit
	// - `user_managed`: Encrypted in transit using an instance identity certificate
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	TransitEncryption *string `json:"transit_encryption" validate:"required"`

	// The virtual network interface for this file share mount target.
	//
	// This property will be present when the `access_control_mode` is `security_group`.
	VirtualNetworkInterface *VirtualNetworkInterfaceReferenceAttachmentContext `json:"virtual_network_interface,omitempty"`

	// If `access_control_mode` is:
	//
	// - `security_group`: The VPC for the virtual network interface for this share mount
	//   target
	// - `vpc`: The VPC in which clients can mount the file share using this share
	//   mount target.
	VPC *VPCReference `json:"vpc" validate:"required"`
}

// Constants associated with the ShareMountTarget.AccessControlMode property.
// The access control mode for the share:
//
//   - `security_group`: The security groups on the virtual network interface for a mount
//     target control access to the mount target.
//   - `vpc`: All clients in the VPC for a mount target have access to the mount target.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareMountTargetAccessControlModeSecurityGroupConst = "security_group"
	ShareMountTargetAccessControlModeVPCConst           = "vpc"
)

// Constants associated with the ShareMountTarget.LifecycleState property.
// The lifecycle state of the mount target.
const (
	ShareMountTargetLifecycleStateDeletingConst  = "deleting"
	ShareMountTargetLifecycleStateFailedConst    = "failed"
	ShareMountTargetLifecycleStatePendingConst   = "pending"
	ShareMountTargetLifecycleStateStableConst    = "stable"
	ShareMountTargetLifecycleStateSuspendedConst = "suspended"
	ShareMountTargetLifecycleStateUpdatingConst  = "updating"
	ShareMountTargetLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ShareMountTarget.ResourceType property.
// The resource type.
const (
	ShareMountTargetResourceTypeShareMountTargetConst = "share_mount_target"
)

// Constants associated with the ShareMountTarget.TransitEncryption property.
// The transit encryption mode for this share mount target:
// - `none`: Not encrypted in transit
// - `user_managed`: Encrypted in transit using an instance identity certificate
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareMountTargetTransitEncryptionNoneConst        = "none"
	ShareMountTargetTransitEncryptionUserManagedConst = "user_managed"
)

// UnmarshalShareMountTarget unmarshals an instance of ShareMountTarget from the specified map of raw messages.
func UnmarshalShareMountTarget(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareMountTarget)
	err = core.UnmarshalPrimitive(m, "access_control_mode", &obj.AccessControlMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_control_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "mount_path", &obj.MountPath)
	if err != nil {
		err = core.SDKErrorf(err, "", "mount_path-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "transit_encryption", &obj.TransitEncryption)
	if err != nil {
		err = core.SDKErrorf(err, "", "transit_encryption-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalVirtualNetworkInterfaceReferenceAttachmentContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareMountTargetCollection : ShareMountTargetCollection struct
type ShareMountTargetCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A page of mount targets for the share.
	MountTargets []ShareMountTarget `json:"mount_targets" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalShareMountTargetCollection unmarshals an instance of ShareMountTargetCollection from the specified map of raw messages.
func UnmarshalShareMountTargetCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareMountTargetCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "mount_targets", &obj.MountTargets, UnmarshalShareMountTarget)
	if err != nil {
		err = core.SDKErrorf(err, "", "mount_targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ShareMountTargetCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ShareMountTargetPatch : ShareMountTargetPatch struct
type ShareMountTargetPatch struct {
	// The name for this share mount target. The name must not be used by another mount target for the file share.
	Name *string `json:"name,omitempty"`
}

// UnmarshalShareMountTargetPatch unmarshals an instance of ShareMountTargetPatch from the specified map of raw messages.
func UnmarshalShareMountTargetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareMountTargetPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ShareMountTargetPatch
func (shareMountTargetPatch *ShareMountTargetPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(shareMountTargetPatch.Name) {
		_patch["name"] = shareMountTargetPatch.Name
	}

	return
}

// ShareMountTargetPrototype : ShareMountTargetPrototype struct
// Models which "extend" this model:
// - ShareMountTargetPrototypeShareMountTargetByAccessControlModeSecurityGroup
// - ShareMountTargetPrototypeShareMountTargetByAccessControlModeVPC
type ShareMountTargetPrototype struct {
	// The name for this share mount target. The name must not be used by another mount target for the file share. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The transit encryption mode to use for this share mount target:
	// - `none`: Not encrypted in transit.
	// - `user_managed`: Encrypted in transit using an instance identity certificate.  The
	//                   `access_control_mode` for the share must be `security_group`.
	//
	// The specified value must be listed in the share's
	// `allowed_transit_encryption_modes`.
	TransitEncryption *string `json:"transit_encryption,omitempty"`

	VirtualNetworkInterface ShareMountTargetVirtualNetworkInterfacePrototypeIntf `json:"virtual_network_interface,omitempty"`

	// Identifies a VPC by a unique property.
	VPC VPCIdentityIntf `json:"vpc,omitempty"`
}

// Constants associated with the ShareMountTargetPrototype.TransitEncryption property.
// The transit encryption mode to use for this share mount target:
//   - `none`: Not encrypted in transit.
//   - `user_managed`: Encrypted in transit using an instance identity certificate.  The
//     `access_control_mode` for the share must be `security_group`.
//
// The specified value must be listed in the share's
// `allowed_transit_encryption_modes`.
const (
	ShareMountTargetPrototypeTransitEncryptionNoneConst        = "none"
	ShareMountTargetPrototypeTransitEncryptionUserManagedConst = "user_managed"
)

func (*ShareMountTargetPrototype) isaShareMountTargetPrototype() bool {
	return true
}

type ShareMountTargetPrototypeIntf interface {
	isaShareMountTargetPrototype() bool
}

// UnmarshalShareMountTargetPrototype unmarshals an instance of ShareMountTargetPrototype from the specified map of raw messages.
func UnmarshalShareMountTargetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareMountTargetPrototype)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "transit_encryption", &obj.TransitEncryption)
	if err != nil {
		err = core.SDKErrorf(err, "", "transit_encryption-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "virtual_network_interface", &obj.VirtualNetworkInterface, UnmarshalShareMountTargetVirtualNetworkInterfacePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "virtual_network_interface-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareMountTargetReference : ShareMountTargetReference struct
type ShareMountTargetReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this share mount target.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this share mount target.
	ID *string `json:"id" validate:"required"`

	// The name for this share mount target. The name is unique across all mount targets for the file share.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ShareMountTargetReference.ResourceType property.
// The resource type.
const (
	ShareMountTargetReferenceResourceTypeShareMountTargetConst = "share_mount_target"
)

// UnmarshalShareMountTargetReference unmarshals an instance of ShareMountTargetReference from the specified map of raw messages.
func UnmarshalShareMountTargetReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareMountTargetReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareMountTargetVirtualNetworkInterfacePrototype : ShareMountTargetVirtualNetworkInterfacePrototype struct
// Models which "extend" this model:
// - ShareMountTargetVirtualNetworkInterfacePrototypeVirtualNetworkInterfacePrototypeShareMountTargetContext
// - ShareMountTargetVirtualNetworkInterfacePrototypeVirtualNetworkInterfaceIdentity
type ShareMountTargetVirtualNetworkInterfacePrototype struct {
	// Indicates whether source IP spoofing is allowed on this interface. If `false`, source IP spoofing is prevented on
	// this interface. If `true`, source IP spoofing is allowed on this interface.
	AllowIPSpoofing *bool `json:"allow_ip_spoofing,omitempty"`

	// Indicates whether this virtual network interface will be automatically deleted when
	// `target` is deleted.
	AutoDelete *bool `json:"auto_delete,omitempty"`

	// If `true`:
	// - The VPC infrastructure performs any needed NAT operations.
	// - `floating_ips` must not have more than one floating IP.
	//
	// If `false`:
	// - Packets are passed unchanged to/from the virtual network interface,
	//   allowing the workload to perform any needed NAT operations.
	// - `allow_ip_spoofing` must be `false`.
	// - Can only be attached to a `target` with a `resource_type` of
	//   `bare_metal_server_network_attachment`.
	EnableInfrastructureNat *bool `json:"enable_infrastructure_nat,omitempty"`

	// The additional IP addresses to bind to the virtual network interface. Each item may be either a reserved IP
	// identity, or a reserved IP prototype object which will be used to create a new reserved IP. All IP addresses must be
	// in the primary IP's subnet.
	//
	// If reserved IP identities are provided, the specified reserved IPs must be unbound.
	//
	// If reserved IP prototype objects with addresses are provided, the addresses must be available on the virtual network
	// interface's subnet. For any prototype objects that do not specify an address, an available address on the subnet
	// will be automatically selected and reserved.
	Ips []VirtualNetworkInterfaceIPPrototypeIntf `json:"ips,omitempty"`

	// The name for this virtual network interface. The name must not be used by another virtual network interface in the
	// VPC. If unspecified, the name will be a hyphenated list of randomly-selected words. Names beginning with `ibm-` are
	// reserved for provider-owned resources, and are not allowed.
	Name *string `json:"name,omitempty"`

	// The primary IP address to bind to the virtual network interface. May be either a
	// reserved IP identity, or a reserved IP prototype object which will be used to create a
	// new reserved IP.
	//
	// If a reserved IP identity is provided, the specified reserved IP must be unbound.
	//
	// If a reserved IP prototype object with an address is provided, the address must be
	// available on the virtual network interface's subnet. If no address is specified,
	// an available address on the subnet will be automatically selected and reserved.
	PrimaryIP VirtualNetworkInterfacePrimaryIPPrototypeIntf `json:"primary_ip,omitempty"`

	// The protocol state filtering mode to use for this virtual network interface. If
	// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
	// resource type:
	//
	// - `bare_metal_server_network_attachment`: disabled
	// - `instance_network_attachment`: enabled
	// - `share_mount_target`: enabled
	//
	// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
	// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
	// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
	ProtocolStateFilteringMode *string `json:"protocol_state_filtering_mode,omitempty"`

	// The resource group to use for this virtual network interface. If unspecified, the
	// share's resource group will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The security groups to use for this virtual network interface. If unspecified, the default security group of the VPC
	// for the subnet is used.
	SecurityGroups []SecurityGroupIdentityIntf `json:"security_groups,omitempty"`

	// The associated subnet. Required if `primary_ip` does not specify a reserved IP
	// identity.
	Subnet SubnetIdentityIntf `json:"subnet,omitempty"`

	// The unique identifier for this virtual network interface.
	ID *string `json:"id,omitempty"`

	// The URL for this virtual network interface.
	Href *string `json:"href,omitempty"`

	// The CRN for this virtual network interface.
	CRN *string `json:"crn,omitempty"`
}

// Constants associated with the ShareMountTargetVirtualNetworkInterfacePrototype.ProtocolStateFilteringMode property.
// The protocol state filtering mode to use for this virtual network interface. If
// `auto`, protocol state packet filtering is enabled or disabled based on the virtual network interface's `target`
// resource type:
//
// - `bare_metal_server_network_attachment`: disabled
// - `instance_network_attachment`: enabled
// - `share_mount_target`: enabled
//
// Protocol state filtering monitors each network connection flowing over this virtual network interface, and drops any
// packets that are invalid based on the current connection state and protocol. See [Protocol state filtering
// mode](https://cloud.ibm.com/docs/vpc?topic=vpc-vni-about#protocol-state-filtering) for more information.
const (
	ShareMountTargetVirtualNetworkInterfacePrototypeProtocolStateFilteringModeAutoConst    = "auto"
	ShareMountTargetVirtualNetworkInterfacePrototypeProtocolStateFilteringModeEnabledConst = "enabled"
)

func (*ShareMountTargetVirtualNetworkInterfacePrototype) isaShareMountTargetVirtualNetworkInterfacePrototype() bool {
	return true
}

type ShareMountTargetVirtualNetworkInterfacePrototypeIntf interface {
	isaShareMountTargetVirtualNetworkInterfacePrototype() bool
}

// UnmarshalShareMountTargetVirtualNetworkInterfacePrototype unmarshals an instance of ShareMountTargetVirtualNetworkInterfacePrototype from the specified map of raw messages.
func UnmarshalShareMountTargetVirtualNetworkInterfacePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareMountTargetVirtualNetworkInterfacePrototype)
	err = core.UnmarshalPrimitive(m, "allow_ip_spoofing", &obj.AllowIPSpoofing)
	if err != nil {
		err = core.SDKErrorf(err, "", "allow_ip_spoofing-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "auto_delete", &obj.AutoDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "auto_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "enable_infrastructure_nat", &obj.EnableInfrastructureNat)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_infrastructure_nat-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ips", &obj.Ips, UnmarshalVirtualNetworkInterfaceIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "primary_ip", &obj.PrimaryIP, UnmarshalVirtualNetworkInterfacePrimaryIPPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "primary_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "protocol_state_filtering_mode", &obj.ProtocolStateFilteringMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "protocol_state_filtering_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "security_groups", &obj.SecurityGroups, UnmarshalSecurityGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "security_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SharePatch : SharePatch struct
type SharePatch struct {
	// The access control mode for the share:
	//
	// - `security_group`: The security groups on the virtual network interface for a
	//   mount target control access to the mount target.
	// - `vpc`: All clients in the VPC for a mount target have access to the mount target.
	//
	// For this property to be changed, the share must have no mount targets,
	// `replication_role` must be `none` and `accessor_binding_role` must not be `accessor`.
	AccessControlMode *string `json:"access_control_mode,omitempty"`

	// The transit encryption modes to allow for this share
	// (replacing the existing allowed transit encryption modes). The specified transit encryption modes must contain all
	// transit_encryption modes specified by existing mount targets.
	//
	// For this property to be updated, the `accessor_binding_role` must be `none`.
	AllowedTransitEncryptionModes []string `json:"allowed_transit_encryption_modes,omitempty"`

	// The maximum input/output operations per second (IOPS) for the file share.
	//
	// The maximum IOPS for a share may increase in the future. For this property to be changed, the share
	// `accessor_binding_role` must not be `accessor`, the share profile must not have an `iops.type` of `dependent` or
	// `fixed`, and the specified value must be within the `iops` range of the share's profile supported by the share's
	// size.
	Iops *int64 `json:"iops,omitempty"`

	// The name for this share. The name must not be used by another share in the region.
	Name *string `json:"name,omitempty"`

	// The profile to use for this file share.
	//
	// The requested profile must be in the same `family`.
	Profile ShareProfileIdentityIntf `json:"profile,omitempty"`

	// The cron specification for the file share replication schedule.
	//
	// Replication of a share can be scheduled to occur at most once every 15 minutes.
	//
	// For this property to be changed, the share `replication_role` must be `replica`.
	ReplicationCronSpec *string `json:"replication_cron_spec,omitempty"`

	// The size of the file share (in gigabytes), excluding share snapshots. The value must not be less than the share's
	// current size, and must not exceed the maximum supported by the share's profile and IOPS.
	//
	// For this property to be changed:
	// - The share `lifecycle_state` must be `stable`
	// - The share `replication_role` must not be `replica`
	// - The share `accessor_binding_role` must not be `accessor`.
	Size *int64 `json:"size,omitempty"`

	// The tags for this resource.
	UserTags []string `json:"user_tags,omitempty"`
}

// Constants associated with the SharePatch.AccessControlMode property.
// The access control mode for the share:
//
//   - `security_group`: The security groups on the virtual network interface for a
//     mount target control access to the mount target.
//   - `vpc`: All clients in the VPC for a mount target have access to the mount target.
//
// For this property to be changed, the share must have no mount targets,
// `replication_role` must be `none` and `accessor_binding_role` must not be `accessor`.
const (
	SharePatchAccessControlModeSecurityGroupConst = "security_group"
	SharePatchAccessControlModeVPCConst           = "vpc"
)

// Constants associated with the SharePatch.AllowedTransitEncryptionModes property.
const (
	SharePatchAllowedTransitEncryptionModesNoneConst        = "none"
	SharePatchAllowedTransitEncryptionModesUserManagedConst = "user_managed"
)

// UnmarshalSharePatch unmarshals an instance of SharePatch from the specified map of raw messages.
func UnmarshalSharePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SharePatch)
	err = core.UnmarshalPrimitive(m, "access_control_mode", &obj.AccessControlMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_control_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "allowed_transit_encryption_modes", &obj.AllowedTransitEncryptionModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_transit_encryption_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "iops", &obj.Iops)
	if err != nil {
		err = core.SDKErrorf(err, "", "iops-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalShareProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "replication_cron_spec", &obj.ReplicationCronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the SharePatch
func (sharePatch *SharePatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(sharePatch.AccessControlMode) {
		_patch["access_control_mode"] = sharePatch.AccessControlMode
	}
	if !core.IsNil(sharePatch.AllowedTransitEncryptionModes) {
		_patch["allowed_transit_encryption_modes"] = sharePatch.AllowedTransitEncryptionModes
	}
	if !core.IsNil(sharePatch.Iops) {
		_patch["iops"] = sharePatch.Iops
	}
	if !core.IsNil(sharePatch.Name) {
		_patch["name"] = sharePatch.Name
	}
	if !core.IsNil(sharePatch.Profile) {
		_patch["profile"] = sharePatch.Profile.asPatch()
	}
	if !core.IsNil(sharePatch.ReplicationCronSpec) {
		_patch["replication_cron_spec"] = sharePatch.ReplicationCronSpec
	}
	if !core.IsNil(sharePatch.Size) {
		_patch["size"] = sharePatch.Size
	}
	if !core.IsNil(sharePatch.UserTags) {
		_patch["user_tags"] = sharePatch.UserTags
	}

	return
}

// ShareProfile : ShareProfile struct
type ShareProfile struct {
	// The permitted capacity range (in gigabytes) for a share with this profile.
	Capacity ShareProfileCapacityIntf `json:"capacity" validate:"required"`

	// The product family this share profile belongs to.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Family *string `json:"family" validate:"required"`

	// The URL for this share profile.
	Href *string `json:"href" validate:"required"`

	// The permitted IOPS range for a share with this profile.
	Iops ShareProfileIopsIntf `json:"iops" validate:"required"`

	// The globally unique name for this share profile.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ShareProfile.Family property.
// The product family this share profile belongs to.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareProfileFamilyDefinedPerformanceConst = "defined_performance"
)

// Constants associated with the ShareProfile.ResourceType property.
// The resource type.
const (
	ShareProfileResourceTypeShareProfileConst = "share_profile"
)

// UnmarshalShareProfile unmarshals an instance of ShareProfile from the specified map of raw messages.
func UnmarshalShareProfile(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareProfile)
	err = core.UnmarshalModel(m, "capacity", &obj.Capacity, UnmarshalShareProfileCapacity)
	if err != nil {
		err = core.SDKErrorf(err, "", "capacity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "family", &obj.Family)
	if err != nil {
		err = core.SDKErrorf(err, "", "family-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "iops", &obj.Iops, UnmarshalShareProfileIops)
	if err != nil {
		err = core.SDKErrorf(err, "", "iops-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareProfileCapacity : ShareProfileCapacity struct
// Models which "extend" this model:
// - ShareProfileCapacityFixed
// - ShareProfileCapacityEnum
// - ShareProfileCapacityRange
// - ShareProfileCapacityDependentRange
type ShareProfileCapacity struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`
}

// Constants associated with the ShareProfileCapacity.Type property.
// The type for this profile field.
const (
	ShareProfileCapacityTypeFixedConst = "fixed"
)

func (*ShareProfileCapacity) isaShareProfileCapacity() bool {
	return true
}

type ShareProfileCapacityIntf interface {
	isaShareProfileCapacity() bool
}

// UnmarshalShareProfileCapacity unmarshals an instance of ShareProfileCapacity from the specified map of raw messages.
func UnmarshalShareProfileCapacity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareProfileCapacity)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareProfileCollection : ShareProfileCollection struct
type ShareProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of share profiles.
	Profiles []ShareProfile `json:"profiles" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalShareProfileCollection unmarshals an instance of ShareProfileCollection from the specified map of raw messages.
func UnmarshalShareProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profiles", &obj.Profiles, UnmarshalShareProfile)
	if err != nil {
		err = core.SDKErrorf(err, "", "profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ShareProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ShareProfileIops : ShareProfileIops struct
// Models which "extend" this model:
// - ShareProfileIopsFixed
// - ShareProfileIopsRange
// - ShareProfileIopsEnum
// - ShareProfileIopsDependentRange
// - ShareProfileIopsDependent
type ShareProfileIops struct {
	// The type for this profile field.
	Type *string `json:"type,omitempty"`

	// The value for this profile field.
	Value *int64 `json:"value,omitempty"`

	// The default value for this profile field.
	Default *int64 `json:"default,omitempty"`

	// The maximum value for this profile field.
	Max *int64 `json:"max,omitempty"`

	// The minimum value for this profile field.
	Min *int64 `json:"min,omitempty"`

	// The increment step value for this profile field.
	Step *int64 `json:"step,omitempty"`

	// The permitted values for this profile field.
	Values []int64 `json:"values,omitempty"`
}

// Constants associated with the ShareProfileIops.Type property.
// The type for this profile field.
const (
	ShareProfileIopsTypeFixedConst = "fixed"
)

func (*ShareProfileIops) isaShareProfileIops() bool {
	return true
}

type ShareProfileIopsIntf interface {
	isaShareProfileIops() bool
}

// UnmarshalShareProfileIops unmarshals an instance of ShareProfileIops from the specified map of raw messages.
func UnmarshalShareProfileIops(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareProfileIops)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "default", &obj.Default)
	if err != nil {
		err = core.SDKErrorf(err, "", "default-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "max", &obj.Max)
	if err != nil {
		err = core.SDKErrorf(err, "", "max-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "min", &obj.Min)
	if err != nil {
		err = core.SDKErrorf(err, "", "min-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "step", &obj.Step)
	if err != nil {
		err = core.SDKErrorf(err, "", "step-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "values", &obj.Values)
	if err != nil {
		err = core.SDKErrorf(err, "", "values-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareProfileIdentity : Identifies a share profile by a unique property.
// Models which "extend" this model:
// - ShareProfileIdentityByName
// - ShareProfileIdentityByHref
type ShareProfileIdentity struct {
	// The globally unique name for this share profile.
	Name *string `json:"name,omitempty"`

	// The URL for this share profile.
	Href *string `json:"href,omitempty"`
}

func (*ShareProfileIdentity) isaShareProfileIdentity() bool {
	return true
}

type ShareProfileIdentityIntf interface {
	isaShareProfileIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalShareProfileIdentity unmarshals an instance of ShareProfileIdentity from the specified map of raw messages.
func UnmarshalShareProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareProfileIdentity)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the ShareProfileIdentity
func (shareProfileIdentity *ShareProfileIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(shareProfileIdentity.Name) {
		_patch["name"] = shareProfileIdentity.Name
	}
	if !core.IsNil(shareProfileIdentity.Href) {
		_patch["href"] = shareProfileIdentity.Href
	}

	return
}

// ShareProfileReference : ShareProfileReference struct
type ShareProfileReference struct {
	// The URL for this share profile.
	Href *string `json:"href" validate:"required"`

	// The globally unique name for this share profile.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ShareProfileReference.ResourceType property.
// The resource type.
const (
	ShareProfileReferenceResourceTypeShareProfileConst = "share_profile"
)

// UnmarshalShareProfileReference unmarshals an instance of ShareProfileReference from the specified map of raw messages.
func UnmarshalShareProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareProfileReference)
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SharePrototype : SharePrototype struct
// Models which "extend" this model:
// - SharePrototypeShareBySize
// - SharePrototypeShareBySourceShare
// - SharePrototypeShareByOriginShare
// - SharePrototypeShareBySourceSnapshot
type SharePrototype struct {
	// The transit encryption modes to allow for this share. If unspecified:
	// - If share mount targets are specified, and those share mount targets all specify a
	//   `transit_encryption` of `user_managed`, then only `user_managed` will be allowed.
	// - Otherwise, all `transit_encryption` modes will be allowed.
	AllowedTransitEncryptionModes []string `json:"allowed_transit_encryption_modes,omitempty"`

	// The mount targets for the file share. Each mount target must be in a unique VPC.
	MountTargets []ShareMountTargetPrototypeIntf `json:"mount_targets,omitempty"`

	// The name for this share. The name must not be used by another share in the region. If unspecified, the name will be
	// a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// Configuration for a replica file share to create and associate with this file share. If
	// unspecified, a replica may be subsequently added by creating a new file share with a
	// `source_share` referencing this file share.
	ReplicaShare *SharePrototypeShareContext `json:"replica_share,omitempty"`

	// The tags for this resource.
	UserTags []string `json:"user_tags,omitempty"`

	// The access control mode for the share:
	//
	// - `security_group`: The security groups on the virtual network interface for a
	//   mount target control access to the mount target. Mount targets for this share
	//   require a virtual network interface.
	// - `vpc`: All clients in the VPC for a mount target have access to the mount target.
	//   Mount targets for this share require a VPC.
	AccessControlMode *string `json:"access_control_mode,omitempty"`

	// The root key to use to wrap the data encryption key for the share.
	//
	// If unspecified, the `encryption` type for the share will be `provider_managed`.
	//
	// The specified key may be in a different account, subject to IAM policies.
	EncryptionKey EncryptionKeyIdentityIntf `json:"encryption_key,omitempty"`

	// The owner assigned to the file share at creation. Subsequent changes to the owner
	// must be performed by a client that has mounted the file share.
	InitialOwner *ShareInitialOwner `json:"initial_owner,omitempty"`

	// The maximum input/output operations per second (IOPS) for the file share.
	//
	// If the share profile has an `iops.type` of `dependent` or `fixed`, this property is system-managed and must not be
	// specified. Otherwise, the specified value must be within the `iops` range of the share profile as supported by the
	// share's specified size.
	Iops *int64 `json:"iops,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-file-storage-profiles) to use
	// for this file share. The profile must support the share's specified IOPS and size.
	Profile ShareProfileIdentityIntf `json:"profile,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The size of the file share (in gigabytes), excluding share snapshots.
	//
	// The specified value must be within the permitted `capacity` range of the share's profile and supported by the
	// share's specified IOPS.
	Size *int64 `json:"size,omitempty"`

	// The zone this file share will reside in. For a replica share in the same region as
	// the source share, this must be a different zone from the source share.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`

	// The cron specification for the file share replication schedule.
	//
	// Replication of a share can be scheduled to occur at most once every 15 minutes.
	//
	// The scheduling frequency for this property may
	// [increase](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ReplicationCronSpec *string `json:"replication_cron_spec,omitempty"`

	// The source file share for this replica file share. The specified file share must not
	// already have a replica, and must not be a replica. If source file share is specified
	// by CRN, it may be in an [associated partner
	// region](https://cloud.ibm.com/docs/vpc?topic=vpc-file-storage-replication).
	SourceShare ShareIdentityIntf `json:"source_share,omitempty"`

	// The origin share for the accessor share. The origin share must have an
	// `access_control_mode` of `security_group`, and must not have an
	// `accessor_binding_role` of `accessor`.
	//
	// The specified share may be in a different account, subject to IAM policies.
	OriginShare ShareIdentityIntf `json:"origin_share,omitempty"`

	// The source snapshot to clone this file share from.
	//
	// This file share will reside in the same zone as the specified source snapshot.
	// The snapshot must have the `lifecycle_state` as `stable` and `status` as `available`
	// to be able to restore a share for it.
	SourceSnapshot ShareSourceSnapshotPrototypeIntf `json:"source_snapshot,omitempty"`
}

// Constants associated with the SharePrototype.AllowedTransitEncryptionModes property.
const (
	SharePrototypeAllowedTransitEncryptionModesNoneConst        = "none"
	SharePrototypeAllowedTransitEncryptionModesUserManagedConst = "user_managed"
)

// Constants associated with the SharePrototype.AccessControlMode property.
// The access control mode for the share:
//
//   - `security_group`: The security groups on the virtual network interface for a
//     mount target control access to the mount target. Mount targets for this share
//     require a virtual network interface.
//   - `vpc`: All clients in the VPC for a mount target have access to the mount target.
//     Mount targets for this share require a VPC.
const (
	SharePrototypeAccessControlModeSecurityGroupConst = "security_group"
	SharePrototypeAccessControlModeVPCConst           = "vpc"
)

func (*SharePrototype) isaSharePrototype() bool {
	return true
}

type SharePrototypeIntf interface {
	isaSharePrototype() bool
}

// UnmarshalSharePrototype unmarshals an instance of SharePrototype from the specified map of raw messages.
func UnmarshalSharePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SharePrototype)
	err = core.UnmarshalPrimitive(m, "allowed_transit_encryption_modes", &obj.AllowedTransitEncryptionModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_transit_encryption_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "mount_targets", &obj.MountTargets, UnmarshalShareMountTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "mount_targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "replica_share", &obj.ReplicaShare, UnmarshalSharePrototypeShareContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "replica_share-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "access_control_mode", &obj.AccessControlMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "access_control_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "initial_owner", &obj.InitialOwner, UnmarshalShareInitialOwner)
	if err != nil {
		err = core.SDKErrorf(err, "", "initial_owner-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "iops", &obj.Iops)
	if err != nil {
		err = core.SDKErrorf(err, "", "iops-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalShareProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "replication_cron_spec", &obj.ReplicationCronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_share", &obj.SourceShare, UnmarshalShareIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_share-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "origin_share", &obj.OriginShare, UnmarshalShareIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "origin_share-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_snapshot", &obj.SourceSnapshot, UnmarshalShareSourceSnapshotPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_snapshot-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SharePrototypeShareContext : Configuration for a replica file share to create and associate with this file share. If unspecified, a replica may be
// subsequently added by creating a new file share with a
// `source_share` referencing this file share.
type SharePrototypeShareContext struct {
	// The transit encryption modes to allow for this share. If unspecified:
	// - If share mount targets are specified, and those share mount targets all specify a
	//   `transit_encryption` of `user_managed`, then only `user_managed` will be allowed.
	// - Otherwise, all `transit_encryption` modes will be allowed.
	AllowedTransitEncryptionModes []string `json:"allowed_transit_encryption_modes,omitempty"`

	// The maximum input/output operations per second (IOPS) for the file share.
	//
	// If the share profile has an `iops.type` of `dependent` or `fixed`, this property is system-managed and must not be
	// specified. Otherwise, the specified value must be within the `iops` range of the share profile as supported by the
	// share's specified size.
	Iops *int64 `json:"iops,omitempty"`

	// The mount targets for this replica file share. Each mount target must be in a unique VPC.
	//
	// A replica's mount targets must be mounted read-only.
	MountTargets []ShareMountTargetPrototypeIntf `json:"mount_targets,omitempty"`

	// The name for this share. The name must not be used by another share in the region. If unspecified, the name will be
	// a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The [profile](https://cloud.ibm.com/docs/vpc?topic=vpc-file-storage-profiles) to use
	// for this file share. The profile must support the share's specified IOPS and size.
	Profile ShareProfileIdentityIntf `json:"profile" validate:"required"`

	// The cron specification for the file share replication schedule.
	//
	// Replication of a share can be scheduled to occur at most once every 15 minutes.
	ReplicationCronSpec *string `json:"replication_cron_spec" validate:"required"`

	// The resource group to use. If unspecified, the resource group from
	// the source share will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The tags for this resource.
	UserTags []string `json:"user_tags,omitempty"`

	// The zone this replica file share will reside in. For a replica share in the same
	// region as the source share, this must be a different zone from the source share.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`
}

// Constants associated with the SharePrototypeShareContext.AllowedTransitEncryptionModes property.
const (
	SharePrototypeShareContextAllowedTransitEncryptionModesNoneConst        = "none"
	SharePrototypeShareContextAllowedTransitEncryptionModesUserManagedConst = "user_managed"
)

// NewSharePrototypeShareContext : Instantiate SharePrototypeShareContext (Generic Model Constructor)
func (*VpcV1) NewSharePrototypeShareContext(profile ShareProfileIdentityIntf, replicationCronSpec string, zone ZoneIdentityIntf) (_model *SharePrototypeShareContext, err error) {
	_model = &SharePrototypeShareContext{
		Profile:             profile,
		ReplicationCronSpec: core.StringPtr(replicationCronSpec),
		Zone:                zone,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalSharePrototypeShareContext unmarshals an instance of SharePrototypeShareContext from the specified map of raw messages.
func UnmarshalSharePrototypeShareContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SharePrototypeShareContext)
	err = core.UnmarshalPrimitive(m, "allowed_transit_encryption_modes", &obj.AllowedTransitEncryptionModes)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_transit_encryption_modes-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "iops", &obj.Iops)
	if err != nil {
		err = core.SDKErrorf(err, "", "iops-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "mount_targets", &obj.MountTargets, UnmarshalShareMountTargetPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "mount_targets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "profile", &obj.Profile, UnmarshalShareProfileIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "profile-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "replication_cron_spec", &obj.ReplicationCronSpec)
	if err != nil {
		err = core.SDKErrorf(err, "", "replication_cron_spec-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareReference : ShareReference struct
type ShareReference struct {
	// The CRN for this file share.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this file share.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this file share.
	ID *string `json:"id" validate:"required"`

	// The name for this share. The name is unique across all shares in the region.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *ShareRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the ShareReference.ResourceType property.
// The resource type.
const (
	ShareReferenceResourceTypeShareConst = "share"
)

// UnmarshalShareReference unmarshals an instance of ShareReference from the specified map of raw messages.
func UnmarshalShareReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalShareRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type ShareRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`

	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalShareRemote unmarshals an instance of ShareRemote from the specified map of raw messages.
func UnmarshalShareRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareRemote)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareReplicationStatusReason : ShareReplicationStatusReason struct
type ShareReplicationStatusReason struct {
	// A snake case string succinctly identifying the status reason.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ShareReplicationStatusReason.Code property.
// A snake case string succinctly identifying the status reason.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareReplicationStatusReasonCodeCannotInitializeReplicationConst = "cannot_initialize_replication"
	ShareReplicationStatusReasonCodeCannotReachReplicaShareConst     = "cannot_reach_replica_share"
	ShareReplicationStatusReasonCodeCannotReachSourceShareConst      = "cannot_reach_source_share"
)

// UnmarshalShareReplicationStatusReason unmarshals an instance of ShareReplicationStatusReason from the specified map of raw messages.
func UnmarshalShareReplicationStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareReplicationStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareSnapshot : ShareSnapshot struct
type ShareSnapshot struct {
	// If present, the backup policy plan which created this share snapshot.
	BackupPolicyPlan *BackupPolicyPlanReference `json:"backup_policy_plan,omitempty"`

	// The date and time the data capture for this share snapshot was completed.
	//
	// If absent, this snapshot's data has not yet been captured.
	CapturedAt *strfmt.DateTime `json:"captured_at,omitempty"`

	// The date and time that the share snapshot was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this share snapshot.
	CRN *string `json:"crn" validate:"required"`

	// The fingerprint for this share snapshot. Only snapshots with identical data will have the same fingerprint. This
	// snapshot will also be available as a subdirectory named identically to this fingerprint in the share's `.snapshot`
	// directory.
	Fingerprint *string `json:"fingerprint" validate:"required"`

	// The URL for this share snapshot.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this share snapshot.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []ShareSnapshotLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of this share snapshot
	// - `pending`: The share snapshot is being provisioned and is not yet usable. A
	//   snapshot on a replica share will remain `pending` until the next replication sync
	//   completes.
	// - `deleting`: The share snapshot is being deleted.
	// - `failed`: The share snapshot is irrecoverably unusable.
	// - `stable`: The share snapshot is stable and ready for use.
	// - `updating`: The share snapshot is being updated.
	// - `suspended`: The share snapshot is not currently usable (see `lifecycle_reasons`).
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The minimum size of a share created from this snapshot. When a snapshot is created, this will be set to the size of
	// the `source_share`.
	MinimumSize *int64 `json:"minimum_size" validate:"required"`

	// The name for this share snapshot. The name is unique across all snapshots for the file share.
	Name *string `json:"name" validate:"required"`

	// The resource group for this share snapshot.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of the share snapshot:
	// - `available`: The share snapshot is available for use.
	// - `failed`: The share snapshot is irrecoverably unusable.
	// - `pending`: The share snapshot is being provisioned and is not yet usable. A
	//   snapshot on a replica share will remain `pending` until the next replication sync
	//   completes.
	// - `unusable`: The share snapshot is not currently usable (see `status_reasons`)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []ShareSnapshotStatusReason `json:"status_reasons" validate:"required"`

	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this share snapshot.
	UserTags []string `json:"user_tags" validate:"required"`

	// The zone this share snapshot resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the ShareSnapshot.LifecycleState property.
// The lifecycle state of this share snapshot
//   - `pending`: The share snapshot is being provisioned and is not yet usable. A
//     snapshot on a replica share will remain `pending` until the next replication sync
//     completes.
//   - `deleting`: The share snapshot is being deleted.
//   - `failed`: The share snapshot is irrecoverably unusable.
//   - `stable`: The share snapshot is stable and ready for use.
//   - `updating`: The share snapshot is being updated.
//   - `suspended`: The share snapshot is not currently usable (see `lifecycle_reasons`).
const (
	ShareSnapshotLifecycleStateDeletingConst  = "deleting"
	ShareSnapshotLifecycleStateFailedConst    = "failed"
	ShareSnapshotLifecycleStatePendingConst   = "pending"
	ShareSnapshotLifecycleStateStableConst    = "stable"
	ShareSnapshotLifecycleStateSuspendedConst = "suspended"
	ShareSnapshotLifecycleStateUpdatingConst  = "updating"
	ShareSnapshotLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the ShareSnapshot.ResourceType property.
// The resource type.
const (
	ShareSnapshotResourceTypeShareSnapshotConst = "share_snapshot"
)

// Constants associated with the ShareSnapshot.Status property.
// The status of the share snapshot:
//   - `available`: The share snapshot is available for use.
//   - `failed`: The share snapshot is irrecoverably unusable.
//   - `pending`: The share snapshot is being provisioned and is not yet usable. A
//     snapshot on a replica share will remain `pending` until the next replication sync
//     completes.
//   - `unusable`: The share snapshot is not currently usable (see `status_reasons`)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareSnapshotStatusAvailableConst = "available"
	ShareSnapshotStatusFailedConst    = "failed"
	ShareSnapshotStatusPendingConst   = "pending"
	ShareSnapshotStatusUnusableConst  = "unusable"
)

// UnmarshalShareSnapshot unmarshals an instance of ShareSnapshot from the specified map of raw messages.
func UnmarshalShareSnapshot(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSnapshot)
	err = core.UnmarshalModel(m, "backup_policy_plan", &obj.BackupPolicyPlan, UnmarshalBackupPolicyPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "backup_policy_plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "captured_at", &obj.CapturedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "captured_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fingerprint", &obj.Fingerprint)
	if err != nil {
		err = core.SDKErrorf(err, "", "fingerprint-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalShareSnapshotLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "minimum_size", &obj.MinimumSize)
	if err != nil {
		err = core.SDKErrorf(err, "", "minimum_size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalShareSnapshotStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareSnapshotCollection : ShareSnapshotCollection struct
type ShareSnapshotCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of share snapshots.
	Snapshots []ShareSnapshot `json:"snapshots,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalShareSnapshotCollection unmarshals an instance of ShareSnapshotCollection from the specified map of raw messages.
func UnmarshalShareSnapshotCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSnapshotCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "snapshots", &obj.Snapshots, UnmarshalShareSnapshot)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshots-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *ShareSnapshotCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// ShareSnapshotLifecycleReason : ShareSnapshotLifecycleReason struct
type ShareSnapshotLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ShareSnapshotLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareSnapshotLifecycleReasonCodeInternalErrorConst               = "internal_error"
	ShareSnapshotLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalShareSnapshotLifecycleReason unmarshals an instance of ShareSnapshotLifecycleReason from the specified map of raw messages.
func UnmarshalShareSnapshotLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSnapshotLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareSnapshotPatch : ShareSnapshotPatch struct
type ShareSnapshotPatch struct {
	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this share snapshot.
	UserTags []string `json:"user_tags,omitempty"`
}

// UnmarshalShareSnapshotPatch unmarshals an instance of ShareSnapshotPatch from the specified map of raw messages.
func UnmarshalShareSnapshotPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSnapshotPatch)
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the ShareSnapshotPatch
func (shareSnapshotPatch *ShareSnapshotPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(shareSnapshotPatch.UserTags) {
		_patch["user_tags"] = shareSnapshotPatch.UserTags
	}

	return
}

// ShareSnapshotStatusReason : ShareSnapshotStatusReason struct
type ShareSnapshotStatusReason struct {
	// A reason code for the status:
	// - `encryption_key_deleted`: Share snapshot is unusable because its
	//  `encryption_key` was deleted
	// - `internal_error`: Internal error (contact IBM support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the status reason.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the ShareSnapshotStatusReason.Code property.
// A reason code for the status:
//   - `encryption_key_deleted`: Share snapshot is unusable because its
//     `encryption_key` was deleted
//   - `internal_error`: Internal error (contact IBM support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	ShareSnapshotStatusReasonCodeEncryptionKeyDeletedConst = "encryption_key_deleted"
)

// UnmarshalShareSnapshotStatusReason unmarshals an instance of ShareSnapshotStatusReason from the specified map of raw messages.
func UnmarshalShareSnapshotStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSnapshotStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareSourceSnapshot : ShareSourceSnapshot struct
// Models which "extend" this model:
// - ShareSourceSnapshotShareSnapshotReference
type ShareSourceSnapshot struct {
	// The CRN for this share snapshot.
	CRN *string `json:"crn,omitempty"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this share snapshot.
	Href *string `json:"href,omitempty"`

	// The unique identifier for this share snapshot.
	ID *string `json:"id,omitempty"`

	// The name for this share snapshot. The name is unique across all snapshots for the file share.
	Name *string `json:"name,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type,omitempty"`
}

// Constants associated with the ShareSourceSnapshot.ResourceType property.
// The resource type.
const (
	ShareSourceSnapshotResourceTypeShareSnapshotConst = "share_snapshot"
)

func (*ShareSourceSnapshot) isaShareSourceSnapshot() bool {
	return true
}

type ShareSourceSnapshotIntf interface {
	isaShareSourceSnapshot() bool
}

// UnmarshalShareSourceSnapshot unmarshals an instance of ShareSourceSnapshot from the specified map of raw messages.
func UnmarshalShareSourceSnapshot(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSourceSnapshot)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// ShareSourceSnapshotPrototype : ShareSourceSnapshotPrototype struct
// Models which "extend" this model:
// - ShareSourceSnapshotPrototypeShareSnapshotIdentity
type ShareSourceSnapshotPrototype struct {
	// The unique identifier for this share snapshot.
	ID *string `json:"id,omitempty"`

	// The CRN for this share snapshot.
	CRN *string `json:"crn,omitempty"`

	// The URL for this share snapshot.
	Href *string `json:"href,omitempty"`
}

func (*ShareSourceSnapshotPrototype) isaShareSourceSnapshotPrototype() bool {
	return true
}

type ShareSourceSnapshotPrototypeIntf interface {
	isaShareSourceSnapshotPrototype() bool
}

// UnmarshalShareSourceSnapshotPrototype unmarshals an instance of ShareSourceSnapshotPrototype from the specified map of raw messages.
func UnmarshalShareSourceSnapshotPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(ShareSourceSnapshotPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Snapshot : Snapshot struct
type Snapshot struct {
	// The usage constraints to be matched against the requested instance properties to
	// determine compatibility. While bare metal servers cannot be provisioned from snapshots,
	// an image or volume created from this snapshot will inherit its `allowed_use` value.
	//
	// Only present on bootable snapshots. The value of this property will be inherited from
	// the source volume or source snapshot at snapshot creation, but can be changed.
	AllowedUse *SnapshotAllowedUse `json:"allowed_use,omitempty"`

	// If present, the backup policy plan which created this snapshot.
	BackupPolicyPlan *BackupPolicyPlanReference `json:"backup_policy_plan,omitempty"`

	// Indicates if a boot volume attachment can be created with a volume created from this snapshot.
	Bootable *bool `json:"bootable" validate:"required"`

	// The date and time the data capture for this snapshot was completed.
	//
	// If absent, this snapshot's data has not yet been captured. Additionally, this property may be absent for snapshots
	// created before 1 January 2022.
	CapturedAt *strfmt.DateTime `json:"captured_at,omitempty"`

	// The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user)
	// offering inherited from the snapshot's source. If a virtual server instance is
	// provisioned with a `source_snapshot` specifying this snapshot, the virtual server
	// instance will use this snapshot's catalog offering, including its pricing plan.
	//
	// If absent, this snapshot is not associated with a catalog offering.
	CatalogOffering *SnapshotCatalogOffering `json:"catalog_offering,omitempty"`

	// The clones for this snapshot.
	Clones []SnapshotClone `json:"clones" validate:"required"`

	// The copies of this snapshot.
	Copies []SnapshotCopiesItem `json:"copies" validate:"required"`

	// The date and time that this snapshot was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN of this snapshot.
	CRN *string `json:"crn" validate:"required"`

	// Indicates whether this snapshot can be deleted. This value will always be `true`.
	// Deprecated: this field is deprecated and may be removed in a future release.
	Deletable *bool `json:"deletable" validate:"required"`

	// The type of encryption used on the source volume.
	Encryption *string `json:"encryption" validate:"required"`

	// The root key used to wrap the data encryption key for the source volume.
	//
	// This property will be present for volumes with an `encryption` type of
	// `user_managed`.
	EncryptionKey *EncryptionKeyReference `json:"encryption_key,omitempty"`

	// The URL for this snapshot.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this snapshot.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of this snapshot.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The minimum capacity of a volume created from this snapshot. When a snapshot is created, this will be set to the
	// capacity of the `source_volume`.
	MinimumCapacity *int64 `json:"minimum_capacity" validate:"required"`

	// The name for this snapshot. The name is unique across all snapshots in the region.
	Name *string `json:"name" validate:"required"`

	// The operating system included in this snapshot.
	OperatingSystem *OperatingSystem `json:"operating_system,omitempty"`

	// Indicates the progress (as a percentage) of storing this snapshot. Only stored snapshots can be used for
	// restoration.
	Progress *int64 `json:"progress" validate:"required"`

	// The resource group for this snapshot.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The [service tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) prefixed with `is.snapshot:` associated with
	// this snapshot.
	ServiceTags []string `json:"service_tags" validate:"required"`

	// The size of this snapshot rounded up to the next gigabyte.
	Size *int64 `json:"size" validate:"required"`

	// If present, the snapshot consistency group which created this snapshot.
	SnapshotConsistencyGroup *SnapshotConsistencyGroupReference `json:"snapshot_consistency_group,omitempty"`

	// If present, the image from which the data on this snapshot was most directly
	// provisioned.
	SourceImage *ImageReference `json:"source_image,omitempty"`

	// If present, the source snapshot this snapshot was created from.
	SourceSnapshot *SnapshotSourceSnapshot `json:"source_snapshot,omitempty"`

	// The source volume this snapshot was created from (may be
	// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
	SourceVolume *VolumeReference `json:"source_volume" validate:"required"`

	// The [storage
	// generation](https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles&interface=api#using-api-iops-profiles):
	// - `1`: The first storage generation
	// - `2`: The second storage generation
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	StorageGeneration *int64 `json:"storage_generation" validate:"required"`

	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this snapshot.
	UserTags []string `json:"user_tags" validate:"required"`
}

// Constants associated with the Snapshot.Encryption property.
// The type of encryption used on the source volume.
const (
	SnapshotEncryptionProviderManagedConst = "provider_managed"
	SnapshotEncryptionUserManagedConst     = "user_managed"
)

// Constants associated with the Snapshot.LifecycleState property.
// The lifecycle state of this snapshot.
const (
	SnapshotLifecycleStateDeletingConst  = "deleting"
	SnapshotLifecycleStateFailedConst    = "failed"
	SnapshotLifecycleStatePendingConst   = "pending"
	SnapshotLifecycleStateStableConst    = "stable"
	SnapshotLifecycleStateSuspendedConst = "suspended"
	SnapshotLifecycleStateUnusableConst  = "unusable"
	SnapshotLifecycleStateUpdatingConst  = "updating"
	SnapshotLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the Snapshot.ResourceType property.
// The resource type.
const (
	SnapshotResourceTypeSnapshotConst = "snapshot"
)

// UnmarshalSnapshot unmarshals an instance of Snapshot from the specified map of raw messages.
func UnmarshalSnapshot(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Snapshot)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalSnapshotAllowedUse)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "backup_policy_plan", &obj.BackupPolicyPlan, UnmarshalBackupPolicyPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "backup_policy_plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bootable", &obj.Bootable)
	if err != nil {
		err = core.SDKErrorf(err, "", "bootable-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "captured_at", &obj.CapturedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "captured_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "catalog_offering", &obj.CatalogOffering, UnmarshalSnapshotCatalogOffering)
	if err != nil {
		err = core.SDKErrorf(err, "", "catalog_offering-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "clones", &obj.Clones, UnmarshalSnapshotClone)
	if err != nil {
		err = core.SDKErrorf(err, "", "clones-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "copies", &obj.Copies, UnmarshalSnapshotCopiesItem)
	if err != nil {
		err = core.SDKErrorf(err, "", "copies-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "deletable", &obj.Deletable)
	if err != nil {
		err = core.SDKErrorf(err, "", "deletable-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "encryption", &obj.Encryption)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "minimum_capacity", &obj.MinimumCapacity)
	if err != nil {
		err = core.SDKErrorf(err, "", "minimum_capacity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "operating_system", &obj.OperatingSystem, UnmarshalOperatingSystem)
	if err != nil {
		err = core.SDKErrorf(err, "", "operating_system-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "progress", &obj.Progress)
	if err != nil {
		err = core.SDKErrorf(err, "", "progress-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "service_tags", &obj.ServiceTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "service_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "size", &obj.Size)
	if err != nil {
		err = core.SDKErrorf(err, "", "size-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "snapshot_consistency_group", &obj.SnapshotConsistencyGroup, UnmarshalSnapshotConsistencyGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshot_consistency_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_image", &obj.SourceImage, UnmarshalImageReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_image-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_snapshot", &obj.SourceSnapshot, UnmarshalSnapshotSourceSnapshot)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_snapshot-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_volume", &obj.SourceVolume, UnmarshalVolumeReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_volume-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "storage_generation", &obj.StorageGeneration)
	if err != nil {
		err = core.SDKErrorf(err, "", "storage_generation-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotAllowedUse : SnapshotAllowedUse struct
type SnapshotAllowedUse struct {
	// The API version with which to evaluate the expressions.
	ApiVersion *string `json:"api_version" validate:"required"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using the image data in
	// this snapshot.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variable is supported, corresponding
	// to the `BareMetalServer` property:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server" validate:"required"`

	// The expression that must be satisfied by the properties of a virtual server instance provisioned using this
	// snapshot.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `Instance` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled
	// - `gpu.count` (integer): The number of GPUs
	// - `gpu.manufacturer` (string): The GPU manufacturer
	// - `gpu.memory` (integer): The overall amount of GPU memory in GiB (gibibytes)
	// - `gpu.model` (string): The GPU model.
	Instance *string `json:"instance" validate:"required"`
}

// UnmarshalSnapshotAllowedUse unmarshals an instance of SnapshotAllowedUse from the specified map of raw messages.
func UnmarshalSnapshotAllowedUse(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotAllowedUse)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance", &obj.Instance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotAllowedUsePatch : SnapshotAllowedUsePatch struct
type SnapshotAllowedUsePatch struct {
	// The API version with which to evaluate the expressions.
	//
	// If specified, the value must be between `2019-01-01` and today's date (in UTC).
	ApiVersion *string `json:"api_version,omitempty"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using the image data in
	// this snapshot.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variable is supported, corresponding
	// to the `BareMetalServer` property:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server,omitempty"`

	// The expression that must be satisfied by the properties of a virtual server instance provisioned using this
	// snapshot.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `Instance` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled
	// - `gpu.count` (integer): The number of GPUs
	// - `gpu.manufacturer` (string): The GPU manufacturer
	// - `gpu.memory` (integer): The overall amount of GPU memory in GiB (gibibytes)
	// - `gpu.model` (string): The GPU model.
	Instance *string `json:"instance,omitempty"`
}

// UnmarshalSnapshotAllowedUsePatch unmarshals an instance of SnapshotAllowedUsePatch from the specified map of raw messages.
func UnmarshalSnapshotAllowedUsePatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotAllowedUsePatch)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance", &obj.Instance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the SnapshotAllowedUsePatch
func (snapshotAllowedUsePatch *SnapshotAllowedUsePatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(snapshotAllowedUsePatch.ApiVersion) {
		_patch["api_version"] = snapshotAllowedUsePatch.ApiVersion
	}
	if !core.IsNil(snapshotAllowedUsePatch.BareMetalServer) {
		_patch["bare_metal_server"] = snapshotAllowedUsePatch.BareMetalServer
	}
	if !core.IsNil(snapshotAllowedUsePatch.Instance) {
		_patch["instance"] = snapshotAllowedUsePatch.Instance
	}

	return
}

// SnapshotAllowedUsePrototype : SnapshotAllowedUsePrototype struct
type SnapshotAllowedUsePrototype struct {
	// The API version with which to evaluate the expressions.
	//
	// If specified, the value must be between `2019-01-01` and today's date (in UTC). If unspecified, the `version` query
	// parameter value will be used.
	ApiVersion *string `json:"api_version,omitempty"`

	// The expression that must be satisfied by the properties of a bare metal server provisioned using the image data in
	// this snapshot.
	//
	// If unspecified, the expression will be set to `true`.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variable is supported, corresponding
	// to the `BareMetalServer` property:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled.
	BareMetalServer *string `json:"bare_metal_server,omitempty"`

	// The expression that must be satisfied by the properties of a virtual server instance provisioned using this
	// snapshot.
	//
	// If unspecified, the expression will be set to `true`.
	//
	// The expression follows [Common Expression Language](https://github.com/google/cel-spec/blob/master/doc/langdef.md),
	// but does not support built-in functions and macros. In addition, the following variables are supported,
	// corresponding to `Instance` properties:
	// - `enable_secure_boot` (boolean): Indicates whether secure boot is enabled
	// - `gpu.count` (integer): The number of GPUs
	// - `gpu.manufacturer` (string): The GPU manufacturer
	// - `gpu.memory` (integer): The overall amount of GPU memory in GiB (gibibytes)
	// - `gpu.model` (string): The GPU model.
	Instance *string `json:"instance,omitempty"`
}

// UnmarshalSnapshotAllowedUsePrototype unmarshals an instance of SnapshotAllowedUsePrototype from the specified map of raw messages.
func UnmarshalSnapshotAllowedUsePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotAllowedUsePrototype)
	err = core.UnmarshalPrimitive(m, "api_version", &obj.ApiVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "api_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "bare_metal_server", &obj.BareMetalServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "bare_metal_server-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "instance", &obj.Instance)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotCatalogOffering : SnapshotCatalogOffering struct
type SnapshotCatalogOffering struct {
	// The billing plan associated with the catalog offering version.
	//
	// If absent, no billing plan is associated with the catalog offering version
	// (free).
	Plan *CatalogOfferingVersionPlanReference `json:"plan,omitempty"`

	// The [catalog](https://cloud.ibm.com/docs/account?topic=account-restrict-by-user)
	// offering version contained in this snapshot.
	Version *CatalogOfferingVersionReference `json:"version" validate:"required"`
}

// UnmarshalSnapshotCatalogOffering unmarshals an instance of SnapshotCatalogOffering from the specified map of raw messages.
func UnmarshalSnapshotCatalogOffering(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotCatalogOffering)
	err = core.UnmarshalModel(m, "plan", &obj.Plan, UnmarshalCatalogOfferingVersionPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "version", &obj.Version, UnmarshalCatalogOfferingVersionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "version-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotClone : SnapshotClone struct
type SnapshotClone struct {
	// Indicates whether this snapshot clone is available for use.
	Available *bool `json:"available" validate:"required"`

	// The date and time that this snapshot clone was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The zone this snapshot clone resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// UnmarshalSnapshotClone unmarshals an instance of SnapshotClone from the specified map of raw messages.
func UnmarshalSnapshotClone(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotClone)
	err = core.UnmarshalPrimitive(m, "available", &obj.Available)
	if err != nil {
		err = core.SDKErrorf(err, "", "available-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotCloneCollection : SnapshotCloneCollection struct
type SnapshotCloneCollection struct {
	// The clones for the snapshot.
	Clones []SnapshotClone `json:"clones" validate:"required"`
}

// UnmarshalSnapshotCloneCollection unmarshals an instance of SnapshotCloneCollection from the specified map of raw messages.
func UnmarshalSnapshotCloneCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotCloneCollection)
	err = core.UnmarshalModel(m, "clones", &obj.Clones, UnmarshalSnapshotClone)
	if err != nil {
		err = core.SDKErrorf(err, "", "clones-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotClonePrototype : SnapshotClonePrototype struct
type SnapshotClonePrototype struct {
	// The zone this snapshot clone will reside in. Must be in the same region as the
	// snapshot.
	Zone ZoneIdentityIntf `json:"zone" validate:"required"`
}

// NewSnapshotClonePrototype : Instantiate SnapshotClonePrototype (Generic Model Constructor)
func (*VpcV1) NewSnapshotClonePrototype(zone ZoneIdentityIntf) (_model *SnapshotClonePrototype, err error) {
	_model = &SnapshotClonePrototype{
		Zone: zone,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalSnapshotClonePrototype unmarshals an instance of SnapshotClonePrototype from the specified map of raw messages.
func UnmarshalSnapshotClonePrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotClonePrototype)
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotCollection : SnapshotCollection struct
type SnapshotCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of snapshots.
	Snapshots []Snapshot `json:"snapshots" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalSnapshotCollection unmarshals an instance of SnapshotCollection from the specified map of raw messages.
func UnmarshalSnapshotCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "snapshots", &obj.Snapshots, UnmarshalSnapshot)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshots-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *SnapshotCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// SnapshotConsistencyGroup : SnapshotConsistencyGroup struct
type SnapshotConsistencyGroup struct {
	// If present, the backup policy plan which created this snapshot consistency group.
	BackupPolicyPlan *BackupPolicyPlanReference `json:"backup_policy_plan,omitempty"`

	// The date and time that this snapshot consistency group was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN of this snapshot consistency group.
	CRN *string `json:"crn" validate:"required"`

	// Indicates whether deleting the snapshot consistency group will also delete the snapshots in the group.
	DeleteSnapshotsOnDelete *bool `json:"delete_snapshots_on_delete" validate:"required"`

	// The URL for this snapshot consistency group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this snapshot consistency group.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of this snapshot consistency group.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this snapshot consistency group. The name is unique across all snapshot consistency groups in the
	// region.
	Name *string `json:"name" validate:"required"`

	// The resource group for this snapshot consistency group.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The [service tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this snapshot consistency
	// group. Each tag is prefixed with
	// [is.instance:](https://cloud.ibm.com/docs/vpc?topic=vpc-snapshots-vpc-faqs).
	ServiceTags []string `json:"service_tags" validate:"required"`

	// The member snapshots that are data-consistent with respect to captured time. (may be
	// [deleted](https://cloud.ibm.com/apidocs/vpc#deleted-resources)).
	Snapshots []SnapshotReference `json:"snapshots" validate:"required"`
}

// Constants associated with the SnapshotConsistencyGroup.LifecycleState property.
// The lifecycle state of this snapshot consistency group.
const (
	SnapshotConsistencyGroupLifecycleStateDeletingConst  = "deleting"
	SnapshotConsistencyGroupLifecycleStateFailedConst    = "failed"
	SnapshotConsistencyGroupLifecycleStatePendingConst   = "pending"
	SnapshotConsistencyGroupLifecycleStateStableConst    = "stable"
	SnapshotConsistencyGroupLifecycleStateSuspendedConst = "suspended"
	SnapshotConsistencyGroupLifecycleStateUpdatingConst  = "updating"
	SnapshotConsistencyGroupLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the SnapshotConsistencyGroup.ResourceType property.
// The resource type.
const (
	SnapshotConsistencyGroupResourceTypeSnapshotConsistencyGroupConst = "snapshot_consistency_group"
)

// UnmarshalSnapshotConsistencyGroup unmarshals an instance of SnapshotConsistencyGroup from the specified map of raw messages.
func UnmarshalSnapshotConsistencyGroup(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotConsistencyGroup)
	err = core.UnmarshalModel(m, "backup_policy_plan", &obj.BackupPolicyPlan, UnmarshalBackupPolicyPlanReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "backup_policy_plan-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "delete_snapshots_on_delete", &obj.DeleteSnapshotsOnDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_snapshots_on_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "service_tags", &obj.ServiceTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "service_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "snapshots", &obj.Snapshots, UnmarshalSnapshotReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshots-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotConsistencyGroupCollection : SnapshotConsistencyGroupCollection struct
type SnapshotConsistencyGroupCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of snapshot consistency groups.
	SnapshotConsistencyGroups []SnapshotConsistencyGroup `json:"snapshot_consistency_groups" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalSnapshotConsistencyGroupCollection unmarshals an instance of SnapshotConsistencyGroupCollection from the specified map of raw messages.
func UnmarshalSnapshotConsistencyGroupCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotConsistencyGroupCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "snapshot_consistency_groups", &obj.SnapshotConsistencyGroups, UnmarshalSnapshotConsistencyGroup)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshot_consistency_groups-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *SnapshotConsistencyGroupCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// SnapshotConsistencyGroupPatch : SnapshotConsistencyGroupPatch struct
type SnapshotConsistencyGroupPatch struct {
	// Indicates whether deleting the snapshot consistency group will also delete the snapshots in the group.
	DeleteSnapshotsOnDelete *bool `json:"delete_snapshots_on_delete,omitempty"`

	// The name for this snapshot consistency group. The name must not be used by another snapshot consistency groups in
	// the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalSnapshotConsistencyGroupPatch unmarshals an instance of SnapshotConsistencyGroupPatch from the specified map of raw messages.
func UnmarshalSnapshotConsistencyGroupPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotConsistencyGroupPatch)
	err = core.UnmarshalPrimitive(m, "delete_snapshots_on_delete", &obj.DeleteSnapshotsOnDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_snapshots_on_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the SnapshotConsistencyGroupPatch
func (snapshotConsistencyGroupPatch *SnapshotConsistencyGroupPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(snapshotConsistencyGroupPatch.DeleteSnapshotsOnDelete) {
		_patch["delete_snapshots_on_delete"] = snapshotConsistencyGroupPatch.DeleteSnapshotsOnDelete
	}
	if !core.IsNil(snapshotConsistencyGroupPatch.Name) {
		_patch["name"] = snapshotConsistencyGroupPatch.Name
	}

	return
}

// SnapshotConsistencyGroupPrototype : SnapshotConsistencyGroupPrototype struct
// Models which "extend" this model:
// - SnapshotConsistencyGroupPrototypeSnapshotConsistencyGroupBySnapshots
type SnapshotConsistencyGroupPrototype struct {
	// Indicates whether deleting the snapshot consistency group will also delete the snapshots in the group.
	DeleteSnapshotsOnDelete *bool `json:"delete_snapshots_on_delete,omitempty"`

	// The name for this snapshot consistency group. The name must be unique across all snapshot consistency groups in the
	// region.
	//
	// If unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The data-consistent member snapshots to create.  All snapshots must specify a
	// `source_volume` attached to the same virtual server instance.
	Snapshots []SnapshotPrototypeSnapshotConsistencyGroupContext `json:"snapshots,omitempty"`
}

func (*SnapshotConsistencyGroupPrototype) isaSnapshotConsistencyGroupPrototype() bool {
	return true
}

type SnapshotConsistencyGroupPrototypeIntf interface {
	isaSnapshotConsistencyGroupPrototype() bool
}

// UnmarshalSnapshotConsistencyGroupPrototype unmarshals an instance of SnapshotConsistencyGroupPrototype from the specified map of raw messages.
func UnmarshalSnapshotConsistencyGroupPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotConsistencyGroupPrototype)
	err = core.UnmarshalPrimitive(m, "delete_snapshots_on_delete", &obj.DeleteSnapshotsOnDelete)
	if err != nil {
		err = core.SDKErrorf(err, "", "delete_snapshots_on_delete-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "snapshots", &obj.Snapshots, UnmarshalSnapshotPrototypeSnapshotConsistencyGroupContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "snapshots-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotConsistencyGroupReference : SnapshotConsistencyGroupReference struct
type SnapshotConsistencyGroupReference struct {
	// The CRN of this snapshot consistency group.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this snapshot consistency group.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this snapshot consistency group.
	ID *string `json:"id" validate:"required"`

	// The name for this snapshot consistency group. The name is unique across all snapshot consistency groups in the
	// region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the SnapshotConsistencyGroupReference.ResourceType property.
// The resource type.
const (
	SnapshotConsistencyGroupReferenceResourceTypeSnapshotConsistencyGroupConst = "snapshot_consistency_group"
)

// UnmarshalSnapshotConsistencyGroupReference unmarshals an instance of SnapshotConsistencyGroupReference from the specified map of raw messages.
func UnmarshalSnapshotConsistencyGroupReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotConsistencyGroupReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotCopiesItem : SnapshotCopiesItem struct
type SnapshotCopiesItem struct {
	// The CRN for the copied snapshot.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for the copied snapshot.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for the copied snapshot.
	ID *string `json:"id" validate:"required"`

	// The name for the copied snapshot.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *SnapshotRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the SnapshotCopiesItem.ResourceType property.
// The resource type.
const (
	SnapshotCopiesItemResourceTypeSnapshotConst = "snapshot"
)

// UnmarshalSnapshotCopiesItem unmarshals an instance of SnapshotCopiesItem from the specified map of raw messages.
func UnmarshalSnapshotCopiesItem(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotCopiesItem)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalSnapshotRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotIdentity : Identifies a snapshot by a unique property.
// Models which "extend" this model:
// - SnapshotIdentityByID
// - SnapshotIdentityByCRN
// - SnapshotIdentityByHref
type SnapshotIdentity struct {
	// The unique identifier for this snapshot.
	ID *string `json:"id,omitempty"`

	// The CRN of this snapshot.
	CRN *string `json:"crn,omitempty"`

	// The URL for this snapshot.
	Href *string `json:"href,omitempty"`
}

func (*SnapshotIdentity) isaSnapshotIdentity() bool {
	return true
}

type SnapshotIdentityIntf interface {
	isaSnapshotIdentity() bool
}

// UnmarshalSnapshotIdentity unmarshals an instance of SnapshotIdentity from the specified map of raw messages.
func UnmarshalSnapshotIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotInstanceProfileCollection : SnapshotInstanceProfileCollection struct
type SnapshotInstanceProfileCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// A page of instance profiles compatible with the snapshot.
	InstanceProfiles []InstanceProfileReference `json:"instance_profiles" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalSnapshotInstanceProfileCollection unmarshals an instance of SnapshotInstanceProfileCollection from the specified map of raw messages.
func UnmarshalSnapshotInstanceProfileCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotInstanceProfileCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "instance_profiles", &obj.InstanceProfiles, UnmarshalInstanceProfileReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "instance_profiles-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *SnapshotInstanceProfileCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// SnapshotPatch : SnapshotPatch struct
type SnapshotPatch struct {
	// The usage constraints to be matched against the requested instance properties to
	// determine compatibility. While bare metal servers cannot be provisioned from snapshots,
	// an image or volume created from this snapshot will inherit its `allowed_use` value.
	//
	// Can only be specified for bootable snapshots.
	AllowedUse *SnapshotAllowedUsePatch `json:"allowed_use,omitempty"`

	// The name for this snapshot. The name must not be used by another snapshot in the region.
	Name *string `json:"name,omitempty"`

	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this snapshot.
	UserTags []string `json:"user_tags,omitempty"`
}

// UnmarshalSnapshotPatch unmarshals an instance of SnapshotPatch from the specified map of raw messages.
func UnmarshalSnapshotPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotPatch)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalSnapshotAllowedUsePatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the SnapshotPatch
func (snapshotPatch *SnapshotPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(snapshotPatch.AllowedUse) {
		_patch["allowed_use"] = snapshotPatch.AllowedUse.asPatch()
	}
	if !core.IsNil(snapshotPatch.Name) {
		_patch["name"] = snapshotPatch.Name
	}
	if !core.IsNil(snapshotPatch.UserTags) {
		_patch["user_tags"] = snapshotPatch.UserTags
	}

	return
}

// SnapshotPrototype : SnapshotPrototype struct
// Models which "extend" this model:
// - SnapshotPrototypeSnapshotBySourceVolume
// - SnapshotPrototypeSnapshotBySourceSnapshot
type SnapshotPrototype struct {
	// The usage constraints to match against the requested instance or bare metal server
	// properties to determine compatibility.
	//
	// Can only be specified for bootable snapshots.
	AllowedUse *SnapshotAllowedUsePrototype `json:"allowed_use,omitempty"`

	// The clones to create for this snapshot.
	Clones []SnapshotClonePrototype `json:"clones,omitempty"`

	// The name for this snapshot. The name must not be used by another snapshot in the region. If unspecified, the name
	// will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this snapshot.
	UserTags []string `json:"user_tags,omitempty"`

	// The volume to create this snapshot from.
	SourceVolume VolumeIdentityIntf `json:"source_volume,omitempty"`

	// The root key to use to wrap the data encryption key for this snapshot.
	//
	// A key must be specified if and only if the source snapshot has an `encryption` type of
	// `user_managed`. To maximize snapshot availability and sharing of snapshot data, specify
	// a key in the same region as the new snapshot, and use the same encryption key for all
	// snapshots using the same source volume.
	//
	// The specified key may be in a different account, subject to IAM policies.
	EncryptionKey EncryptionKeyIdentityIntf `json:"encryption_key,omitempty"`

	// The source snapshot (in another region) to create this snapshot from.
	// The specified snapshot must not already be the source of another snapshot in this
	// region.
	SourceSnapshot *SnapshotIdentityByCRN `json:"source_snapshot,omitempty"`
}

func (*SnapshotPrototype) isaSnapshotPrototype() bool {
	return true
}

type SnapshotPrototypeIntf interface {
	isaSnapshotPrototype() bool
}

// UnmarshalSnapshotPrototype unmarshals an instance of SnapshotPrototype from the specified map of raw messages.
func UnmarshalSnapshotPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotPrototype)
	err = core.UnmarshalModel(m, "allowed_use", &obj.AllowedUse, UnmarshalSnapshotAllowedUsePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "allowed_use-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "clones", &obj.Clones, UnmarshalSnapshotClonePrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "clones-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_volume", &obj.SourceVolume, UnmarshalVolumeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_volume-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "encryption_key", &obj.EncryptionKey, UnmarshalEncryptionKeyIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "encryption_key-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_snapshot", &obj.SourceSnapshot, UnmarshalSnapshotIdentityByCRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_snapshot-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotPrototypeSnapshotConsistencyGroupContext : SnapshotPrototypeSnapshotConsistencyGroupContext struct
type SnapshotPrototypeSnapshotConsistencyGroupContext struct {
	// The name for this snapshot. The name must not be used by another snapshot in the region. If unspecified, the name
	// will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The volume to create this snapshot from.
	SourceVolume VolumeIdentityIntf `json:"source_volume" validate:"required"`

	// The [user tags](https://cloud.ibm.com/apidocs/tagging#types-of-tags) associated with this snapshot.
	UserTags []string `json:"user_tags,omitempty"`
}

// NewSnapshotPrototypeSnapshotConsistencyGroupContext : Instantiate SnapshotPrototypeSnapshotConsistencyGroupContext (Generic Model Constructor)
func (*VpcV1) NewSnapshotPrototypeSnapshotConsistencyGroupContext(sourceVolume VolumeIdentityIntf) (_model *SnapshotPrototypeSnapshotConsistencyGroupContext, err error) {
	_model = &SnapshotPrototypeSnapshotConsistencyGroupContext{
		SourceVolume: sourceVolume,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalSnapshotPrototypeSnapshotConsistencyGroupContext unmarshals an instance of SnapshotPrototypeSnapshotConsistencyGroupContext from the specified map of raw messages.
func UnmarshalSnapshotPrototypeSnapshotConsistencyGroupContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotPrototypeSnapshotConsistencyGroupContext)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "source_volume", &obj.SourceVolume, UnmarshalVolumeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "source_volume-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "user_tags", &obj.UserTags)
	if err != nil {
		err = core.SDKErrorf(err, "", "user_tags-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotReference : SnapshotReference struct
type SnapshotReference struct {
	// The CRN of this snapshot.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this snapshot.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this snapshot.
	ID *string `json:"id" validate:"required"`

	// The name for this snapshot. The name is unique across all snapshots in the region.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *SnapshotRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the SnapshotReference.ResourceType property.
// The resource type.
const (
	SnapshotReferenceResourceTypeSnapshotConst = "snapshot"
)

// UnmarshalSnapshotReference unmarshals an instance of SnapshotReference from the specified map of raw messages.
func UnmarshalSnapshotReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalSnapshotRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type SnapshotRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`

	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalSnapshotRemote unmarshals an instance of SnapshotRemote from the specified map of raw messages.
func UnmarshalSnapshotRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotRemote)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SnapshotSourceSnapshot : If present, the source snapshot this snapshot was created from.
type SnapshotSourceSnapshot struct {
	// The CRN of the source snapshot.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for the source snapshot.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for the source snapshot.
	ID *string `json:"id" validate:"required"`

	// The name for the source snapshot. The name is unique across all snapshots in the source snapshot's native region.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *SnapshotRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the SnapshotSourceSnapshot.ResourceType property.
// The resource type.
const (
	SnapshotSourceSnapshotResourceTypeSnapshotConst = "snapshot"
)

// UnmarshalSnapshotSourceSnapshot unmarshals an instance of SnapshotSourceSnapshot from the specified map of raw messages.
func UnmarshalSnapshotSourceSnapshot(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SnapshotSourceSnapshot)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalSnapshotRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// StartBareMetalServerOptions : The StartBareMetalServer options.
type StartBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewStartBareMetalServerOptions : Instantiate StartBareMetalServerOptions
func (*VpcV1) NewStartBareMetalServerOptions(id string) *StartBareMetalServerOptions {
	return &StartBareMetalServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *StartBareMetalServerOptions) SetID(id string) *StartBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *StartBareMetalServerOptions) SetHeaders(param map[string]string) *StartBareMetalServerOptions {
	options.Headers = param
	return options
}

// StopBareMetalServerOptions : The StopBareMetalServer options.
type StopBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The type of stop operation:
	// - `soft`: signal running operating system to quiesce and shutdown cleanly
	// - `hard`: immediately stop the server.
	Type *string `json:"type" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// Constants associated with the StopBareMetalServerOptions.Type property.
// The type of stop operation:
// - `soft`: signal running operating system to quiesce and shutdown cleanly
// - `hard`: immediately stop the server.
const (
	StopBareMetalServerOptionsTypeHardConst = "hard"
	StopBareMetalServerOptionsTypeSoftConst = "soft"
)

// NewStopBareMetalServerOptions : Instantiate StopBareMetalServerOptions
func (*VpcV1) NewStopBareMetalServerOptions(id string, typeVar string) *StopBareMetalServerOptions {
	return &StopBareMetalServerOptions{
		ID:   core.StringPtr(id),
		Type: core.StringPtr(typeVar),
	}
}

// SetID : Allow user to set ID
func (_options *StopBareMetalServerOptions) SetID(id string) *StopBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetType : Allow user to set Type
func (_options *StopBareMetalServerOptions) SetType(typeVar string) *StopBareMetalServerOptions {
	_options.Type = core.StringPtr(typeVar)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *StopBareMetalServerOptions) SetHeaders(param map[string]string) *StopBareMetalServerOptions {
	options.Headers = param
	return options
}

// Subnet : Subnet struct
type Subnet struct {
	// The number of IPv4 addresses in this subnet that are not in-use, and have not been reserved by the user or the
	// provider.
	AvailableIpv4AddressCount *int64 `json:"available_ipv4_address_count" validate:"required"`

	// The date and time that the subnet was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this subnet.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this subnet.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this subnet.
	ID *string `json:"id" validate:"required"`

	// The IP version(s) supported by this subnet.
	IPVersion *string `json:"ip_version" validate:"required"`

	// The IPv4 range of the subnet, expressed in CIDR format.
	Ipv4CIDRBlock *string `json:"ipv4_cidr_block" validate:"required"`

	// The name for this subnet. The name is unique across all subnets in the VPC.
	Name *string `json:"name" validate:"required"`

	// The network ACL for this subnet.
	NetworkACL *NetworkACLReference `json:"network_acl" validate:"required"`

	// The public gateway to use for internet-bound traffic for this subnet.
	PublicGateway *PublicGatewayReference `json:"public_gateway,omitempty"`

	// The resource group for this subnet.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The routing table for this subnet.
	RoutingTable *RoutingTableReference `json:"routing_table" validate:"required"`

	// The status of the subnet.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The total number of IPv4 addresses in this subnet.
	//
	// Note: This is calculated as 2<sup>(32 - prefix length)</sup>. For example, the prefix length `/24` gives:<br>
	// 2<sup>(32 - 24)</sup> = 2<sup>8</sup> = 256 addresses.
	TotalIpv4AddressCount *int64 `json:"total_ipv4_address_count" validate:"required"`

	// The VPC this subnet resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The zone this subnet resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// Constants associated with the Subnet.IPVersion property.
// The IP version(s) supported by this subnet.
const (
	SubnetIPVersionIpv4Const = "ipv4"
)

// Constants associated with the Subnet.ResourceType property.
// The resource type.
const (
	SubnetResourceTypeSubnetConst = "subnet"
)

// Constants associated with the Subnet.Status property.
// The status of the subnet.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	SubnetStatusAvailableConst = "available"
	SubnetStatusDeletingConst  = "deleting"
	SubnetStatusFailedConst    = "failed"
	SubnetStatusPendingConst   = "pending"
)

// UnmarshalSubnet unmarshals an instance of Subnet from the specified map of raw messages.
func UnmarshalSubnet(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Subnet)
	err = core.UnmarshalPrimitive(m, "available_ipv4_address_count", &obj.AvailableIpv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "available_ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ipv4_cidr_block", &obj.Ipv4CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipv4_cidr_block-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_acl", &obj.NetworkACL, UnmarshalNetworkACLReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_acl-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_gateway", &obj.PublicGateway, UnmarshalPublicGatewayReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_gateway-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routing_table", &obj.RoutingTable, UnmarshalRoutingTableReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "routing_table-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_ipv4_address_count", &obj.TotalIpv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SubnetCollection : SubnetCollection struct
type SubnetCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// A page of subnets.
	Subnets []Subnet `json:"subnets" validate:"required"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalSubnetCollection unmarshals an instance of SubnetCollection from the specified map of raw messages.
func UnmarshalSubnetCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SubnetCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnets", &obj.Subnets, UnmarshalSubnet)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnets-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *SubnetCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// SubnetIdentity : Identifies a subnet by a unique property.
// Models which "extend" this model:
// - SubnetIdentityByID
// - SubnetIdentityByCRN
// - SubnetIdentityByHref
type SubnetIdentity struct {
	// The unique identifier for this subnet.
	ID *string `json:"id,omitempty"`

	// The CRN for this subnet.
	CRN *string `json:"crn,omitempty"`

	// The URL for this subnet.
	Href *string `json:"href,omitempty"`
}

func (*SubnetIdentity) isaSubnetIdentity() bool {
	return true
}

type SubnetIdentityIntf interface {
	isaSubnetIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalSubnetIdentity unmarshals an instance of SubnetIdentity from the specified map of raw messages.
func UnmarshalSubnetIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SubnetIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the SubnetIdentity
func (subnetIdentity *SubnetIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(subnetIdentity.ID) {
		_patch["id"] = subnetIdentity.ID
	}
	if !core.IsNil(subnetIdentity.CRN) {
		_patch["crn"] = subnetIdentity.CRN
	}
	if !core.IsNil(subnetIdentity.Href) {
		_patch["href"] = subnetIdentity.Href
	}

	return
}

// SubnetPatch : SubnetPatch struct
type SubnetPatch struct {
	// The name for this subnet. The name must not be used by another subnet in the VPC.
	Name *string `json:"name,omitempty"`

	// The network ACL to use for this subnet.
	NetworkACL NetworkACLIdentityIntf `json:"network_acl,omitempty"`

	// The public gateway to use for internet-bound traffic for this subnet.
	PublicGateway SubnetPublicGatewayPatchIntf `json:"public_gateway,omitempty"`

	// The routing table to use for this subnet.  The routing table properties
	// `route_direct_link_ingress`, `route_internet_ingress`,
	// `route_transit_gateway_ingress`, and `route_vpc_zone_ingress` must be `false`.
	RoutingTable RoutingTableIdentityIntf `json:"routing_table,omitempty"`
}

// UnmarshalSubnetPatch unmarshals an instance of SubnetPatch from the specified map of raw messages.
func UnmarshalSubnetPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SubnetPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_acl", &obj.NetworkACL, UnmarshalNetworkACLIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_acl-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_gateway", &obj.PublicGateway, UnmarshalSubnetPublicGatewayPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_gateway-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routing_table", &obj.RoutingTable, UnmarshalRoutingTableIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "routing_table-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the SubnetPatch
func (subnetPatch *SubnetPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(subnetPatch.Name) {
		_patch["name"] = subnetPatch.Name
	}
	if !core.IsNil(subnetPatch.NetworkACL) {
		_patch["network_acl"] = subnetPatch.NetworkACL.asPatch()
	}
	if !core.IsNil(subnetPatch.PublicGateway) {
		_patch["public_gateway"] = subnetPatch.PublicGateway.asPatch()
	}
	if !core.IsNil(subnetPatch.RoutingTable) {
		_patch["routing_table"] = subnetPatch.RoutingTable.asPatch()
	}

	return
}

// SubnetPrototype : SubnetPrototype struct
// Models which "extend" this model:
// - SubnetPrototypeSubnetByTotalCount
// - SubnetPrototypeSubnetByCIDR
type SubnetPrototype struct {
	// The IP version(s) to support for this subnet.
	IPVersion *string `json:"ip_version,omitempty"`

	// The name for this subnet. The name must not be used by another subnet in the VPC. If unspecified, the name will be a
	// hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The network ACL to use for this subnet.
	NetworkACL NetworkACLIdentityIntf `json:"network_acl,omitempty"`

	// The public gateway to use for internet-bound traffic for this subnet. If
	// unspecified, the subnet will not be attached to a public gateway.
	PublicGateway PublicGatewayIdentityIntf `json:"public_gateway,omitempty"`

	// The resource group to use. If unspecified, the account's [default resource
	// group](https://cloud.ibm.com/apidocs/resource-manager#introduction) will be used.
	ResourceGroup ResourceGroupIdentityIntf `json:"resource_group,omitempty"`

	// The routing table to use for this subnet. If unspecified, the default routing table
	// for the VPC is used. The routing table properties `route_direct_link_ingress`,
	// `route_internet_ingress`, `route_transit_gateway_ingress`, and
	// `route_vpc_zone_ingress` must be `false`.
	RoutingTable RoutingTableIdentityIntf `json:"routing_table,omitempty"`

	// The VPC the subnet will reside in.
	VPC VPCIdentityIntf `json:"vpc" validate:"required"`

	// The total number of IPv4 addresses required. Must be a power of 2. The VPC must have a default address prefix in the
	// specified zone, and that prefix must have a free CIDR range with at least this number of addresses.
	TotalIpv4AddressCount *int64 `json:"total_ipv4_address_count,omitempty"`

	// The zone this subnet will reside in.
	Zone ZoneIdentityIntf `json:"zone,omitempty"`

	// The IPv4 range of the subnet, expressed in CIDR format. The prefix length of the subnet's CIDR must be between `/9`
	// (8,388,608 addresses) and `/29` (8 addresses). The IPv4 range of the subnet's CIDR must fall within an existing
	// address prefix in the VPC and must not overlap with any existing subnet. The subnet will be created in the zone of
	// the address prefix that contains the IPv4 CIDR. If zone is specified, it must match the zone of the address prefix
	// that contains the subnet's IPv4 CIDR.
	Ipv4CIDRBlock *string `json:"ipv4_cidr_block,omitempty"`
}

// Constants associated with the SubnetPrototype.IPVersion property.
// The IP version(s) to support for this subnet.
const (
	SubnetPrototypeIPVersionIpv4Const = "ipv4"
)

func (*SubnetPrototype) isaSubnetPrototype() bool {
	return true
}

type SubnetPrototypeIntf interface {
	isaSubnetPrototype() bool
}

// UnmarshalSubnetPrototype unmarshals an instance of SubnetPrototype from the specified map of raw messages.
func UnmarshalSubnetPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SubnetPrototype)
	err = core.UnmarshalPrimitive(m, "ip_version", &obj.IPVersion)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip_version-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "network_acl", &obj.NetworkACL, UnmarshalNetworkACLIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "network_acl-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_gateway", &obj.PublicGateway, UnmarshalPublicGatewayIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_gateway-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "routing_table", &obj.RoutingTable, UnmarshalRoutingTableIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "routing_table-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_ipv4_address_count", &obj.TotalIpv4AddressCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_ipv4_address_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "ipv4_cidr_block", &obj.Ipv4CIDRBlock)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipv4_cidr_block-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// SubnetPublicGatewayPatch : The public gateway to use for internet-bound traffic for this subnet.
// Models which "extend" this model:
// - SubnetPublicGatewayPatchPublicGatewayIdentityByID
// - SubnetPublicGatewayPatchPublicGatewayIdentityByCRN
// - SubnetPublicGatewayPatchPublicGatewayIdentityByHref
type SubnetPublicGatewayPatch struct {
	// The unique identifier for this public gateway.
	ID *string `json:"id,omitempty"`

	// The CRN for this public gateway.
	CRN *string `json:"crn,omitempty"`

	// The URL for this public gateway.
	Href *string `json:"href,omitempty"`
}

func (*SubnetPublicGatewayPatch) isaSubnetPublicGatewayPatch() bool {
	return true
}

type SubnetPublicGatewayPatchIntf interface {
	isaSubnetPublicGatewayPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalSubnetPublicGatewayPatch unmarshals an instance of SubnetPublicGatewayPatch from the specified map of raw messages.
func UnmarshalSubnetPublicGatewayPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SubnetPublicGatewayPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the SubnetPublicGatewayPatch
func (subnetPublicGatewayPatch *SubnetPublicGatewayPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(subnetPublicGatewayPatch.ID) {
		_patch["id"] = subnetPublicGatewayPatch.ID
	}
	if !core.IsNil(subnetPublicGatewayPatch.CRN) {
		_patch["crn"] = subnetPublicGatewayPatch.CRN
	}
	if !core.IsNil(subnetPublicGatewayPatch.Href) {
		_patch["href"] = subnetPublicGatewayPatch.Href
	}

	return
}

// SubnetReference : SubnetReference struct
type SubnetReference struct {
	// The CRN for this subnet.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this subnet.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this subnet.
	ID *string `json:"id" validate:"required"`

	// The name for this subnet. The name is unique across all subnets in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the SubnetReference.ResourceType property.
// The resource type.
const (
	SubnetReferenceResourceTypeSubnetConst = "subnet"
)

// UnmarshalSubnetReference unmarshals an instance of SubnetReference from the specified map of raw messages.
func UnmarshalSubnetReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(SubnetReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// TrustedProfileIdentity : Identifies a trusted profile by a unique property.
// Models which "extend" this model:
// - TrustedProfileIdentityByID
// - TrustedProfileIdentityByCRN
type TrustedProfileIdentity struct {
	// The unique identifier for this trusted profile.
	ID *string `json:"id,omitempty"`

	// The CRN for this trusted profile.
	CRN *string `json:"crn,omitempty"`
}

func (*TrustedProfileIdentity) isaTrustedProfileIdentity() bool {
	return true
}

type TrustedProfileIdentityIntf interface {
	isaTrustedProfileIdentity() bool
}

// UnmarshalTrustedProfileIdentity unmarshals an instance of TrustedProfileIdentity from the specified map of raw messages.
func UnmarshalTrustedProfileIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(TrustedProfileIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// TrustedProfileReference : TrustedProfileReference struct
type TrustedProfileReference struct {
	// The CRN for this trusted profile.
	CRN *string `json:"crn" validate:"required"`

	// The unique identifier for this trusted profile.
	ID *string `json:"id" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the TrustedProfileReference.ResourceType property.
// The resource type.
const (
	TrustedProfileReferenceResourceTypeTrustedProfileConst = "trusted_profile"
)

// UnmarshalTrustedProfileReference unmarshals an instance of TrustedProfileReference from the specified map of raw messages.
func UnmarshalTrustedProfileReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(TrustedProfileReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// UnpublishPrivatePathServiceGatewayOptions : The UnpublishPrivatePathServiceGateway options.
type UnpublishPrivatePathServiceGatewayOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUnpublishPrivatePathServiceGatewayOptions : Instantiate UnpublishPrivatePathServiceGatewayOptions
func (*VpcV1) NewUnpublishPrivatePathServiceGatewayOptions(privatePathServiceGatewayID string) *UnpublishPrivatePathServiceGatewayOptions {
	return &UnpublishPrivatePathServiceGatewayOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *UnpublishPrivatePathServiceGatewayOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *UnpublishPrivatePathServiceGatewayOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UnpublishPrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *UnpublishPrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// UnsetSubnetPublicGatewayOptions : The UnsetSubnetPublicGateway options.
type UnsetSubnetPublicGatewayOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUnsetSubnetPublicGatewayOptions : Instantiate UnsetSubnetPublicGatewayOptions
func (*VpcV1) NewUnsetSubnetPublicGatewayOptions(id string) *UnsetSubnetPublicGatewayOptions {
	return &UnsetSubnetPublicGatewayOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *UnsetSubnetPublicGatewayOptions) SetID(id string) *UnsetSubnetPublicGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UnsetSubnetPublicGatewayOptions) SetHeaders(param map[string]string) *UnsetSubnetPublicGatewayOptions {
	options.Headers = param
	return options
}

// UpdateBackupPolicyOptions : The UpdateBackupPolicy options.
type UpdateBackupPolicyOptions struct {
	// The backup policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The backup policy patch.
	BackupPolicyPatch map[string]interface{} `json:"BackupPolicy_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateBackupPolicyOptions : Instantiate UpdateBackupPolicyOptions
func (*VpcV1) NewUpdateBackupPolicyOptions(id string, backupPolicyPatch map[string]interface{}) *UpdateBackupPolicyOptions {
	return &UpdateBackupPolicyOptions{
		ID:                core.StringPtr(id),
		BackupPolicyPatch: backupPolicyPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateBackupPolicyOptions) SetID(id string) *UpdateBackupPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetBackupPolicyPatch : Allow user to set BackupPolicyPatch
func (_options *UpdateBackupPolicyOptions) SetBackupPolicyPatch(backupPolicyPatch map[string]interface{}) *UpdateBackupPolicyOptions {
	_options.BackupPolicyPatch = backupPolicyPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateBackupPolicyOptions) SetIfMatch(ifMatch string) *UpdateBackupPolicyOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateBackupPolicyOptions) SetHeaders(param map[string]string) *UpdateBackupPolicyOptions {
	options.Headers = param
	return options
}

// UpdateBackupPolicyPlanOptions : The UpdateBackupPolicyPlan options.
type UpdateBackupPolicyPlanOptions struct {
	// The backup policy identifier.
	BackupPolicyID *string `json:"backup_policy_id" validate:"required,ne="`

	// The backup policy plan identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The backup policy plan patch.
	BackupPolicyPlanPatch map[string]interface{} `json:"BackupPolicyPlan_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateBackupPolicyPlanOptions : Instantiate UpdateBackupPolicyPlanOptions
func (*VpcV1) NewUpdateBackupPolicyPlanOptions(backupPolicyID string, id string, backupPolicyPlanPatch map[string]interface{}) *UpdateBackupPolicyPlanOptions {
	return &UpdateBackupPolicyPlanOptions{
		BackupPolicyID:        core.StringPtr(backupPolicyID),
		ID:                    core.StringPtr(id),
		BackupPolicyPlanPatch: backupPolicyPlanPatch,
	}
}

// SetBackupPolicyID : Allow user to set BackupPolicyID
func (_options *UpdateBackupPolicyPlanOptions) SetBackupPolicyID(backupPolicyID string) *UpdateBackupPolicyPlanOptions {
	_options.BackupPolicyID = core.StringPtr(backupPolicyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateBackupPolicyPlanOptions) SetID(id string) *UpdateBackupPolicyPlanOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetBackupPolicyPlanPatch : Allow user to set BackupPolicyPlanPatch
func (_options *UpdateBackupPolicyPlanOptions) SetBackupPolicyPlanPatch(backupPolicyPlanPatch map[string]interface{}) *UpdateBackupPolicyPlanOptions {
	_options.BackupPolicyPlanPatch = backupPolicyPlanPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateBackupPolicyPlanOptions) SetIfMatch(ifMatch string) *UpdateBackupPolicyPlanOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateBackupPolicyPlanOptions) SetHeaders(param map[string]string) *UpdateBackupPolicyPlanOptions {
	options.Headers = param
	return options
}

// UpdateBareMetalServerDiskOptions : The UpdateBareMetalServerDisk options.
type UpdateBareMetalServerDiskOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server disk identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The bare metal server disk patch.
	BareMetalServerDiskPatch map[string]interface{} `json:"BareMetalServerDisk_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateBareMetalServerDiskOptions : Instantiate UpdateBareMetalServerDiskOptions
func (*VpcV1) NewUpdateBareMetalServerDiskOptions(bareMetalServerID string, id string, bareMetalServerDiskPatch map[string]interface{}) *UpdateBareMetalServerDiskOptions {
	return &UpdateBareMetalServerDiskOptions{
		BareMetalServerID:        core.StringPtr(bareMetalServerID),
		ID:                       core.StringPtr(id),
		BareMetalServerDiskPatch: bareMetalServerDiskPatch,
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *UpdateBareMetalServerDiskOptions) SetBareMetalServerID(bareMetalServerID string) *UpdateBareMetalServerDiskOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateBareMetalServerDiskOptions) SetID(id string) *UpdateBareMetalServerDiskOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetBareMetalServerDiskPatch : Allow user to set BareMetalServerDiskPatch
func (_options *UpdateBareMetalServerDiskOptions) SetBareMetalServerDiskPatch(bareMetalServerDiskPatch map[string]interface{}) *UpdateBareMetalServerDiskOptions {
	_options.BareMetalServerDiskPatch = bareMetalServerDiskPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateBareMetalServerDiskOptions) SetHeaders(param map[string]string) *UpdateBareMetalServerDiskOptions {
	options.Headers = param
	return options
}

// UpdateBareMetalServerNetworkAttachmentOptions : The UpdateBareMetalServerNetworkAttachment options.
type UpdateBareMetalServerNetworkAttachmentOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The bare metal server network attachment patch.
	BareMetalServerNetworkAttachmentPatch map[string]interface{} `json:"BareMetalServerNetworkAttachment_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateBareMetalServerNetworkAttachmentOptions : Instantiate UpdateBareMetalServerNetworkAttachmentOptions
func (*VpcV1) NewUpdateBareMetalServerNetworkAttachmentOptions(bareMetalServerID string, id string, bareMetalServerNetworkAttachmentPatch map[string]interface{}) *UpdateBareMetalServerNetworkAttachmentOptions {
	return &UpdateBareMetalServerNetworkAttachmentOptions{
		BareMetalServerID:                     core.StringPtr(bareMetalServerID),
		ID:                                    core.StringPtr(id),
		BareMetalServerNetworkAttachmentPatch: bareMetalServerNetworkAttachmentPatch,
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *UpdateBareMetalServerNetworkAttachmentOptions) SetBareMetalServerID(bareMetalServerID string) *UpdateBareMetalServerNetworkAttachmentOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateBareMetalServerNetworkAttachmentOptions) SetID(id string) *UpdateBareMetalServerNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetBareMetalServerNetworkAttachmentPatch : Allow user to set BareMetalServerNetworkAttachmentPatch
func (_options *UpdateBareMetalServerNetworkAttachmentOptions) SetBareMetalServerNetworkAttachmentPatch(bareMetalServerNetworkAttachmentPatch map[string]interface{}) *UpdateBareMetalServerNetworkAttachmentOptions {
	_options.BareMetalServerNetworkAttachmentPatch = bareMetalServerNetworkAttachmentPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateBareMetalServerNetworkAttachmentOptions) SetHeaders(param map[string]string) *UpdateBareMetalServerNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// UpdateBareMetalServerNetworkInterfaceOptions : The UpdateBareMetalServerNetworkInterface options.
type UpdateBareMetalServerNetworkInterfaceOptions struct {
	// The bare metal server identifier.
	BareMetalServerID *string `json:"bare_metal_server_id" validate:"required,ne="`

	// The bare metal server network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The bare metal server network interface patch.
	BareMetalServerNetworkInterfacePatch map[string]interface{} `json:"BareMetalServerNetworkInterface_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateBareMetalServerNetworkInterfaceOptions : Instantiate UpdateBareMetalServerNetworkInterfaceOptions
func (*VpcV1) NewUpdateBareMetalServerNetworkInterfaceOptions(bareMetalServerID string, id string, bareMetalServerNetworkInterfacePatch map[string]interface{}) *UpdateBareMetalServerNetworkInterfaceOptions {
	return &UpdateBareMetalServerNetworkInterfaceOptions{
		BareMetalServerID:                    core.StringPtr(bareMetalServerID),
		ID:                                   core.StringPtr(id),
		BareMetalServerNetworkInterfacePatch: bareMetalServerNetworkInterfacePatch,
	}
}

// SetBareMetalServerID : Allow user to set BareMetalServerID
func (_options *UpdateBareMetalServerNetworkInterfaceOptions) SetBareMetalServerID(bareMetalServerID string) *UpdateBareMetalServerNetworkInterfaceOptions {
	_options.BareMetalServerID = core.StringPtr(bareMetalServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateBareMetalServerNetworkInterfaceOptions) SetID(id string) *UpdateBareMetalServerNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetBareMetalServerNetworkInterfacePatch : Allow user to set BareMetalServerNetworkInterfacePatch
func (_options *UpdateBareMetalServerNetworkInterfaceOptions) SetBareMetalServerNetworkInterfacePatch(bareMetalServerNetworkInterfacePatch map[string]interface{}) *UpdateBareMetalServerNetworkInterfaceOptions {
	_options.BareMetalServerNetworkInterfacePatch = bareMetalServerNetworkInterfacePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateBareMetalServerNetworkInterfaceOptions) SetHeaders(param map[string]string) *UpdateBareMetalServerNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// UpdateBareMetalServerOptions : The UpdateBareMetalServer options.
type UpdateBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The bare metal server patch.
	BareMetalServerPatch map[string]interface{} `json:"BareMetalServer_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateBareMetalServerOptions : Instantiate UpdateBareMetalServerOptions
func (*VpcV1) NewUpdateBareMetalServerOptions(id string, bareMetalServerPatch map[string]interface{}) *UpdateBareMetalServerOptions {
	return &UpdateBareMetalServerOptions{
		ID:                   core.StringPtr(id),
		BareMetalServerPatch: bareMetalServerPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateBareMetalServerOptions) SetID(id string) *UpdateBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetBareMetalServerPatch : Allow user to set BareMetalServerPatch
func (_options *UpdateBareMetalServerOptions) SetBareMetalServerPatch(bareMetalServerPatch map[string]interface{}) *UpdateBareMetalServerOptions {
	_options.BareMetalServerPatch = bareMetalServerPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateBareMetalServerOptions) SetHeaders(param map[string]string) *UpdateBareMetalServerOptions {
	options.Headers = param
	return options
}

// UpdateClusterNetworkInterfaceOptions : The UpdateClusterNetworkInterface options.
type UpdateClusterNetworkInterfaceOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The cluster network interface patch.
	ClusterNetworkInterfacePatch map[string]interface{} `json:"ClusterNetworkInterface_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateClusterNetworkInterfaceOptions : Instantiate UpdateClusterNetworkInterfaceOptions
func (*VpcV1) NewUpdateClusterNetworkInterfaceOptions(clusterNetworkID string, id string, clusterNetworkInterfacePatch map[string]interface{}) *UpdateClusterNetworkInterfaceOptions {
	return &UpdateClusterNetworkInterfaceOptions{
		ClusterNetworkID:             core.StringPtr(clusterNetworkID),
		ID:                           core.StringPtr(id),
		ClusterNetworkInterfacePatch: clusterNetworkInterfacePatch,
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *UpdateClusterNetworkInterfaceOptions) SetClusterNetworkID(clusterNetworkID string) *UpdateClusterNetworkInterfaceOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateClusterNetworkInterfaceOptions) SetID(id string) *UpdateClusterNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetClusterNetworkInterfacePatch : Allow user to set ClusterNetworkInterfacePatch
func (_options *UpdateClusterNetworkInterfaceOptions) SetClusterNetworkInterfacePatch(clusterNetworkInterfacePatch map[string]interface{}) *UpdateClusterNetworkInterfaceOptions {
	_options.ClusterNetworkInterfacePatch = clusterNetworkInterfacePatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateClusterNetworkInterfaceOptions) SetIfMatch(ifMatch string) *UpdateClusterNetworkInterfaceOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateClusterNetworkInterfaceOptions) SetHeaders(param map[string]string) *UpdateClusterNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// UpdateClusterNetworkOptions : The UpdateClusterNetwork options.
type UpdateClusterNetworkOptions struct {
	// The cluster network identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The cluster network patch.
	ClusterNetworkPatch map[string]interface{} `json:"ClusterNetwork_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateClusterNetworkOptions : Instantiate UpdateClusterNetworkOptions
func (*VpcV1) NewUpdateClusterNetworkOptions(id string, clusterNetworkPatch map[string]interface{}) *UpdateClusterNetworkOptions {
	return &UpdateClusterNetworkOptions{
		ID:                  core.StringPtr(id),
		ClusterNetworkPatch: clusterNetworkPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateClusterNetworkOptions) SetID(id string) *UpdateClusterNetworkOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetClusterNetworkPatch : Allow user to set ClusterNetworkPatch
func (_options *UpdateClusterNetworkOptions) SetClusterNetworkPatch(clusterNetworkPatch map[string]interface{}) *UpdateClusterNetworkOptions {
	_options.ClusterNetworkPatch = clusterNetworkPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateClusterNetworkOptions) SetIfMatch(ifMatch string) *UpdateClusterNetworkOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateClusterNetworkOptions) SetHeaders(param map[string]string) *UpdateClusterNetworkOptions {
	options.Headers = param
	return options
}

// UpdateClusterNetworkSubnetOptions : The UpdateClusterNetworkSubnet options.
type UpdateClusterNetworkSubnetOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The cluster network subnet patch.
	ClusterNetworkSubnetPatch map[string]interface{} `json:"ClusterNetworkSubnet_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateClusterNetworkSubnetOptions : Instantiate UpdateClusterNetworkSubnetOptions
func (*VpcV1) NewUpdateClusterNetworkSubnetOptions(clusterNetworkID string, id string, clusterNetworkSubnetPatch map[string]interface{}) *UpdateClusterNetworkSubnetOptions {
	return &UpdateClusterNetworkSubnetOptions{
		ClusterNetworkID:          core.StringPtr(clusterNetworkID),
		ID:                        core.StringPtr(id),
		ClusterNetworkSubnetPatch: clusterNetworkSubnetPatch,
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *UpdateClusterNetworkSubnetOptions) SetClusterNetworkID(clusterNetworkID string) *UpdateClusterNetworkSubnetOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateClusterNetworkSubnetOptions) SetID(id string) *UpdateClusterNetworkSubnetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetClusterNetworkSubnetPatch : Allow user to set ClusterNetworkSubnetPatch
func (_options *UpdateClusterNetworkSubnetOptions) SetClusterNetworkSubnetPatch(clusterNetworkSubnetPatch map[string]interface{}) *UpdateClusterNetworkSubnetOptions {
	_options.ClusterNetworkSubnetPatch = clusterNetworkSubnetPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateClusterNetworkSubnetOptions) SetIfMatch(ifMatch string) *UpdateClusterNetworkSubnetOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateClusterNetworkSubnetOptions) SetHeaders(param map[string]string) *UpdateClusterNetworkSubnetOptions {
	options.Headers = param
	return options
}

// UpdateClusterNetworkSubnetReservedIPOptions : The UpdateClusterNetworkSubnetReservedIP options.
type UpdateClusterNetworkSubnetReservedIPOptions struct {
	// The cluster network identifier.
	ClusterNetworkID *string `json:"cluster_network_id" validate:"required,ne="`

	// The cluster network subnet identifier.
	ClusterNetworkSubnetID *string `json:"cluster_network_subnet_id" validate:"required,ne="`

	// The cluster network subnet reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The cluster network subnet reserved IP patch.
	ClusterNetworkSubnetReservedIPPatch map[string]interface{} `json:"ClusterNetworkSubnetReservedIP_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateClusterNetworkSubnetReservedIPOptions : Instantiate UpdateClusterNetworkSubnetReservedIPOptions
func (*VpcV1) NewUpdateClusterNetworkSubnetReservedIPOptions(clusterNetworkID string, clusterNetworkSubnetID string, id string, clusterNetworkSubnetReservedIPPatch map[string]interface{}) *UpdateClusterNetworkSubnetReservedIPOptions {
	return &UpdateClusterNetworkSubnetReservedIPOptions{
		ClusterNetworkID:                    core.StringPtr(clusterNetworkID),
		ClusterNetworkSubnetID:              core.StringPtr(clusterNetworkSubnetID),
		ID:                                  core.StringPtr(id),
		ClusterNetworkSubnetReservedIPPatch: clusterNetworkSubnetReservedIPPatch,
	}
}

// SetClusterNetworkID : Allow user to set ClusterNetworkID
func (_options *UpdateClusterNetworkSubnetReservedIPOptions) SetClusterNetworkID(clusterNetworkID string) *UpdateClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkID = core.StringPtr(clusterNetworkID)
	return _options
}

// SetClusterNetworkSubnetID : Allow user to set ClusterNetworkSubnetID
func (_options *UpdateClusterNetworkSubnetReservedIPOptions) SetClusterNetworkSubnetID(clusterNetworkSubnetID string) *UpdateClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkSubnetID = core.StringPtr(clusterNetworkSubnetID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateClusterNetworkSubnetReservedIPOptions) SetID(id string) *UpdateClusterNetworkSubnetReservedIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetClusterNetworkSubnetReservedIPPatch : Allow user to set ClusterNetworkSubnetReservedIPPatch
func (_options *UpdateClusterNetworkSubnetReservedIPOptions) SetClusterNetworkSubnetReservedIPPatch(clusterNetworkSubnetReservedIPPatch map[string]interface{}) *UpdateClusterNetworkSubnetReservedIPOptions {
	_options.ClusterNetworkSubnetReservedIPPatch = clusterNetworkSubnetReservedIPPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateClusterNetworkSubnetReservedIPOptions) SetIfMatch(ifMatch string) *UpdateClusterNetworkSubnetReservedIPOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateClusterNetworkSubnetReservedIPOptions) SetHeaders(param map[string]string) *UpdateClusterNetworkSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// UpdateDedicatedHostDiskOptions : The UpdateDedicatedHostDisk options.
type UpdateDedicatedHostDiskOptions struct {
	// The dedicated host identifier.
	DedicatedHostID *string `json:"dedicated_host_id" validate:"required,ne="`

	// The dedicated host disk identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The dedicated host disk patch.
	DedicatedHostDiskPatch map[string]interface{} `json:"DedicatedHostDisk_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateDedicatedHostDiskOptions : Instantiate UpdateDedicatedHostDiskOptions
func (*VpcV1) NewUpdateDedicatedHostDiskOptions(dedicatedHostID string, id string, dedicatedHostDiskPatch map[string]interface{}) *UpdateDedicatedHostDiskOptions {
	return &UpdateDedicatedHostDiskOptions{
		DedicatedHostID:        core.StringPtr(dedicatedHostID),
		ID:                     core.StringPtr(id),
		DedicatedHostDiskPatch: dedicatedHostDiskPatch,
	}
}

// SetDedicatedHostID : Allow user to set DedicatedHostID
func (_options *UpdateDedicatedHostDiskOptions) SetDedicatedHostID(dedicatedHostID string) *UpdateDedicatedHostDiskOptions {
	_options.DedicatedHostID = core.StringPtr(dedicatedHostID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateDedicatedHostDiskOptions) SetID(id string) *UpdateDedicatedHostDiskOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetDedicatedHostDiskPatch : Allow user to set DedicatedHostDiskPatch
func (_options *UpdateDedicatedHostDiskOptions) SetDedicatedHostDiskPatch(dedicatedHostDiskPatch map[string]interface{}) *UpdateDedicatedHostDiskOptions {
	_options.DedicatedHostDiskPatch = dedicatedHostDiskPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateDedicatedHostDiskOptions) SetHeaders(param map[string]string) *UpdateDedicatedHostDiskOptions {
	options.Headers = param
	return options
}

// UpdateDedicatedHostGroupOptions : The UpdateDedicatedHostGroup options.
type UpdateDedicatedHostGroupOptions struct {
	// The dedicated host group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The dedicated host group patch.
	DedicatedHostGroupPatch map[string]interface{} `json:"DedicatedHostGroup_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateDedicatedHostGroupOptions : Instantiate UpdateDedicatedHostGroupOptions
func (*VpcV1) NewUpdateDedicatedHostGroupOptions(id string, dedicatedHostGroupPatch map[string]interface{}) *UpdateDedicatedHostGroupOptions {
	return &UpdateDedicatedHostGroupOptions{
		ID:                      core.StringPtr(id),
		DedicatedHostGroupPatch: dedicatedHostGroupPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateDedicatedHostGroupOptions) SetID(id string) *UpdateDedicatedHostGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetDedicatedHostGroupPatch : Allow user to set DedicatedHostGroupPatch
func (_options *UpdateDedicatedHostGroupOptions) SetDedicatedHostGroupPatch(dedicatedHostGroupPatch map[string]interface{}) *UpdateDedicatedHostGroupOptions {
	_options.DedicatedHostGroupPatch = dedicatedHostGroupPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateDedicatedHostGroupOptions) SetHeaders(param map[string]string) *UpdateDedicatedHostGroupOptions {
	options.Headers = param
	return options
}

// UpdateDedicatedHostOptions : The UpdateDedicatedHost options.
type UpdateDedicatedHostOptions struct {
	// The dedicated host identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The dedicated host patch.
	DedicatedHostPatch map[string]interface{} `json:"DedicatedHost_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateDedicatedHostOptions : Instantiate UpdateDedicatedHostOptions
func (*VpcV1) NewUpdateDedicatedHostOptions(id string, dedicatedHostPatch map[string]interface{}) *UpdateDedicatedHostOptions {
	return &UpdateDedicatedHostOptions{
		ID:                 core.StringPtr(id),
		DedicatedHostPatch: dedicatedHostPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateDedicatedHostOptions) SetID(id string) *UpdateDedicatedHostOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetDedicatedHostPatch : Allow user to set DedicatedHostPatch
func (_options *UpdateDedicatedHostOptions) SetDedicatedHostPatch(dedicatedHostPatch map[string]interface{}) *UpdateDedicatedHostOptions {
	_options.DedicatedHostPatch = dedicatedHostPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateDedicatedHostOptions) SetHeaders(param map[string]string) *UpdateDedicatedHostOptions {
	options.Headers = param
	return options
}

// UpdateEndpointGatewayOptions : The UpdateEndpointGateway options.
type UpdateEndpointGatewayOptions struct {
	// The endpoint gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The endpoint gateway patch.
	EndpointGatewayPatch map[string]interface{} `json:"EndpointGateway_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateEndpointGatewayOptions : Instantiate UpdateEndpointGatewayOptions
func (*VpcV1) NewUpdateEndpointGatewayOptions(id string, endpointGatewayPatch map[string]interface{}) *UpdateEndpointGatewayOptions {
	return &UpdateEndpointGatewayOptions{
		ID:                   core.StringPtr(id),
		EndpointGatewayPatch: endpointGatewayPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateEndpointGatewayOptions) SetID(id string) *UpdateEndpointGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetEndpointGatewayPatch : Allow user to set EndpointGatewayPatch
func (_options *UpdateEndpointGatewayOptions) SetEndpointGatewayPatch(endpointGatewayPatch map[string]interface{}) *UpdateEndpointGatewayOptions {
	_options.EndpointGatewayPatch = endpointGatewayPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateEndpointGatewayOptions) SetHeaders(param map[string]string) *UpdateEndpointGatewayOptions {
	options.Headers = param
	return options
}

// UpdateFirmwareForBareMetalServerOptions : The UpdateFirmwareForBareMetalServer options.
type UpdateFirmwareForBareMetalServerOptions struct {
	// The bare metal server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// Indicates whether to automatically start the bare metal server after the firmware update is successfully completed.
	AutoStart *bool `json:"auto_start,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateFirmwareForBareMetalServerOptions : Instantiate UpdateFirmwareForBareMetalServerOptions
func (*VpcV1) NewUpdateFirmwareForBareMetalServerOptions(id string) *UpdateFirmwareForBareMetalServerOptions {
	return &UpdateFirmwareForBareMetalServerOptions{
		ID: core.StringPtr(id),
	}
}

// SetID : Allow user to set ID
func (_options *UpdateFirmwareForBareMetalServerOptions) SetID(id string) *UpdateFirmwareForBareMetalServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetAutoStart : Allow user to set AutoStart
func (_options *UpdateFirmwareForBareMetalServerOptions) SetAutoStart(autoStart bool) *UpdateFirmwareForBareMetalServerOptions {
	_options.AutoStart = core.BoolPtr(autoStart)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateFirmwareForBareMetalServerOptions) SetHeaders(param map[string]string) *UpdateFirmwareForBareMetalServerOptions {
	options.Headers = param
	return options
}

// UpdateFloatingIPOptions : The UpdateFloatingIP options.
type UpdateFloatingIPOptions struct {
	// The floating IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The floating IP patch.
	FloatingIPPatch map[string]interface{} `json:"FloatingIP_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateFloatingIPOptions : Instantiate UpdateFloatingIPOptions
func (*VpcV1) NewUpdateFloatingIPOptions(id string, floatingIPPatch map[string]interface{}) *UpdateFloatingIPOptions {
	return &UpdateFloatingIPOptions{
		ID:              core.StringPtr(id),
		FloatingIPPatch: floatingIPPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateFloatingIPOptions) SetID(id string) *UpdateFloatingIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetFloatingIPPatch : Allow user to set FloatingIPPatch
func (_options *UpdateFloatingIPOptions) SetFloatingIPPatch(floatingIPPatch map[string]interface{}) *UpdateFloatingIPOptions {
	_options.FloatingIPPatch = floatingIPPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateFloatingIPOptions) SetHeaders(param map[string]string) *UpdateFloatingIPOptions {
	options.Headers = param
	return options
}

// UpdateFlowLogCollectorOptions : The UpdateFlowLogCollector options.
type UpdateFlowLogCollectorOptions struct {
	// The flow log collector identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The flow log collector patch.
	FlowLogCollectorPatch map[string]interface{} `json:"FlowLogCollector_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateFlowLogCollectorOptions : Instantiate UpdateFlowLogCollectorOptions
func (*VpcV1) NewUpdateFlowLogCollectorOptions(id string, flowLogCollectorPatch map[string]interface{}) *UpdateFlowLogCollectorOptions {
	return &UpdateFlowLogCollectorOptions{
		ID:                    core.StringPtr(id),
		FlowLogCollectorPatch: flowLogCollectorPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateFlowLogCollectorOptions) SetID(id string) *UpdateFlowLogCollectorOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetFlowLogCollectorPatch : Allow user to set FlowLogCollectorPatch
func (_options *UpdateFlowLogCollectorOptions) SetFlowLogCollectorPatch(flowLogCollectorPatch map[string]interface{}) *UpdateFlowLogCollectorOptions {
	_options.FlowLogCollectorPatch = flowLogCollectorPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateFlowLogCollectorOptions) SetHeaders(param map[string]string) *UpdateFlowLogCollectorOptions {
	options.Headers = param
	return options
}

// UpdateIkePolicyOptions : The UpdateIkePolicy options.
type UpdateIkePolicyOptions struct {
	// The IKE policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IKE policy patch.
	IkePolicyPatch map[string]interface{} `json:"IkePolicy_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateIkePolicyOptions : Instantiate UpdateIkePolicyOptions
func (*VpcV1) NewUpdateIkePolicyOptions(id string, ikePolicyPatch map[string]interface{}) *UpdateIkePolicyOptions {
	return &UpdateIkePolicyOptions{
		ID:             core.StringPtr(id),
		IkePolicyPatch: ikePolicyPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateIkePolicyOptions) SetID(id string) *UpdateIkePolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIkePolicyPatch : Allow user to set IkePolicyPatch
func (_options *UpdateIkePolicyOptions) SetIkePolicyPatch(ikePolicyPatch map[string]interface{}) *UpdateIkePolicyOptions {
	_options.IkePolicyPatch = ikePolicyPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateIkePolicyOptions) SetHeaders(param map[string]string) *UpdateIkePolicyOptions {
	options.Headers = param
	return options
}

// UpdateImageExportJobOptions : The UpdateImageExportJob options.
type UpdateImageExportJobOptions struct {
	// The image identifier.
	ImageID *string `json:"image_id" validate:"required,ne="`

	// The image export job identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The image export job patch.
	ImageExportJobPatch map[string]interface{} `json:"ImageExportJob_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateImageExportJobOptions : Instantiate UpdateImageExportJobOptions
func (*VpcV1) NewUpdateImageExportJobOptions(imageID string, id string, imageExportJobPatch map[string]interface{}) *UpdateImageExportJobOptions {
	return &UpdateImageExportJobOptions{
		ImageID:             core.StringPtr(imageID),
		ID:                  core.StringPtr(id),
		ImageExportJobPatch: imageExportJobPatch,
	}
}

// SetImageID : Allow user to set ImageID
func (_options *UpdateImageExportJobOptions) SetImageID(imageID string) *UpdateImageExportJobOptions {
	_options.ImageID = core.StringPtr(imageID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateImageExportJobOptions) SetID(id string) *UpdateImageExportJobOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetImageExportJobPatch : Allow user to set ImageExportJobPatch
func (_options *UpdateImageExportJobOptions) SetImageExportJobPatch(imageExportJobPatch map[string]interface{}) *UpdateImageExportJobOptions {
	_options.ImageExportJobPatch = imageExportJobPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateImageExportJobOptions) SetHeaders(param map[string]string) *UpdateImageExportJobOptions {
	options.Headers = param
	return options
}

// UpdateImageOptions : The UpdateImage options.
type UpdateImageOptions struct {
	// The image identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The image patch.
	ImagePatch map[string]interface{} `json:"Image_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateImageOptions : Instantiate UpdateImageOptions
func (*VpcV1) NewUpdateImageOptions(id string, imagePatch map[string]interface{}) *UpdateImageOptions {
	return &UpdateImageOptions{
		ID:         core.StringPtr(id),
		ImagePatch: imagePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateImageOptions) SetID(id string) *UpdateImageOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetImagePatch : Allow user to set ImagePatch
func (_options *UpdateImageOptions) SetImagePatch(imagePatch map[string]interface{}) *UpdateImageOptions {
	_options.ImagePatch = imagePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateImageOptions) SetHeaders(param map[string]string) *UpdateImageOptions {
	options.Headers = param
	return options
}

// UpdateInstanceClusterNetworkAttachmentOptions : The UpdateInstanceClusterNetworkAttachment options.
type UpdateInstanceClusterNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance cluster network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance cluster network attachment patch.
	InstanceClusterNetworkAttachmentPatch map[string]interface{} `json:"InstanceClusterNetworkAttachment_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceClusterNetworkAttachmentOptions : Instantiate UpdateInstanceClusterNetworkAttachmentOptions
func (*VpcV1) NewUpdateInstanceClusterNetworkAttachmentOptions(instanceID string, id string, instanceClusterNetworkAttachmentPatch map[string]interface{}) *UpdateInstanceClusterNetworkAttachmentOptions {
	return &UpdateInstanceClusterNetworkAttachmentOptions{
		InstanceID:                            core.StringPtr(instanceID),
		ID:                                    core.StringPtr(id),
		InstanceClusterNetworkAttachmentPatch: instanceClusterNetworkAttachmentPatch,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *UpdateInstanceClusterNetworkAttachmentOptions) SetInstanceID(instanceID string) *UpdateInstanceClusterNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceClusterNetworkAttachmentOptions) SetID(id string) *UpdateInstanceClusterNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceClusterNetworkAttachmentPatch : Allow user to set InstanceClusterNetworkAttachmentPatch
func (_options *UpdateInstanceClusterNetworkAttachmentOptions) SetInstanceClusterNetworkAttachmentPatch(instanceClusterNetworkAttachmentPatch map[string]interface{}) *UpdateInstanceClusterNetworkAttachmentOptions {
	_options.InstanceClusterNetworkAttachmentPatch = instanceClusterNetworkAttachmentPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceClusterNetworkAttachmentOptions) SetHeaders(param map[string]string) *UpdateInstanceClusterNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// UpdateInstanceDiskOptions : The UpdateInstanceDisk options.
type UpdateInstanceDiskOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance disk identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance disk patch.
	InstanceDiskPatch map[string]interface{} `json:"InstanceDisk_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceDiskOptions : Instantiate UpdateInstanceDiskOptions
func (*VpcV1) NewUpdateInstanceDiskOptions(instanceID string, id string, instanceDiskPatch map[string]interface{}) *UpdateInstanceDiskOptions {
	return &UpdateInstanceDiskOptions{
		InstanceID:        core.StringPtr(instanceID),
		ID:                core.StringPtr(id),
		InstanceDiskPatch: instanceDiskPatch,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *UpdateInstanceDiskOptions) SetInstanceID(instanceID string) *UpdateInstanceDiskOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceDiskOptions) SetID(id string) *UpdateInstanceDiskOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceDiskPatch : Allow user to set InstanceDiskPatch
func (_options *UpdateInstanceDiskOptions) SetInstanceDiskPatch(instanceDiskPatch map[string]interface{}) *UpdateInstanceDiskOptions {
	_options.InstanceDiskPatch = instanceDiskPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceDiskOptions) SetHeaders(param map[string]string) *UpdateInstanceDiskOptions {
	options.Headers = param
	return options
}

// UpdateInstanceGroupManagerActionOptions : The UpdateInstanceGroupManagerAction options.
type UpdateInstanceGroupManagerActionOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager action identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance group manager action patch.
	InstanceGroupManagerActionPatch map[string]interface{} `json:"InstanceGroupManagerAction_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceGroupManagerActionOptions : Instantiate UpdateInstanceGroupManagerActionOptions
func (*VpcV1) NewUpdateInstanceGroupManagerActionOptions(instanceGroupID string, instanceGroupManagerID string, id string, instanceGroupManagerActionPatch map[string]interface{}) *UpdateInstanceGroupManagerActionOptions {
	return &UpdateInstanceGroupManagerActionOptions{
		InstanceGroupID:                 core.StringPtr(instanceGroupID),
		InstanceGroupManagerID:          core.StringPtr(instanceGroupManagerID),
		ID:                              core.StringPtr(id),
		InstanceGroupManagerActionPatch: instanceGroupManagerActionPatch,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *UpdateInstanceGroupManagerActionOptions) SetInstanceGroupID(instanceGroupID string) *UpdateInstanceGroupManagerActionOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *UpdateInstanceGroupManagerActionOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *UpdateInstanceGroupManagerActionOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceGroupManagerActionOptions) SetID(id string) *UpdateInstanceGroupManagerActionOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceGroupManagerActionPatch : Allow user to set InstanceGroupManagerActionPatch
func (_options *UpdateInstanceGroupManagerActionOptions) SetInstanceGroupManagerActionPatch(instanceGroupManagerActionPatch map[string]interface{}) *UpdateInstanceGroupManagerActionOptions {
	_options.InstanceGroupManagerActionPatch = instanceGroupManagerActionPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceGroupManagerActionOptions) SetHeaders(param map[string]string) *UpdateInstanceGroupManagerActionOptions {
	options.Headers = param
	return options
}

// UpdateInstanceGroupManagerOptions : The UpdateInstanceGroupManager options.
type UpdateInstanceGroupManagerOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance group manager patch.
	InstanceGroupManagerPatch map[string]interface{} `json:"InstanceGroupManager_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceGroupManagerOptions : Instantiate UpdateInstanceGroupManagerOptions
func (*VpcV1) NewUpdateInstanceGroupManagerOptions(instanceGroupID string, id string, instanceGroupManagerPatch map[string]interface{}) *UpdateInstanceGroupManagerOptions {
	return &UpdateInstanceGroupManagerOptions{
		InstanceGroupID:           core.StringPtr(instanceGroupID),
		ID:                        core.StringPtr(id),
		InstanceGroupManagerPatch: instanceGroupManagerPatch,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *UpdateInstanceGroupManagerOptions) SetInstanceGroupID(instanceGroupID string) *UpdateInstanceGroupManagerOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceGroupManagerOptions) SetID(id string) *UpdateInstanceGroupManagerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceGroupManagerPatch : Allow user to set InstanceGroupManagerPatch
func (_options *UpdateInstanceGroupManagerOptions) SetInstanceGroupManagerPatch(instanceGroupManagerPatch map[string]interface{}) *UpdateInstanceGroupManagerOptions {
	_options.InstanceGroupManagerPatch = instanceGroupManagerPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceGroupManagerOptions) SetHeaders(param map[string]string) *UpdateInstanceGroupManagerOptions {
	options.Headers = param
	return options
}

// UpdateInstanceGroupManagerPolicyOptions : The UpdateInstanceGroupManagerPolicy options.
type UpdateInstanceGroupManagerPolicyOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group manager identifier.
	InstanceGroupManagerID *string `json:"instance_group_manager_id" validate:"required,ne="`

	// The instance group manager policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance group manager policy patch.
	InstanceGroupManagerPolicyPatch map[string]interface{} `json:"InstanceGroupManagerPolicy_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceGroupManagerPolicyOptions : Instantiate UpdateInstanceGroupManagerPolicyOptions
func (*VpcV1) NewUpdateInstanceGroupManagerPolicyOptions(instanceGroupID string, instanceGroupManagerID string, id string, instanceGroupManagerPolicyPatch map[string]interface{}) *UpdateInstanceGroupManagerPolicyOptions {
	return &UpdateInstanceGroupManagerPolicyOptions{
		InstanceGroupID:                 core.StringPtr(instanceGroupID),
		InstanceGroupManagerID:          core.StringPtr(instanceGroupManagerID),
		ID:                              core.StringPtr(id),
		InstanceGroupManagerPolicyPatch: instanceGroupManagerPolicyPatch,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *UpdateInstanceGroupManagerPolicyOptions) SetInstanceGroupID(instanceGroupID string) *UpdateInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetInstanceGroupManagerID : Allow user to set InstanceGroupManagerID
func (_options *UpdateInstanceGroupManagerPolicyOptions) SetInstanceGroupManagerID(instanceGroupManagerID string) *UpdateInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupManagerID = core.StringPtr(instanceGroupManagerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceGroupManagerPolicyOptions) SetID(id string) *UpdateInstanceGroupManagerPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceGroupManagerPolicyPatch : Allow user to set InstanceGroupManagerPolicyPatch
func (_options *UpdateInstanceGroupManagerPolicyOptions) SetInstanceGroupManagerPolicyPatch(instanceGroupManagerPolicyPatch map[string]interface{}) *UpdateInstanceGroupManagerPolicyOptions {
	_options.InstanceGroupManagerPolicyPatch = instanceGroupManagerPolicyPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceGroupManagerPolicyOptions) SetHeaders(param map[string]string) *UpdateInstanceGroupManagerPolicyOptions {
	options.Headers = param
	return options
}

// UpdateInstanceGroupMembershipOptions : The UpdateInstanceGroupMembership options.
type UpdateInstanceGroupMembershipOptions struct {
	// The instance group identifier.
	InstanceGroupID *string `json:"instance_group_id" validate:"required,ne="`

	// The instance group membership identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance group membership patch.
	InstanceGroupMembershipPatch map[string]interface{} `json:"InstanceGroupMembership_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceGroupMembershipOptions : Instantiate UpdateInstanceGroupMembershipOptions
func (*VpcV1) NewUpdateInstanceGroupMembershipOptions(instanceGroupID string, id string, instanceGroupMembershipPatch map[string]interface{}) *UpdateInstanceGroupMembershipOptions {
	return &UpdateInstanceGroupMembershipOptions{
		InstanceGroupID:              core.StringPtr(instanceGroupID),
		ID:                           core.StringPtr(id),
		InstanceGroupMembershipPatch: instanceGroupMembershipPatch,
	}
}

// SetInstanceGroupID : Allow user to set InstanceGroupID
func (_options *UpdateInstanceGroupMembershipOptions) SetInstanceGroupID(instanceGroupID string) *UpdateInstanceGroupMembershipOptions {
	_options.InstanceGroupID = core.StringPtr(instanceGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceGroupMembershipOptions) SetID(id string) *UpdateInstanceGroupMembershipOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceGroupMembershipPatch : Allow user to set InstanceGroupMembershipPatch
func (_options *UpdateInstanceGroupMembershipOptions) SetInstanceGroupMembershipPatch(instanceGroupMembershipPatch map[string]interface{}) *UpdateInstanceGroupMembershipOptions {
	_options.InstanceGroupMembershipPatch = instanceGroupMembershipPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceGroupMembershipOptions) SetHeaders(param map[string]string) *UpdateInstanceGroupMembershipOptions {
	options.Headers = param
	return options
}

// UpdateInstanceGroupOptions : The UpdateInstanceGroup options.
type UpdateInstanceGroupOptions struct {
	// The instance group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance group patch.
	InstanceGroupPatch map[string]interface{} `json:"InstanceGroup_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceGroupOptions : Instantiate UpdateInstanceGroupOptions
func (*VpcV1) NewUpdateInstanceGroupOptions(id string, instanceGroupPatch map[string]interface{}) *UpdateInstanceGroupOptions {
	return &UpdateInstanceGroupOptions{
		ID:                 core.StringPtr(id),
		InstanceGroupPatch: instanceGroupPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceGroupOptions) SetID(id string) *UpdateInstanceGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceGroupPatch : Allow user to set InstanceGroupPatch
func (_options *UpdateInstanceGroupOptions) SetInstanceGroupPatch(instanceGroupPatch map[string]interface{}) *UpdateInstanceGroupOptions {
	_options.InstanceGroupPatch = instanceGroupPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceGroupOptions) SetHeaders(param map[string]string) *UpdateInstanceGroupOptions {
	options.Headers = param
	return options
}

// UpdateInstanceNetworkAttachmentOptions : The UpdateInstanceNetworkAttachment options.
type UpdateInstanceNetworkAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance network attachment patch.
	InstanceNetworkAttachmentPatch map[string]interface{} `json:"InstanceNetworkAttachment_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceNetworkAttachmentOptions : Instantiate UpdateInstanceNetworkAttachmentOptions
func (*VpcV1) NewUpdateInstanceNetworkAttachmentOptions(instanceID string, id string, instanceNetworkAttachmentPatch map[string]interface{}) *UpdateInstanceNetworkAttachmentOptions {
	return &UpdateInstanceNetworkAttachmentOptions{
		InstanceID:                     core.StringPtr(instanceID),
		ID:                             core.StringPtr(id),
		InstanceNetworkAttachmentPatch: instanceNetworkAttachmentPatch,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *UpdateInstanceNetworkAttachmentOptions) SetInstanceID(instanceID string) *UpdateInstanceNetworkAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceNetworkAttachmentOptions) SetID(id string) *UpdateInstanceNetworkAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceNetworkAttachmentPatch : Allow user to set InstanceNetworkAttachmentPatch
func (_options *UpdateInstanceNetworkAttachmentOptions) SetInstanceNetworkAttachmentPatch(instanceNetworkAttachmentPatch map[string]interface{}) *UpdateInstanceNetworkAttachmentOptions {
	_options.InstanceNetworkAttachmentPatch = instanceNetworkAttachmentPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceNetworkAttachmentOptions) SetHeaders(param map[string]string) *UpdateInstanceNetworkAttachmentOptions {
	options.Headers = param
	return options
}

// UpdateInstanceNetworkInterfaceOptions : The UpdateInstanceNetworkInterface options.
type UpdateInstanceNetworkInterfaceOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The instance network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance network interface patch.
	NetworkInterfacePatch map[string]interface{} `json:"NetworkInterface_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceNetworkInterfaceOptions : Instantiate UpdateInstanceNetworkInterfaceOptions
func (*VpcV1) NewUpdateInstanceNetworkInterfaceOptions(instanceID string, id string, networkInterfacePatch map[string]interface{}) *UpdateInstanceNetworkInterfaceOptions {
	return &UpdateInstanceNetworkInterfaceOptions{
		InstanceID:            core.StringPtr(instanceID),
		ID:                    core.StringPtr(id),
		NetworkInterfacePatch: networkInterfacePatch,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *UpdateInstanceNetworkInterfaceOptions) SetInstanceID(instanceID string) *UpdateInstanceNetworkInterfaceOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceNetworkInterfaceOptions) SetID(id string) *UpdateInstanceNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetNetworkInterfacePatch : Allow user to set NetworkInterfacePatch
func (_options *UpdateInstanceNetworkInterfaceOptions) SetNetworkInterfacePatch(networkInterfacePatch map[string]interface{}) *UpdateInstanceNetworkInterfaceOptions {
	_options.NetworkInterfacePatch = networkInterfacePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceNetworkInterfaceOptions) SetHeaders(param map[string]string) *UpdateInstanceNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// UpdateInstanceOptions : The UpdateInstance options.
type UpdateInstanceOptions struct {
	// The virtual server instance identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance patch.
	InstancePatch map[string]interface{} `json:"Instance_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceOptions : Instantiate UpdateInstanceOptions
func (*VpcV1) NewUpdateInstanceOptions(id string, instancePatch map[string]interface{}) *UpdateInstanceOptions {
	return &UpdateInstanceOptions{
		ID:            core.StringPtr(id),
		InstancePatch: instancePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceOptions) SetID(id string) *UpdateInstanceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstancePatch : Allow user to set InstancePatch
func (_options *UpdateInstanceOptions) SetInstancePatch(instancePatch map[string]interface{}) *UpdateInstanceOptions {
	_options.InstancePatch = instancePatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateInstanceOptions) SetIfMatch(ifMatch string) *UpdateInstanceOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceOptions) SetHeaders(param map[string]string) *UpdateInstanceOptions {
	options.Headers = param
	return options
}

// UpdateInstanceTemplateOptions : The UpdateInstanceTemplate options.
type UpdateInstanceTemplateOptions struct {
	// The instance template identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The instance template patch.
	InstanceTemplatePatch map[string]interface{} `json:"InstanceTemplate_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceTemplateOptions : Instantiate UpdateInstanceTemplateOptions
func (*VpcV1) NewUpdateInstanceTemplateOptions(id string, instanceTemplatePatch map[string]interface{}) *UpdateInstanceTemplateOptions {
	return &UpdateInstanceTemplateOptions{
		ID:                    core.StringPtr(id),
		InstanceTemplatePatch: instanceTemplatePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceTemplateOptions) SetID(id string) *UpdateInstanceTemplateOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetInstanceTemplatePatch : Allow user to set InstanceTemplatePatch
func (_options *UpdateInstanceTemplateOptions) SetInstanceTemplatePatch(instanceTemplatePatch map[string]interface{}) *UpdateInstanceTemplateOptions {
	_options.InstanceTemplatePatch = instanceTemplatePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceTemplateOptions) SetHeaders(param map[string]string) *UpdateInstanceTemplateOptions {
	options.Headers = param
	return options
}

// UpdateInstanceVolumeAttachmentOptions : The UpdateInstanceVolumeAttachment options.
type UpdateInstanceVolumeAttachmentOptions struct {
	// The virtual server instance identifier.
	InstanceID *string `json:"instance_id" validate:"required,ne="`

	// The volume attachment identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The volume attachment patch.
	VolumeAttachmentPatch map[string]interface{} `json:"VolumeAttachment_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateInstanceVolumeAttachmentOptions : Instantiate UpdateInstanceVolumeAttachmentOptions
func (*VpcV1) NewUpdateInstanceVolumeAttachmentOptions(instanceID string, id string, volumeAttachmentPatch map[string]interface{}) *UpdateInstanceVolumeAttachmentOptions {
	return &UpdateInstanceVolumeAttachmentOptions{
		InstanceID:            core.StringPtr(instanceID),
		ID:                    core.StringPtr(id),
		VolumeAttachmentPatch: volumeAttachmentPatch,
	}
}

// SetInstanceID : Allow user to set InstanceID
func (_options *UpdateInstanceVolumeAttachmentOptions) SetInstanceID(instanceID string) *UpdateInstanceVolumeAttachmentOptions {
	_options.InstanceID = core.StringPtr(instanceID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateInstanceVolumeAttachmentOptions) SetID(id string) *UpdateInstanceVolumeAttachmentOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVolumeAttachmentPatch : Allow user to set VolumeAttachmentPatch
func (_options *UpdateInstanceVolumeAttachmentOptions) SetVolumeAttachmentPatch(volumeAttachmentPatch map[string]interface{}) *UpdateInstanceVolumeAttachmentOptions {
	_options.VolumeAttachmentPatch = volumeAttachmentPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateInstanceVolumeAttachmentOptions) SetHeaders(param map[string]string) *UpdateInstanceVolumeAttachmentOptions {
	options.Headers = param
	return options
}

// UpdateIpsecPolicyOptions : The UpdateIpsecPolicy options.
type UpdateIpsecPolicyOptions struct {
	// The IPsec policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The IPsec policy patch.
	IPsecPolicyPatch map[string]interface{} `json:"IPsecPolicy_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateIpsecPolicyOptions : Instantiate UpdateIpsecPolicyOptions
func (*VpcV1) NewUpdateIpsecPolicyOptions(id string, iPsecPolicyPatch map[string]interface{}) *UpdateIpsecPolicyOptions {
	return &UpdateIpsecPolicyOptions{
		ID:               core.StringPtr(id),
		IPsecPolicyPatch: iPsecPolicyPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateIpsecPolicyOptions) SetID(id string) *UpdateIpsecPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetIPsecPolicyPatch : Allow user to set IPsecPolicyPatch
func (_options *UpdateIpsecPolicyOptions) SetIPsecPolicyPatch(iPsecPolicyPatch map[string]interface{}) *UpdateIpsecPolicyOptions {
	_options.IPsecPolicyPatch = iPsecPolicyPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateIpsecPolicyOptions) SetHeaders(param map[string]string) *UpdateIpsecPolicyOptions {
	options.Headers = param
	return options
}

// UpdateKeyOptions : The UpdateKey options.
type UpdateKeyOptions struct {
	// The key identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The key patch.
	KeyPatch map[string]interface{} `json:"Key_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateKeyOptions : Instantiate UpdateKeyOptions
func (*VpcV1) NewUpdateKeyOptions(id string, keyPatch map[string]interface{}) *UpdateKeyOptions {
	return &UpdateKeyOptions{
		ID:       core.StringPtr(id),
		KeyPatch: keyPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateKeyOptions) SetID(id string) *UpdateKeyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetKeyPatch : Allow user to set KeyPatch
func (_options *UpdateKeyOptions) SetKeyPatch(keyPatch map[string]interface{}) *UpdateKeyOptions {
	_options.KeyPatch = keyPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateKeyOptions) SetHeaders(param map[string]string) *UpdateKeyOptions {
	options.Headers = param
	return options
}

// UpdateLoadBalancerListenerOptions : The UpdateLoadBalancerListener options.
type UpdateLoadBalancerListenerOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The load balancer listener patch.
	LoadBalancerListenerPatch map[string]interface{} `json:"LoadBalancerListener_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateLoadBalancerListenerOptions : Instantiate UpdateLoadBalancerListenerOptions
func (*VpcV1) NewUpdateLoadBalancerListenerOptions(loadBalancerID string, id string, loadBalancerListenerPatch map[string]interface{}) *UpdateLoadBalancerListenerOptions {
	return &UpdateLoadBalancerListenerOptions{
		LoadBalancerID:            core.StringPtr(loadBalancerID),
		ID:                        core.StringPtr(id),
		LoadBalancerListenerPatch: loadBalancerListenerPatch,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *UpdateLoadBalancerListenerOptions) SetLoadBalancerID(loadBalancerID string) *UpdateLoadBalancerListenerOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateLoadBalancerListenerOptions) SetID(id string) *UpdateLoadBalancerListenerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetLoadBalancerListenerPatch : Allow user to set LoadBalancerListenerPatch
func (_options *UpdateLoadBalancerListenerOptions) SetLoadBalancerListenerPatch(loadBalancerListenerPatch map[string]interface{}) *UpdateLoadBalancerListenerOptions {
	_options.LoadBalancerListenerPatch = loadBalancerListenerPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateLoadBalancerListenerOptions) SetHeaders(param map[string]string) *UpdateLoadBalancerListenerOptions {
	options.Headers = param
	return options
}

// UpdateLoadBalancerListenerPolicyOptions : The UpdateLoadBalancerListenerPolicy options.
type UpdateLoadBalancerListenerPolicyOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The listener policy patch.
	LoadBalancerListenerPolicyPatch map[string]interface{} `json:"LoadBalancerListenerPolicy_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateLoadBalancerListenerPolicyOptions : Instantiate UpdateLoadBalancerListenerPolicyOptions
func (*VpcV1) NewUpdateLoadBalancerListenerPolicyOptions(loadBalancerID string, listenerID string, id string, loadBalancerListenerPolicyPatch map[string]interface{}) *UpdateLoadBalancerListenerPolicyOptions {
	return &UpdateLoadBalancerListenerPolicyOptions{
		LoadBalancerID:                  core.StringPtr(loadBalancerID),
		ListenerID:                      core.StringPtr(listenerID),
		ID:                              core.StringPtr(id),
		LoadBalancerListenerPolicyPatch: loadBalancerListenerPolicyPatch,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *UpdateLoadBalancerListenerPolicyOptions) SetLoadBalancerID(loadBalancerID string) *UpdateLoadBalancerListenerPolicyOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *UpdateLoadBalancerListenerPolicyOptions) SetListenerID(listenerID string) *UpdateLoadBalancerListenerPolicyOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateLoadBalancerListenerPolicyOptions) SetID(id string) *UpdateLoadBalancerListenerPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetLoadBalancerListenerPolicyPatch : Allow user to set LoadBalancerListenerPolicyPatch
func (_options *UpdateLoadBalancerListenerPolicyOptions) SetLoadBalancerListenerPolicyPatch(loadBalancerListenerPolicyPatch map[string]interface{}) *UpdateLoadBalancerListenerPolicyOptions {
	_options.LoadBalancerListenerPolicyPatch = loadBalancerListenerPolicyPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateLoadBalancerListenerPolicyOptions) SetHeaders(param map[string]string) *UpdateLoadBalancerListenerPolicyOptions {
	options.Headers = param
	return options
}

// UpdateLoadBalancerListenerPolicyRuleOptions : The UpdateLoadBalancerListenerPolicyRule options.
type UpdateLoadBalancerListenerPolicyRuleOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The listener identifier.
	ListenerID *string `json:"listener_id" validate:"required,ne="`

	// The policy identifier.
	PolicyID *string `json:"policy_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The listener policy rule patch.
	LoadBalancerListenerPolicyRulePatch map[string]interface{} `json:"LoadBalancerListenerPolicyRule_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateLoadBalancerListenerPolicyRuleOptions : Instantiate UpdateLoadBalancerListenerPolicyRuleOptions
func (*VpcV1) NewUpdateLoadBalancerListenerPolicyRuleOptions(loadBalancerID string, listenerID string, policyID string, id string, loadBalancerListenerPolicyRulePatch map[string]interface{}) *UpdateLoadBalancerListenerPolicyRuleOptions {
	return &UpdateLoadBalancerListenerPolicyRuleOptions{
		LoadBalancerID:                      core.StringPtr(loadBalancerID),
		ListenerID:                          core.StringPtr(listenerID),
		PolicyID:                            core.StringPtr(policyID),
		ID:                                  core.StringPtr(id),
		LoadBalancerListenerPolicyRulePatch: loadBalancerListenerPolicyRulePatch,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *UpdateLoadBalancerListenerPolicyRuleOptions) SetLoadBalancerID(loadBalancerID string) *UpdateLoadBalancerListenerPolicyRuleOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetListenerID : Allow user to set ListenerID
func (_options *UpdateLoadBalancerListenerPolicyRuleOptions) SetListenerID(listenerID string) *UpdateLoadBalancerListenerPolicyRuleOptions {
	_options.ListenerID = core.StringPtr(listenerID)
	return _options
}

// SetPolicyID : Allow user to set PolicyID
func (_options *UpdateLoadBalancerListenerPolicyRuleOptions) SetPolicyID(policyID string) *UpdateLoadBalancerListenerPolicyRuleOptions {
	_options.PolicyID = core.StringPtr(policyID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateLoadBalancerListenerPolicyRuleOptions) SetID(id string) *UpdateLoadBalancerListenerPolicyRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetLoadBalancerListenerPolicyRulePatch : Allow user to set LoadBalancerListenerPolicyRulePatch
func (_options *UpdateLoadBalancerListenerPolicyRuleOptions) SetLoadBalancerListenerPolicyRulePatch(loadBalancerListenerPolicyRulePatch map[string]interface{}) *UpdateLoadBalancerListenerPolicyRuleOptions {
	_options.LoadBalancerListenerPolicyRulePatch = loadBalancerListenerPolicyRulePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateLoadBalancerListenerPolicyRuleOptions) SetHeaders(param map[string]string) *UpdateLoadBalancerListenerPolicyRuleOptions {
	options.Headers = param
	return options
}

// UpdateLoadBalancerOptions : The UpdateLoadBalancer options.
type UpdateLoadBalancerOptions struct {
	// The load balancer identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The load balancer patch.
	LoadBalancerPatch map[string]interface{} `json:"LoadBalancer_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateLoadBalancerOptions : Instantiate UpdateLoadBalancerOptions
func (*VpcV1) NewUpdateLoadBalancerOptions(id string, loadBalancerPatch map[string]interface{}) *UpdateLoadBalancerOptions {
	return &UpdateLoadBalancerOptions{
		ID:                core.StringPtr(id),
		LoadBalancerPatch: loadBalancerPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateLoadBalancerOptions) SetID(id string) *UpdateLoadBalancerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetLoadBalancerPatch : Allow user to set LoadBalancerPatch
func (_options *UpdateLoadBalancerOptions) SetLoadBalancerPatch(loadBalancerPatch map[string]interface{}) *UpdateLoadBalancerOptions {
	_options.LoadBalancerPatch = loadBalancerPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateLoadBalancerOptions) SetIfMatch(ifMatch string) *UpdateLoadBalancerOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateLoadBalancerOptions) SetHeaders(param map[string]string) *UpdateLoadBalancerOptions {
	options.Headers = param
	return options
}

// UpdateLoadBalancerPoolMemberOptions : The UpdateLoadBalancerPoolMember options.
type UpdateLoadBalancerPoolMemberOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	PoolID *string `json:"pool_id" validate:"required,ne="`

	// The member identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The load balancer pool member patch.
	LoadBalancerPoolMemberPatch map[string]interface{} `json:"LoadBalancerPoolMember_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateLoadBalancerPoolMemberOptions : Instantiate UpdateLoadBalancerPoolMemberOptions
func (*VpcV1) NewUpdateLoadBalancerPoolMemberOptions(loadBalancerID string, poolID string, id string, loadBalancerPoolMemberPatch map[string]interface{}) *UpdateLoadBalancerPoolMemberOptions {
	return &UpdateLoadBalancerPoolMemberOptions{
		LoadBalancerID:              core.StringPtr(loadBalancerID),
		PoolID:                      core.StringPtr(poolID),
		ID:                          core.StringPtr(id),
		LoadBalancerPoolMemberPatch: loadBalancerPoolMemberPatch,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *UpdateLoadBalancerPoolMemberOptions) SetLoadBalancerID(loadBalancerID string) *UpdateLoadBalancerPoolMemberOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetPoolID : Allow user to set PoolID
func (_options *UpdateLoadBalancerPoolMemberOptions) SetPoolID(poolID string) *UpdateLoadBalancerPoolMemberOptions {
	_options.PoolID = core.StringPtr(poolID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateLoadBalancerPoolMemberOptions) SetID(id string) *UpdateLoadBalancerPoolMemberOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetLoadBalancerPoolMemberPatch : Allow user to set LoadBalancerPoolMemberPatch
func (_options *UpdateLoadBalancerPoolMemberOptions) SetLoadBalancerPoolMemberPatch(loadBalancerPoolMemberPatch map[string]interface{}) *UpdateLoadBalancerPoolMemberOptions {
	_options.LoadBalancerPoolMemberPatch = loadBalancerPoolMemberPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateLoadBalancerPoolMemberOptions) SetHeaders(param map[string]string) *UpdateLoadBalancerPoolMemberOptions {
	options.Headers = param
	return options
}

// UpdateLoadBalancerPoolOptions : The UpdateLoadBalancerPool options.
type UpdateLoadBalancerPoolOptions struct {
	// The load balancer identifier.
	LoadBalancerID *string `json:"load_balancer_id" validate:"required,ne="`

	// The pool identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The load balancer pool patch.
	LoadBalancerPoolPatch map[string]interface{} `json:"LoadBalancerPool_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateLoadBalancerPoolOptions : Instantiate UpdateLoadBalancerPoolOptions
func (*VpcV1) NewUpdateLoadBalancerPoolOptions(loadBalancerID string, id string, loadBalancerPoolPatch map[string]interface{}) *UpdateLoadBalancerPoolOptions {
	return &UpdateLoadBalancerPoolOptions{
		LoadBalancerID:        core.StringPtr(loadBalancerID),
		ID:                    core.StringPtr(id),
		LoadBalancerPoolPatch: loadBalancerPoolPatch,
	}
}

// SetLoadBalancerID : Allow user to set LoadBalancerID
func (_options *UpdateLoadBalancerPoolOptions) SetLoadBalancerID(loadBalancerID string) *UpdateLoadBalancerPoolOptions {
	_options.LoadBalancerID = core.StringPtr(loadBalancerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateLoadBalancerPoolOptions) SetID(id string) *UpdateLoadBalancerPoolOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetLoadBalancerPoolPatch : Allow user to set LoadBalancerPoolPatch
func (_options *UpdateLoadBalancerPoolOptions) SetLoadBalancerPoolPatch(loadBalancerPoolPatch map[string]interface{}) *UpdateLoadBalancerPoolOptions {
	_options.LoadBalancerPoolPatch = loadBalancerPoolPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateLoadBalancerPoolOptions) SetHeaders(param map[string]string) *UpdateLoadBalancerPoolOptions {
	options.Headers = param
	return options
}

// UpdateNetworkACLOptions : The UpdateNetworkACL options.
type UpdateNetworkACLOptions struct {
	// The network ACL identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The network ACL patch.
	NetworkACLPatch map[string]interface{} `json:"NetworkACL_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateNetworkACLOptions : Instantiate UpdateNetworkACLOptions
func (*VpcV1) NewUpdateNetworkACLOptions(id string, networkACLPatch map[string]interface{}) *UpdateNetworkACLOptions {
	return &UpdateNetworkACLOptions{
		ID:              core.StringPtr(id),
		NetworkACLPatch: networkACLPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateNetworkACLOptions) SetID(id string) *UpdateNetworkACLOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetNetworkACLPatch : Allow user to set NetworkACLPatch
func (_options *UpdateNetworkACLOptions) SetNetworkACLPatch(networkACLPatch map[string]interface{}) *UpdateNetworkACLOptions {
	_options.NetworkACLPatch = networkACLPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateNetworkACLOptions) SetHeaders(param map[string]string) *UpdateNetworkACLOptions {
	options.Headers = param
	return options
}

// UpdateNetworkACLRuleOptions : The UpdateNetworkACLRule options.
type UpdateNetworkACLRuleOptions struct {
	// The network ACL identifier.
	NetworkACLID *string `json:"network_acl_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The network ACL rule patch.
	NetworkACLRulePatch map[string]interface{} `json:"NetworkACLRule_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateNetworkACLRuleOptions : Instantiate UpdateNetworkACLRuleOptions
func (*VpcV1) NewUpdateNetworkACLRuleOptions(networkACLID string, id string, networkACLRulePatch map[string]interface{}) *UpdateNetworkACLRuleOptions {
	return &UpdateNetworkACLRuleOptions{
		NetworkACLID:        core.StringPtr(networkACLID),
		ID:                  core.StringPtr(id),
		NetworkACLRulePatch: networkACLRulePatch,
	}
}

// SetNetworkACLID : Allow user to set NetworkACLID
func (_options *UpdateNetworkACLRuleOptions) SetNetworkACLID(networkACLID string) *UpdateNetworkACLRuleOptions {
	_options.NetworkACLID = core.StringPtr(networkACLID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateNetworkACLRuleOptions) SetID(id string) *UpdateNetworkACLRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetNetworkACLRulePatch : Allow user to set NetworkACLRulePatch
func (_options *UpdateNetworkACLRuleOptions) SetNetworkACLRulePatch(networkACLRulePatch map[string]interface{}) *UpdateNetworkACLRuleOptions {
	_options.NetworkACLRulePatch = networkACLRulePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateNetworkACLRuleOptions) SetHeaders(param map[string]string) *UpdateNetworkACLRuleOptions {
	options.Headers = param
	return options
}

// UpdatePlacementGroupOptions : The UpdatePlacementGroup options.
type UpdatePlacementGroupOptions struct {
	// The placement group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The placement group patch.
	PlacementGroupPatch map[string]interface{} `json:"PlacementGroup_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdatePlacementGroupOptions : Instantiate UpdatePlacementGroupOptions
func (*VpcV1) NewUpdatePlacementGroupOptions(id string, placementGroupPatch map[string]interface{}) *UpdatePlacementGroupOptions {
	return &UpdatePlacementGroupOptions{
		ID:                  core.StringPtr(id),
		PlacementGroupPatch: placementGroupPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdatePlacementGroupOptions) SetID(id string) *UpdatePlacementGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetPlacementGroupPatch : Allow user to set PlacementGroupPatch
func (_options *UpdatePlacementGroupOptions) SetPlacementGroupPatch(placementGroupPatch map[string]interface{}) *UpdatePlacementGroupOptions {
	_options.PlacementGroupPatch = placementGroupPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdatePlacementGroupOptions) SetHeaders(param map[string]string) *UpdatePlacementGroupOptions {
	options.Headers = param
	return options
}

// UpdatePrivatePathServiceGatewayAccountPolicyOptions : The UpdatePrivatePathServiceGatewayAccountPolicy options.
type UpdatePrivatePathServiceGatewayAccountPolicyOptions struct {
	// The private path service gateway identifier.
	PrivatePathServiceGatewayID *string `json:"private_path_service_gateway_id" validate:"required,ne="`

	// The account policy identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The account policy patch.
	PrivatePathServiceGatewayAccountPolicyPatch map[string]interface{} `json:"PrivatePathServiceGatewayAccountPolicy_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdatePrivatePathServiceGatewayAccountPolicyOptions : Instantiate UpdatePrivatePathServiceGatewayAccountPolicyOptions
func (*VpcV1) NewUpdatePrivatePathServiceGatewayAccountPolicyOptions(privatePathServiceGatewayID string, id string, privatePathServiceGatewayAccountPolicyPatch map[string]interface{}) *UpdatePrivatePathServiceGatewayAccountPolicyOptions {
	return &UpdatePrivatePathServiceGatewayAccountPolicyOptions{
		PrivatePathServiceGatewayID: core.StringPtr(privatePathServiceGatewayID),
		ID:                          core.StringPtr(id),
		PrivatePathServiceGatewayAccountPolicyPatch: privatePathServiceGatewayAccountPolicyPatch,
	}
}

// SetPrivatePathServiceGatewayID : Allow user to set PrivatePathServiceGatewayID
func (_options *UpdatePrivatePathServiceGatewayAccountPolicyOptions) SetPrivatePathServiceGatewayID(privatePathServiceGatewayID string) *UpdatePrivatePathServiceGatewayAccountPolicyOptions {
	_options.PrivatePathServiceGatewayID = core.StringPtr(privatePathServiceGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdatePrivatePathServiceGatewayAccountPolicyOptions) SetID(id string) *UpdatePrivatePathServiceGatewayAccountPolicyOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetPrivatePathServiceGatewayAccountPolicyPatch : Allow user to set PrivatePathServiceGatewayAccountPolicyPatch
func (_options *UpdatePrivatePathServiceGatewayAccountPolicyOptions) SetPrivatePathServiceGatewayAccountPolicyPatch(privatePathServiceGatewayAccountPolicyPatch map[string]interface{}) *UpdatePrivatePathServiceGatewayAccountPolicyOptions {
	_options.PrivatePathServiceGatewayAccountPolicyPatch = privatePathServiceGatewayAccountPolicyPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdatePrivatePathServiceGatewayAccountPolicyOptions) SetHeaders(param map[string]string) *UpdatePrivatePathServiceGatewayAccountPolicyOptions {
	options.Headers = param
	return options
}

// UpdatePrivatePathServiceGatewayOptions : The UpdatePrivatePathServiceGateway options.
type UpdatePrivatePathServiceGatewayOptions struct {
	// The private path service gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The private path service gateway patch.
	PrivatePathServiceGatewayPatch map[string]interface{} `json:"PrivatePathServiceGateway_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdatePrivatePathServiceGatewayOptions : Instantiate UpdatePrivatePathServiceGatewayOptions
func (*VpcV1) NewUpdatePrivatePathServiceGatewayOptions(id string, privatePathServiceGatewayPatch map[string]interface{}) *UpdatePrivatePathServiceGatewayOptions {
	return &UpdatePrivatePathServiceGatewayOptions{
		ID:                             core.StringPtr(id),
		PrivatePathServiceGatewayPatch: privatePathServiceGatewayPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdatePrivatePathServiceGatewayOptions) SetID(id string) *UpdatePrivatePathServiceGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetPrivatePathServiceGatewayPatch : Allow user to set PrivatePathServiceGatewayPatch
func (_options *UpdatePrivatePathServiceGatewayOptions) SetPrivatePathServiceGatewayPatch(privatePathServiceGatewayPatch map[string]interface{}) *UpdatePrivatePathServiceGatewayOptions {
	_options.PrivatePathServiceGatewayPatch = privatePathServiceGatewayPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdatePrivatePathServiceGatewayOptions) SetHeaders(param map[string]string) *UpdatePrivatePathServiceGatewayOptions {
	options.Headers = param
	return options
}

// UpdatePublicAddressRangeOptions : The UpdatePublicAddressRange options.
type UpdatePublicAddressRangeOptions struct {
	// The public address range identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The public address range patch.
	PublicAddressRangePatch map[string]interface{} `json:"PublicAddressRange_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdatePublicAddressRangeOptions : Instantiate UpdatePublicAddressRangeOptions
func (*VpcV1) NewUpdatePublicAddressRangeOptions(id string, publicAddressRangePatch map[string]interface{}) *UpdatePublicAddressRangeOptions {
	return &UpdatePublicAddressRangeOptions{
		ID:                      core.StringPtr(id),
		PublicAddressRangePatch: publicAddressRangePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdatePublicAddressRangeOptions) SetID(id string) *UpdatePublicAddressRangeOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetPublicAddressRangePatch : Allow user to set PublicAddressRangePatch
func (_options *UpdatePublicAddressRangeOptions) SetPublicAddressRangePatch(publicAddressRangePatch map[string]interface{}) *UpdatePublicAddressRangeOptions {
	_options.PublicAddressRangePatch = publicAddressRangePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdatePublicAddressRangeOptions) SetHeaders(param map[string]string) *UpdatePublicAddressRangeOptions {
	options.Headers = param
	return options
}

// UpdatePublicGatewayOptions : The UpdatePublicGateway options.
type UpdatePublicGatewayOptions struct {
	// The public gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The public gateway patch.
	PublicGatewayPatch map[string]interface{} `json:"PublicGateway_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdatePublicGatewayOptions : Instantiate UpdatePublicGatewayOptions
func (*VpcV1) NewUpdatePublicGatewayOptions(id string, publicGatewayPatch map[string]interface{}) *UpdatePublicGatewayOptions {
	return &UpdatePublicGatewayOptions{
		ID:                 core.StringPtr(id),
		PublicGatewayPatch: publicGatewayPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdatePublicGatewayOptions) SetID(id string) *UpdatePublicGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetPublicGatewayPatch : Allow user to set PublicGatewayPatch
func (_options *UpdatePublicGatewayOptions) SetPublicGatewayPatch(publicGatewayPatch map[string]interface{}) *UpdatePublicGatewayOptions {
	_options.PublicGatewayPatch = publicGatewayPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdatePublicGatewayOptions) SetHeaders(param map[string]string) *UpdatePublicGatewayOptions {
	options.Headers = param
	return options
}

// UpdateReservationOptions : The UpdateReservation options.
type UpdateReservationOptions struct {
	// The reservation identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The reservation patch.
	ReservationPatch map[string]interface{} `json:"Reservation_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateReservationOptions : Instantiate UpdateReservationOptions
func (*VpcV1) NewUpdateReservationOptions(id string, reservationPatch map[string]interface{}) *UpdateReservationOptions {
	return &UpdateReservationOptions{
		ID:               core.StringPtr(id),
		ReservationPatch: reservationPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateReservationOptions) SetID(id string) *UpdateReservationOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetReservationPatch : Allow user to set ReservationPatch
func (_options *UpdateReservationOptions) SetReservationPatch(reservationPatch map[string]interface{}) *UpdateReservationOptions {
	_options.ReservationPatch = reservationPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateReservationOptions) SetHeaders(param map[string]string) *UpdateReservationOptions {
	options.Headers = param
	return options
}

// UpdateSecurityGroupOptions : The UpdateSecurityGroup options.
type UpdateSecurityGroupOptions struct {
	// The security group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The security group patch.
	SecurityGroupPatch map[string]interface{} `json:"SecurityGroup_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateSecurityGroupOptions : Instantiate UpdateSecurityGroupOptions
func (*VpcV1) NewUpdateSecurityGroupOptions(id string, securityGroupPatch map[string]interface{}) *UpdateSecurityGroupOptions {
	return &UpdateSecurityGroupOptions{
		ID:                 core.StringPtr(id),
		SecurityGroupPatch: securityGroupPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateSecurityGroupOptions) SetID(id string) *UpdateSecurityGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSecurityGroupPatch : Allow user to set SecurityGroupPatch
func (_options *UpdateSecurityGroupOptions) SetSecurityGroupPatch(securityGroupPatch map[string]interface{}) *UpdateSecurityGroupOptions {
	_options.SecurityGroupPatch = securityGroupPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateSecurityGroupOptions) SetHeaders(param map[string]string) *UpdateSecurityGroupOptions {
	options.Headers = param
	return options
}

// UpdateSecurityGroupRuleOptions : The UpdateSecurityGroupRule options.
type UpdateSecurityGroupRuleOptions struct {
	// The security group identifier.
	SecurityGroupID *string `json:"security_group_id" validate:"required,ne="`

	// The rule identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The security group rule patch.
	SecurityGroupRulePatch map[string]interface{} `json:"SecurityGroupRule_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateSecurityGroupRuleOptions : Instantiate UpdateSecurityGroupRuleOptions
func (*VpcV1) NewUpdateSecurityGroupRuleOptions(securityGroupID string, id string, securityGroupRulePatch map[string]interface{}) *UpdateSecurityGroupRuleOptions {
	return &UpdateSecurityGroupRuleOptions{
		SecurityGroupID:        core.StringPtr(securityGroupID),
		ID:                     core.StringPtr(id),
		SecurityGroupRulePatch: securityGroupRulePatch,
	}
}

// SetSecurityGroupID : Allow user to set SecurityGroupID
func (_options *UpdateSecurityGroupRuleOptions) SetSecurityGroupID(securityGroupID string) *UpdateSecurityGroupRuleOptions {
	_options.SecurityGroupID = core.StringPtr(securityGroupID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateSecurityGroupRuleOptions) SetID(id string) *UpdateSecurityGroupRuleOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSecurityGroupRulePatch : Allow user to set SecurityGroupRulePatch
func (_options *UpdateSecurityGroupRuleOptions) SetSecurityGroupRulePatch(securityGroupRulePatch map[string]interface{}) *UpdateSecurityGroupRuleOptions {
	_options.SecurityGroupRulePatch = securityGroupRulePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateSecurityGroupRuleOptions) SetHeaders(param map[string]string) *UpdateSecurityGroupRuleOptions {
	options.Headers = param
	return options
}

// UpdateShareMountTargetOptions : The UpdateShareMountTarget options.
type UpdateShareMountTargetOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The file share mount target identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The share mount target patch.
	ShareMountTargetPatch map[string]interface{} `json:"ShareMountTarget_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateShareMountTargetOptions : Instantiate UpdateShareMountTargetOptions
func (*VpcV1) NewUpdateShareMountTargetOptions(shareID string, id string, shareMountTargetPatch map[string]interface{}) *UpdateShareMountTargetOptions {
	return &UpdateShareMountTargetOptions{
		ShareID:               core.StringPtr(shareID),
		ID:                    core.StringPtr(id),
		ShareMountTargetPatch: shareMountTargetPatch,
	}
}

// SetShareID : Allow user to set ShareID
func (_options *UpdateShareMountTargetOptions) SetShareID(shareID string) *UpdateShareMountTargetOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateShareMountTargetOptions) SetID(id string) *UpdateShareMountTargetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetShareMountTargetPatch : Allow user to set ShareMountTargetPatch
func (_options *UpdateShareMountTargetOptions) SetShareMountTargetPatch(shareMountTargetPatch map[string]interface{}) *UpdateShareMountTargetOptions {
	_options.ShareMountTargetPatch = shareMountTargetPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateShareMountTargetOptions) SetHeaders(param map[string]string) *UpdateShareMountTargetOptions {
	options.Headers = param
	return options
}

// UpdateShareOptions : The UpdateShare options.
type UpdateShareOptions struct {
	// The file share identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The file share patch.
	SharePatch map[string]interface{} `json:"Share_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateShareOptions : Instantiate UpdateShareOptions
func (*VpcV1) NewUpdateShareOptions(id string, sharePatch map[string]interface{}) *UpdateShareOptions {
	return &UpdateShareOptions{
		ID:         core.StringPtr(id),
		SharePatch: sharePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateShareOptions) SetID(id string) *UpdateShareOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSharePatch : Allow user to set SharePatch
func (_options *UpdateShareOptions) SetSharePatch(sharePatch map[string]interface{}) *UpdateShareOptions {
	_options.SharePatch = sharePatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateShareOptions) SetIfMatch(ifMatch string) *UpdateShareOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateShareOptions) SetHeaders(param map[string]string) *UpdateShareOptions {
	options.Headers = param
	return options
}

// UpdateShareSnapshotOptions : The UpdateShareSnapshot options.
type UpdateShareSnapshotOptions struct {
	// The file share identifier.
	ShareID *string `json:"share_id" validate:"required,ne="`

	// The share snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The share snapshot patch.
	ShareSnapshotPatch map[string]interface{} `json:"ShareSnapshot_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateShareSnapshotOptions : Instantiate UpdateShareSnapshotOptions
func (*VpcV1) NewUpdateShareSnapshotOptions(shareID string, id string, shareSnapshotPatch map[string]interface{}) *UpdateShareSnapshotOptions {
	return &UpdateShareSnapshotOptions{
		ShareID:            core.StringPtr(shareID),
		ID:                 core.StringPtr(id),
		ShareSnapshotPatch: shareSnapshotPatch,
	}
}

// SetShareID : Allow user to set ShareID
func (_options *UpdateShareSnapshotOptions) SetShareID(shareID string) *UpdateShareSnapshotOptions {
	_options.ShareID = core.StringPtr(shareID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateShareSnapshotOptions) SetID(id string) *UpdateShareSnapshotOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetShareSnapshotPatch : Allow user to set ShareSnapshotPatch
func (_options *UpdateShareSnapshotOptions) SetShareSnapshotPatch(shareSnapshotPatch map[string]interface{}) *UpdateShareSnapshotOptions {
	_options.ShareSnapshotPatch = shareSnapshotPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateShareSnapshotOptions) SetIfMatch(ifMatch string) *UpdateShareSnapshotOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateShareSnapshotOptions) SetHeaders(param map[string]string) *UpdateShareSnapshotOptions {
	options.Headers = param
	return options
}

// UpdateSnapshotConsistencyGroupOptions : The UpdateSnapshotConsistencyGroup options.
type UpdateSnapshotConsistencyGroupOptions struct {
	// The snapshot consistency group identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The snapshot consistency group patch.
	SnapshotConsistencyGroupPatch map[string]interface{} `json:"SnapshotConsistencyGroup_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateSnapshotConsistencyGroupOptions : Instantiate UpdateSnapshotConsistencyGroupOptions
func (*VpcV1) NewUpdateSnapshotConsistencyGroupOptions(id string, snapshotConsistencyGroupPatch map[string]interface{}) *UpdateSnapshotConsistencyGroupOptions {
	return &UpdateSnapshotConsistencyGroupOptions{
		ID:                            core.StringPtr(id),
		SnapshotConsistencyGroupPatch: snapshotConsistencyGroupPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateSnapshotConsistencyGroupOptions) SetID(id string) *UpdateSnapshotConsistencyGroupOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSnapshotConsistencyGroupPatch : Allow user to set SnapshotConsistencyGroupPatch
func (_options *UpdateSnapshotConsistencyGroupOptions) SetSnapshotConsistencyGroupPatch(snapshotConsistencyGroupPatch map[string]interface{}) *UpdateSnapshotConsistencyGroupOptions {
	_options.SnapshotConsistencyGroupPatch = snapshotConsistencyGroupPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateSnapshotConsistencyGroupOptions) SetIfMatch(ifMatch string) *UpdateSnapshotConsistencyGroupOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateSnapshotConsistencyGroupOptions) SetHeaders(param map[string]string) *UpdateSnapshotConsistencyGroupOptions {
	options.Headers = param
	return options
}

// UpdateSnapshotOptions : The UpdateSnapshot options.
type UpdateSnapshotOptions struct {
	// The snapshot identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The snapshot patch.
	SnapshotPatch map[string]interface{} `json:"Snapshot_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateSnapshotOptions : Instantiate UpdateSnapshotOptions
func (*VpcV1) NewUpdateSnapshotOptions(id string, snapshotPatch map[string]interface{}) *UpdateSnapshotOptions {
	return &UpdateSnapshotOptions{
		ID:            core.StringPtr(id),
		SnapshotPatch: snapshotPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateSnapshotOptions) SetID(id string) *UpdateSnapshotOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSnapshotPatch : Allow user to set SnapshotPatch
func (_options *UpdateSnapshotOptions) SetSnapshotPatch(snapshotPatch map[string]interface{}) *UpdateSnapshotOptions {
	_options.SnapshotPatch = snapshotPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateSnapshotOptions) SetIfMatch(ifMatch string) *UpdateSnapshotOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateSnapshotOptions) SetHeaders(param map[string]string) *UpdateSnapshotOptions {
	options.Headers = param
	return options
}

// UpdateSubnetOptions : The UpdateSubnet options.
type UpdateSubnetOptions struct {
	// The subnet identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The subnet patch.
	SubnetPatch map[string]interface{} `json:"Subnet_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateSubnetOptions : Instantiate UpdateSubnetOptions
func (*VpcV1) NewUpdateSubnetOptions(id string, subnetPatch map[string]interface{}) *UpdateSubnetOptions {
	return &UpdateSubnetOptions{
		ID:          core.StringPtr(id),
		SubnetPatch: subnetPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateSubnetOptions) SetID(id string) *UpdateSubnetOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetSubnetPatch : Allow user to set SubnetPatch
func (_options *UpdateSubnetOptions) SetSubnetPatch(subnetPatch map[string]interface{}) *UpdateSubnetOptions {
	_options.SubnetPatch = subnetPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateSubnetOptions) SetHeaders(param map[string]string) *UpdateSubnetOptions {
	options.Headers = param
	return options
}

// UpdateSubnetReservedIPOptions : The UpdateSubnetReservedIP options.
type UpdateSubnetReservedIPOptions struct {
	// The subnet identifier.
	SubnetID *string `json:"subnet_id" validate:"required,ne="`

	// The reserved IP identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The reserved IP patch.
	ReservedIPPatch map[string]interface{} `json:"ReservedIP_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateSubnetReservedIPOptions : Instantiate UpdateSubnetReservedIPOptions
func (*VpcV1) NewUpdateSubnetReservedIPOptions(subnetID string, id string, reservedIPPatch map[string]interface{}) *UpdateSubnetReservedIPOptions {
	return &UpdateSubnetReservedIPOptions{
		SubnetID:        core.StringPtr(subnetID),
		ID:              core.StringPtr(id),
		ReservedIPPatch: reservedIPPatch,
	}
}

// SetSubnetID : Allow user to set SubnetID
func (_options *UpdateSubnetReservedIPOptions) SetSubnetID(subnetID string) *UpdateSubnetReservedIPOptions {
	_options.SubnetID = core.StringPtr(subnetID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateSubnetReservedIPOptions) SetID(id string) *UpdateSubnetReservedIPOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetReservedIPPatch : Allow user to set ReservedIPPatch
func (_options *UpdateSubnetReservedIPOptions) SetReservedIPPatch(reservedIPPatch map[string]interface{}) *UpdateSubnetReservedIPOptions {
	_options.ReservedIPPatch = reservedIPPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateSubnetReservedIPOptions) SetHeaders(param map[string]string) *UpdateSubnetReservedIPOptions {
	options.Headers = param
	return options
}

// UpdateVirtualNetworkInterfaceOptions : The UpdateVirtualNetworkInterface options.
type UpdateVirtualNetworkInterfaceOptions struct {
	// The virtual network interface identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The virtual network interface patch.
	VirtualNetworkInterfacePatch map[string]interface{} `json:"VirtualNetworkInterface_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVirtualNetworkInterfaceOptions : Instantiate UpdateVirtualNetworkInterfaceOptions
func (*VpcV1) NewUpdateVirtualNetworkInterfaceOptions(id string, virtualNetworkInterfacePatch map[string]interface{}) *UpdateVirtualNetworkInterfaceOptions {
	return &UpdateVirtualNetworkInterfaceOptions{
		ID:                           core.StringPtr(id),
		VirtualNetworkInterfacePatch: virtualNetworkInterfacePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateVirtualNetworkInterfaceOptions) SetID(id string) *UpdateVirtualNetworkInterfaceOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVirtualNetworkInterfacePatch : Allow user to set VirtualNetworkInterfacePatch
func (_options *UpdateVirtualNetworkInterfaceOptions) SetVirtualNetworkInterfacePatch(virtualNetworkInterfacePatch map[string]interface{}) *UpdateVirtualNetworkInterfaceOptions {
	_options.VirtualNetworkInterfacePatch = virtualNetworkInterfacePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVirtualNetworkInterfaceOptions) SetHeaders(param map[string]string) *UpdateVirtualNetworkInterfaceOptions {
	options.Headers = param
	return options
}

// UpdateVolumeOptions : The UpdateVolume options.
type UpdateVolumeOptions struct {
	// The volume identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The volume patch.
	VolumePatch map[string]interface{} `json:"Volume_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVolumeOptions : Instantiate UpdateVolumeOptions
func (*VpcV1) NewUpdateVolumeOptions(id string, volumePatch map[string]interface{}) *UpdateVolumeOptions {
	return &UpdateVolumeOptions{
		ID:          core.StringPtr(id),
		VolumePatch: volumePatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateVolumeOptions) SetID(id string) *UpdateVolumeOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVolumePatch : Allow user to set VolumePatch
func (_options *UpdateVolumeOptions) SetVolumePatch(volumePatch map[string]interface{}) *UpdateVolumeOptions {
	_options.VolumePatch = volumePatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateVolumeOptions) SetIfMatch(ifMatch string) *UpdateVolumeOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVolumeOptions) SetHeaders(param map[string]string) *UpdateVolumeOptions {
	options.Headers = param
	return options
}

// UpdateVPCAddressPrefixOptions : The UpdateVPCAddressPrefix options.
type UpdateVPCAddressPrefixOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The prefix identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The prefix patch.
	AddressPrefixPatch map[string]interface{} `json:"AddressPrefix_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPCAddressPrefixOptions : Instantiate UpdateVPCAddressPrefixOptions
func (*VpcV1) NewUpdateVPCAddressPrefixOptions(vpcID string, id string, addressPrefixPatch map[string]interface{}) *UpdateVPCAddressPrefixOptions {
	return &UpdateVPCAddressPrefixOptions{
		VPCID:              core.StringPtr(vpcID),
		ID:                 core.StringPtr(id),
		AddressPrefixPatch: addressPrefixPatch,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *UpdateVPCAddressPrefixOptions) SetVPCID(vpcID string) *UpdateVPCAddressPrefixOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPCAddressPrefixOptions) SetID(id string) *UpdateVPCAddressPrefixOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetAddressPrefixPatch : Allow user to set AddressPrefixPatch
func (_options *UpdateVPCAddressPrefixOptions) SetAddressPrefixPatch(addressPrefixPatch map[string]interface{}) *UpdateVPCAddressPrefixOptions {
	_options.AddressPrefixPatch = addressPrefixPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPCAddressPrefixOptions) SetHeaders(param map[string]string) *UpdateVPCAddressPrefixOptions {
	options.Headers = param
	return options
}

// UpdateVPCDnsResolutionBindingOptions : The UpdateVPCDnsResolutionBinding options.
type UpdateVPCDnsResolutionBindingOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The DNS resolution binding identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The DNS resolution binding patch.
	VpcdnsResolutionBindingPatch map[string]interface{} `json:"VpcdnsResolutionBinding_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPCDnsResolutionBindingOptions : Instantiate UpdateVPCDnsResolutionBindingOptions
func (*VpcV1) NewUpdateVPCDnsResolutionBindingOptions(vpcID string, id string, vpcdnsResolutionBindingPatch map[string]interface{}) *UpdateVPCDnsResolutionBindingOptions {
	return &UpdateVPCDnsResolutionBindingOptions{
		VPCID:                        core.StringPtr(vpcID),
		ID:                           core.StringPtr(id),
		VpcdnsResolutionBindingPatch: vpcdnsResolutionBindingPatch,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *UpdateVPCDnsResolutionBindingOptions) SetVPCID(vpcID string) *UpdateVPCDnsResolutionBindingOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPCDnsResolutionBindingOptions) SetID(id string) *UpdateVPCDnsResolutionBindingOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVpcdnsResolutionBindingPatch : Allow user to set VpcdnsResolutionBindingPatch
func (_options *UpdateVPCDnsResolutionBindingOptions) SetVpcdnsResolutionBindingPatch(vpcdnsResolutionBindingPatch map[string]interface{}) *UpdateVPCDnsResolutionBindingOptions {
	_options.VpcdnsResolutionBindingPatch = vpcdnsResolutionBindingPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPCDnsResolutionBindingOptions) SetHeaders(param map[string]string) *UpdateVPCDnsResolutionBindingOptions {
	options.Headers = param
	return options
}

// UpdateVPCOptions : The UpdateVPC options.
type UpdateVPCOptions struct {
	// The VPC identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The VPC patch.
	VPCPatch map[string]interface{} `json:"VPC_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPCOptions : Instantiate UpdateVPCOptions
func (*VpcV1) NewUpdateVPCOptions(id string, vpcPatch map[string]interface{}) *UpdateVPCOptions {
	return &UpdateVPCOptions{
		ID:       core.StringPtr(id),
		VPCPatch: vpcPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateVPCOptions) SetID(id string) *UpdateVPCOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVPCPatch : Allow user to set VPCPatch
func (_options *UpdateVPCOptions) SetVPCPatch(vpcPatch map[string]interface{}) *UpdateVPCOptions {
	_options.VPCPatch = vpcPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateVPCOptions) SetIfMatch(ifMatch string) *UpdateVPCOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPCOptions) SetHeaders(param map[string]string) *UpdateVPCOptions {
	options.Headers = param
	return options
}

// UpdateVPCRouteOptions : The UpdateVPCRoute options.
type UpdateVPCRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The route patch.
	RoutePatch map[string]interface{} `json:"Route_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPCRouteOptions : Instantiate UpdateVPCRouteOptions
func (*VpcV1) NewUpdateVPCRouteOptions(vpcID string, id string, routePatch map[string]interface{}) *UpdateVPCRouteOptions {
	return &UpdateVPCRouteOptions{
		VPCID:      core.StringPtr(vpcID),
		ID:         core.StringPtr(id),
		RoutePatch: routePatch,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *UpdateVPCRouteOptions) SetVPCID(vpcID string) *UpdateVPCRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPCRouteOptions) SetID(id string) *UpdateVPCRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetRoutePatch : Allow user to set RoutePatch
func (_options *UpdateVPCRouteOptions) SetRoutePatch(routePatch map[string]interface{}) *UpdateVPCRouteOptions {
	_options.RoutePatch = routePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPCRouteOptions) SetHeaders(param map[string]string) *UpdateVPCRouteOptions {
	options.Headers = param
	return options
}

// UpdateVPCRoutingTableOptions : The UpdateVPCRoutingTable options.
type UpdateVPCRoutingTableOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The routing table patch.
	RoutingTablePatch map[string]interface{} `json:"RoutingTable_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPCRoutingTableOptions : Instantiate UpdateVPCRoutingTableOptions
func (*VpcV1) NewUpdateVPCRoutingTableOptions(vpcID string, id string, routingTablePatch map[string]interface{}) *UpdateVPCRoutingTableOptions {
	return &UpdateVPCRoutingTableOptions{
		VPCID:             core.StringPtr(vpcID),
		ID:                core.StringPtr(id),
		RoutingTablePatch: routingTablePatch,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *UpdateVPCRoutingTableOptions) SetVPCID(vpcID string) *UpdateVPCRoutingTableOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPCRoutingTableOptions) SetID(id string) *UpdateVPCRoutingTableOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetRoutingTablePatch : Allow user to set RoutingTablePatch
func (_options *UpdateVPCRoutingTableOptions) SetRoutingTablePatch(routingTablePatch map[string]interface{}) *UpdateVPCRoutingTableOptions {
	_options.RoutingTablePatch = routingTablePatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateVPCRoutingTableOptions) SetIfMatch(ifMatch string) *UpdateVPCRoutingTableOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPCRoutingTableOptions) SetHeaders(param map[string]string) *UpdateVPCRoutingTableOptions {
	options.Headers = param
	return options
}

// UpdateVPCRoutingTableRouteOptions : The UpdateVPCRoutingTableRoute options.
type UpdateVPCRoutingTableRouteOptions struct {
	// The VPC identifier.
	VPCID *string `json:"vpc_id" validate:"required,ne="`

	// The routing table identifier.
	RoutingTableID *string `json:"routing_table_id" validate:"required,ne="`

	// The VPC routing table route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The VPC route patch.
	RoutePatch map[string]interface{} `json:"Route_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPCRoutingTableRouteOptions : Instantiate UpdateVPCRoutingTableRouteOptions
func (*VpcV1) NewUpdateVPCRoutingTableRouteOptions(vpcID string, routingTableID string, id string, routePatch map[string]interface{}) *UpdateVPCRoutingTableRouteOptions {
	return &UpdateVPCRoutingTableRouteOptions{
		VPCID:          core.StringPtr(vpcID),
		RoutingTableID: core.StringPtr(routingTableID),
		ID:             core.StringPtr(id),
		RoutePatch:     routePatch,
	}
}

// SetVPCID : Allow user to set VPCID
func (_options *UpdateVPCRoutingTableRouteOptions) SetVPCID(vpcID string) *UpdateVPCRoutingTableRouteOptions {
	_options.VPCID = core.StringPtr(vpcID)
	return _options
}

// SetRoutingTableID : Allow user to set RoutingTableID
func (_options *UpdateVPCRoutingTableRouteOptions) SetRoutingTableID(routingTableID string) *UpdateVPCRoutingTableRouteOptions {
	_options.RoutingTableID = core.StringPtr(routingTableID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPCRoutingTableRouteOptions) SetID(id string) *UpdateVPCRoutingTableRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetRoutePatch : Allow user to set RoutePatch
func (_options *UpdateVPCRoutingTableRouteOptions) SetRoutePatch(routePatch map[string]interface{}) *UpdateVPCRoutingTableRouteOptions {
	_options.RoutePatch = routePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPCRoutingTableRouteOptions) SetHeaders(param map[string]string) *UpdateVPCRoutingTableRouteOptions {
	options.Headers = param
	return options
}

// UpdateVPNGatewayConnectionOptions : The UpdateVPNGatewayConnection options.
type UpdateVPNGatewayConnectionOptions struct {
	// The VPN gateway identifier.
	VPNGatewayID *string `json:"vpn_gateway_id" validate:"required,ne="`

	// The VPN gateway connection identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The VPN gateway connection patch.
	VPNGatewayConnectionPatch map[string]interface{} `json:"VPNGatewayConnection_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPNGatewayConnectionOptions : Instantiate UpdateVPNGatewayConnectionOptions
func (*VpcV1) NewUpdateVPNGatewayConnectionOptions(vpnGatewayID string, id string, vpnGatewayConnectionPatch map[string]interface{}) *UpdateVPNGatewayConnectionOptions {
	return &UpdateVPNGatewayConnectionOptions{
		VPNGatewayID:              core.StringPtr(vpnGatewayID),
		ID:                        core.StringPtr(id),
		VPNGatewayConnectionPatch: vpnGatewayConnectionPatch,
	}
}

// SetVPNGatewayID : Allow user to set VPNGatewayID
func (_options *UpdateVPNGatewayConnectionOptions) SetVPNGatewayID(vpnGatewayID string) *UpdateVPNGatewayConnectionOptions {
	_options.VPNGatewayID = core.StringPtr(vpnGatewayID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPNGatewayConnectionOptions) SetID(id string) *UpdateVPNGatewayConnectionOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVPNGatewayConnectionPatch : Allow user to set VPNGatewayConnectionPatch
func (_options *UpdateVPNGatewayConnectionOptions) SetVPNGatewayConnectionPatch(vpnGatewayConnectionPatch map[string]interface{}) *UpdateVPNGatewayConnectionOptions {
	_options.VPNGatewayConnectionPatch = vpnGatewayConnectionPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPNGatewayConnectionOptions) SetHeaders(param map[string]string) *UpdateVPNGatewayConnectionOptions {
	options.Headers = param
	return options
}

// UpdateVPNGatewayOptions : The UpdateVPNGateway options.
type UpdateVPNGatewayOptions struct {
	// The VPN gateway identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The VPN gateway patch.
	VPNGatewayPatch map[string]interface{} `json:"VPNGateway_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPNGatewayOptions : Instantiate UpdateVPNGatewayOptions
func (*VpcV1) NewUpdateVPNGatewayOptions(id string, vpnGatewayPatch map[string]interface{}) *UpdateVPNGatewayOptions {
	return &UpdateVPNGatewayOptions{
		ID:              core.StringPtr(id),
		VPNGatewayPatch: vpnGatewayPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateVPNGatewayOptions) SetID(id string) *UpdateVPNGatewayOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVPNGatewayPatch : Allow user to set VPNGatewayPatch
func (_options *UpdateVPNGatewayOptions) SetVPNGatewayPatch(vpnGatewayPatch map[string]interface{}) *UpdateVPNGatewayOptions {
	_options.VPNGatewayPatch = vpnGatewayPatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPNGatewayOptions) SetHeaders(param map[string]string) *UpdateVPNGatewayOptions {
	options.Headers = param
	return options
}

// UpdateVPNServerOptions : The UpdateVPNServer options.
type UpdateVPNServerOptions struct {
	// The VPN server identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The VPN server patch.
	VPNServerPatch map[string]interface{} `json:"VPNServer_patch" validate:"required"`

	// If present, the request will fail if the specified ETag value does not match the resource's current ETag value.
	// Required if the request body includes an array.
	IfMatch *string `json:"If-Match,omitempty"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPNServerOptions : Instantiate UpdateVPNServerOptions
func (*VpcV1) NewUpdateVPNServerOptions(id string, vpnServerPatch map[string]interface{}) *UpdateVPNServerOptions {
	return &UpdateVPNServerOptions{
		ID:             core.StringPtr(id),
		VPNServerPatch: vpnServerPatch,
	}
}

// SetID : Allow user to set ID
func (_options *UpdateVPNServerOptions) SetID(id string) *UpdateVPNServerOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVPNServerPatch : Allow user to set VPNServerPatch
func (_options *UpdateVPNServerOptions) SetVPNServerPatch(vpnServerPatch map[string]interface{}) *UpdateVPNServerOptions {
	_options.VPNServerPatch = vpnServerPatch
	return _options
}

// SetIfMatch : Allow user to set IfMatch
func (_options *UpdateVPNServerOptions) SetIfMatch(ifMatch string) *UpdateVPNServerOptions {
	_options.IfMatch = core.StringPtr(ifMatch)
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPNServerOptions) SetHeaders(param map[string]string) *UpdateVPNServerOptions {
	options.Headers = param
	return options
}

// UpdateVPNServerRouteOptions : The UpdateVPNServerRoute options.
type UpdateVPNServerRouteOptions struct {
	// The VPN server identifier.
	VPNServerID *string `json:"vpn_server_id" validate:"required,ne="`

	// The VPN route identifier.
	ID *string `json:"id" validate:"required,ne="`

	// The VPN route patch.
	VPNServerRoutePatch map[string]interface{} `json:"VPNServerRoute_patch" validate:"required"`

	// Allows users to set headers on API requests.
	Headers map[string]string
}

// NewUpdateVPNServerRouteOptions : Instantiate UpdateVPNServerRouteOptions
func (*VpcV1) NewUpdateVPNServerRouteOptions(vpnServerID string, id string, vpnServerRoutePatch map[string]interface{}) *UpdateVPNServerRouteOptions {
	return &UpdateVPNServerRouteOptions{
		VPNServerID:         core.StringPtr(vpnServerID),
		ID:                  core.StringPtr(id),
		VPNServerRoutePatch: vpnServerRoutePatch,
	}
}

// SetVPNServerID : Allow user to set VPNServerID
func (_options *UpdateVPNServerRouteOptions) SetVPNServerID(vpnServerID string) *UpdateVPNServerRouteOptions {
	_options.VPNServerID = core.StringPtr(vpnServerID)
	return _options
}

// SetID : Allow user to set ID
func (_options *UpdateVPNServerRouteOptions) SetID(id string) *UpdateVPNServerRouteOptions {
	_options.ID = core.StringPtr(id)
	return _options
}

// SetVPNServerRoutePatch : Allow user to set VPNServerRoutePatch
func (_options *UpdateVPNServerRouteOptions) SetVPNServerRoutePatch(vpnServerRoutePatch map[string]interface{}) *UpdateVPNServerRouteOptions {
	_options.VPNServerRoutePatch = vpnServerRoutePatch
	return _options
}

// SetHeaders : Allow user to set Headers
func (options *UpdateVPNServerRouteOptions) SetHeaders(param map[string]string) *UpdateVPNServerRouteOptions {
	options.Headers = param
	return options
}

// Vcpu : The VCPU configuration.
type Vcpu struct {
	// The VCPU architecture.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Architecture *string `json:"architecture" validate:"required"`

	// The number of VCPUs assigned.
	Count *int64 `json:"count" validate:"required"`

	// The VCPU manufacturer.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Manufacturer *string `json:"manufacturer" validate:"required"`
}

// Constants associated with the Vcpu.Architecture property.
// The VCPU architecture.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VcpuArchitectureAmd64Const = "amd64"
	VcpuArchitectureS390xConst = "s390x"
)

// Constants associated with the Vcpu.Manufacturer property.
// The VCPU manufacturer.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VcpuManufacturerAmdConst   = "amd"
	VcpuManufacturerIBMConst   = "ibm"
	VcpuManufacturerIntelConst = "intel"
)

// UnmarshalVcpu unmarshals an instance of Vcpu from the specified map of raw messages.
func UnmarshalVcpu(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Vcpu)
	err = core.UnmarshalPrimitive(m, "architecture", &obj.Architecture)
	if err != nil {
		err = core.SDKErrorf(err, "", "architecture-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "count", &obj.Count)
	if err != nil {
		err = core.SDKErrorf(err, "", "count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "manufacturer", &obj.Manufacturer)
	if err != nil {
		err = core.SDKErrorf(err, "", "manufacturer-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPC : VPC struct
type VPC struct {
	// Indicates whether this VPC is connected to Classic Infrastructure. If true, this VPC's resources have private
	// network connectivity to the account's Classic Infrastructure resources. Only one VPC, per region, may be connected
	// in this way. This value is set at creation and subsequently immutable.
	ClassicAccess *bool `json:"classic_access" validate:"required"`

	// The date and time that the VPC was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this VPC.
	CRN *string `json:"crn" validate:"required"`

	// The CSE ([Cloud Service Endpoint](https://cloud.ibm.com/docs/account?topic=account-service-endpoints-overview))
	// source IP addresses for the VPC. The VPC will have at least one CSE source IP address per zone.
	//
	// The maximum number of items for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	CseSourceIps []VpccseSourceIP `json:"cse_source_ips,omitempty"`

	// The default network ACL to use for subnets created in this VPC.
	DefaultNetworkACL *NetworkACLReference `json:"default_network_acl" validate:"required"`

	// The default routing table to use for subnets created in this VPC.
	DefaultRoutingTable *RoutingTableReference `json:"default_routing_table" validate:"required"`

	// The default security group for this VPC. Resources created in this VPC that allow
	// a security group to be optionally specified will use this security group by
	// default.
	DefaultSecurityGroup *SecurityGroupReference `json:"default_security_group" validate:"required"`

	// The DNS configuration for this VPC.
	Dns *Vpcdns `json:"dns" validate:"required"`

	// The reasons for the current `health_state` (if any).
	HealthReasons []VPCHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this VPC.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPC.
	ID *string `json:"id" validate:"required"`

	// The name for this VPC. The name is unique across all VPCs in the region.
	Name *string `json:"name" validate:"required"`

	// The public address ranges attached to this VPC.
	PublicAddressRanges []PublicAddressRangeReference `json:"public_address_ranges" validate:"required"`

	// The resource group for this VPC.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of this VPC.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`
}

// Constants associated with the VPC.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	VPCHealthStateDegradedConst     = "degraded"
	VPCHealthStateFaultedConst      = "faulted"
	VPCHealthStateInapplicableConst = "inapplicable"
	VPCHealthStateOkConst           = "ok"
)

// Constants associated with the VPC.ResourceType property.
// The resource type.
const (
	VPCResourceTypeVPCConst = "vpc"
)

// Constants associated with the VPC.Status property.
// The status of this VPC.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPCStatusAvailableConst = "available"
	VPCStatusDeletingConst  = "deleting"
	VPCStatusFailedConst    = "failed"
	VPCStatusPendingConst   = "pending"
)

// UnmarshalVPC unmarshals an instance of VPC from the specified map of raw messages.
func UnmarshalVPC(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPC)
	err = core.UnmarshalPrimitive(m, "classic_access", &obj.ClassicAccess)
	if err != nil {
		err = core.SDKErrorf(err, "", "classic_access-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "cse_source_ips", &obj.CseSourceIps, UnmarshalVpccseSourceIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "cse_source_ips-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_network_acl", &obj.DefaultNetworkACL, UnmarshalNetworkACLReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_network_acl-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_routing_table", &obj.DefaultRoutingTable, UnmarshalRoutingTableReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_routing_table-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "default_security_group", &obj.DefaultSecurityGroup, UnmarshalSecurityGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "default_security_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "dns", &obj.Dns, UnmarshalVpcdns)
	if err != nil {
		err = core.SDKErrorf(err, "", "dns-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalVPCHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_address_ranges", &obj.PublicAddressRanges, UnmarshalPublicAddressRangeReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_address_ranges-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpccseSourceIP : VpccseSourceIP struct
type VpccseSourceIP struct {
	// A cloud service endpoint source IP address for this zone.
	IP *IP `json:"ip" validate:"required"`

	// The zone this cloud service endpoint source IP resides in.
	Zone *ZoneReference `json:"zone" validate:"required"`
}

// UnmarshalVpccseSourceIP unmarshals an instance of VpccseSourceIP from the specified map of raw messages.
func UnmarshalVpccseSourceIP(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpccseSourceIP)
	err = core.UnmarshalModel(m, "ip", &obj.IP, UnmarshalIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "zone", &obj.Zone, UnmarshalZoneReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "zone-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPCCollection : VPCCollection struct
type VPCCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`

	// A page of VPCs.
	Vpcs []VPC `json:"vpcs" validate:"required"`
}

// UnmarshalVPCCollection unmarshals an instance of VPCCollection from the specified map of raw messages.
func UnmarshalVPCCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpcs", &obj.Vpcs, UnmarshalVPC)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpcs-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *VPCCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// Vpcdns : The DNS configuration for this VPC.
type Vpcdns struct {
	// Indicates whether this VPC is enabled as a DNS name resolution hub.
	EnableHub *bool `json:"enable_hub" validate:"required"`

	// The number of DNS resolution bindings for this VPC.
	ResolutionBindingCount *int64 `json:"resolution_binding_count" validate:"required"`

	// The DNS resolver configuration for the VPC.
	Resolver VpcdnsResolverIntf `json:"resolver" validate:"required"`
}

// UnmarshalVpcdns unmarshals an instance of Vpcdns from the specified map of raw messages.
func UnmarshalVpcdns(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(Vpcdns)
	err = core.UnmarshalPrimitive(m, "enable_hub", &obj.EnableHub)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_hub-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resolution_binding_count", &obj.ResolutionBindingCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "resolution_binding_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resolver", &obj.Resolver, UnmarshalVpcdnsResolver)
	if err != nil {
		err = core.SDKErrorf(err, "", "resolver-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpcdnsPatch : The DNS configuration for this VPC.
type VpcdnsPatch struct {
	// Indicates whether this VPC is enabled as a DNS name resolution hub.
	//
	// Updating the value to `true` requires `allow_dns_resolution_binding` to be `true` for all endpoint gateways residing
	// in this VPC.
	//
	// Changing the value requires `dns.resolution_binding_count` to be zero.
	EnableHub *bool `json:"enable_hub,omitempty"`

	Resolver *VpcdnsResolverPatch `json:"resolver,omitempty"`
}

// UnmarshalVpcdnsPatch unmarshals an instance of VpcdnsPatch from the specified map of raw messages.
func UnmarshalVpcdnsPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsPatch)
	err = core.UnmarshalPrimitive(m, "enable_hub", &obj.EnableHub)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_hub-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resolver", &obj.Resolver, UnmarshalVpcdnsResolverPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "resolver-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VpcdnsPatch
func (vpcdnsPatch *VpcdnsPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpcdnsPatch.EnableHub) {
		_patch["enable_hub"] = vpcdnsPatch.EnableHub
	}
	if !core.IsNil(vpcdnsPatch.Resolver) {
		_patch["resolver"] = vpcdnsPatch.Resolver.asPatch()
	}

	return
}

// VpcdnsPrototype : The DNS configuration for this VPC.
//
// If unspecified, the system will assign DNS servers capable of resolving hosts and endpoint gateways within this VPC,
// and hosts on the internet.
type VpcdnsPrototype struct {
	// Indicates whether this VPC is enabled as a DNS name resolution hub.
	EnableHub *bool `json:"enable_hub,omitempty"`

	Resolver VpcdnsResolverPrototypeIntf `json:"resolver,omitempty"`
}

// UnmarshalVpcdnsPrototype unmarshals an instance of VpcdnsPrototype from the specified map of raw messages.
func UnmarshalVpcdnsPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsPrototype)
	err = core.UnmarshalPrimitive(m, "enable_hub", &obj.EnableHub)
	if err != nil {
		err = core.SDKErrorf(err, "", "enable_hub-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resolver", &obj.Resolver, UnmarshalVpcdnsResolverPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "resolver-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpcdnsResolutionBinding : VpcdnsResolutionBinding struct
type VpcdnsResolutionBinding struct {
	// The date and time that the DNS resolution binding was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The endpoint gateways that have `allow_dns_resolution_binding` set to `true` and reside in the VPC that has
	// `dns.enable_hub` set to `false`.
	//
	// The endpoint gateways may be remote and therefore may not be directly retrievable.
	EndpointGateways []EndpointGatewayReferenceRemote `json:"endpoint_gateways" validate:"required"`

	// The reasons for the current `health_state` (if any).
	HealthReasons []VpcdnsResolutionBindingHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this DNS resolution binding.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this DNS resolution binding.
	ID *string `json:"id" validate:"required"`

	// The lifecycle state of the DNS resolution binding.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The name for this DNS resolution binding. The name is unique across all DNS resolution bindings for the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The VPC bound to for DNS resolution.
	//
	// The VPC may be remote and therefore may not be directly retrievable.
	VPC *VPCReferenceRemote `json:"vpc" validate:"required"`
}

// Constants associated with the VpcdnsResolutionBinding.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	VpcdnsResolutionBindingHealthStateDegradedConst     = "degraded"
	VpcdnsResolutionBindingHealthStateFaultedConst      = "faulted"
	VpcdnsResolutionBindingHealthStateInapplicableConst = "inapplicable"
	VpcdnsResolutionBindingHealthStateOkConst           = "ok"
)

// Constants associated with the VpcdnsResolutionBinding.LifecycleState property.
// The lifecycle state of the DNS resolution binding.
const (
	VpcdnsResolutionBindingLifecycleStateDeletingConst  = "deleting"
	VpcdnsResolutionBindingLifecycleStateFailedConst    = "failed"
	VpcdnsResolutionBindingLifecycleStatePendingConst   = "pending"
	VpcdnsResolutionBindingLifecycleStateStableConst    = "stable"
	VpcdnsResolutionBindingLifecycleStateSuspendedConst = "suspended"
	VpcdnsResolutionBindingLifecycleStateUpdatingConst  = "updating"
	VpcdnsResolutionBindingLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the VpcdnsResolutionBinding.ResourceType property.
// The resource type.
const (
	VpcdnsResolutionBindingResourceTypeVPCDnsResolutionBindingConst = "vpc_dns_resolution_binding"
)

// UnmarshalVpcdnsResolutionBinding unmarshals an instance of VpcdnsResolutionBinding from the specified map of raw messages.
func UnmarshalVpcdnsResolutionBinding(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolutionBinding)
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "endpoint_gateways", &obj.EndpointGateways, UnmarshalEndpointGatewayReferenceRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "endpoint_gateways-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalVpcdnsResolutionBindingHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReferenceRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpcdnsResolutionBindingCollection : VpcdnsResolutionBindingCollection struct
type VpcdnsResolutionBindingCollection struct {
	// A page of DNS resolution bindings for the VPC.
	DnsResolutionBindings []VpcdnsResolutionBinding `json:"dns_resolution_bindings" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalVpcdnsResolutionBindingCollection unmarshals an instance of VpcdnsResolutionBindingCollection from the specified map of raw messages.
func UnmarshalVpcdnsResolutionBindingCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolutionBindingCollection)
	err = core.UnmarshalModel(m, "dns_resolution_bindings", &obj.DnsResolutionBindings, UnmarshalVpcdnsResolutionBinding)
	if err != nil {
		err = core.SDKErrorf(err, "", "dns_resolution_bindings-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *VpcdnsResolutionBindingCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// VpcdnsResolutionBindingHealthReason : VpcdnsResolutionBindingHealthReason struct
type VpcdnsResolutionBindingHealthReason struct {
	// A reason code for this health state.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VpcdnsResolutionBindingHealthReason.Code property.
// A reason code for this health state.
const (
	VpcdnsResolutionBindingHealthReasonCodeDisconnectedFromBoundVPCConst = "disconnected_from_bound_vpc"
	VpcdnsResolutionBindingHealthReasonCodeInternalErrorConst            = "internal_error"
)

// UnmarshalVpcdnsResolutionBindingHealthReason unmarshals an instance of VpcdnsResolutionBindingHealthReason from the specified map of raw messages.
func UnmarshalVpcdnsResolutionBindingHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolutionBindingHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpcdnsResolutionBindingPatch : VpcdnsResolutionBindingPatch struct
type VpcdnsResolutionBindingPatch struct {
	// The name for this DNS resolution binding. The name must not be used by another DNS resolution binding for the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalVpcdnsResolutionBindingPatch unmarshals an instance of VpcdnsResolutionBindingPatch from the specified map of raw messages.
func UnmarshalVpcdnsResolutionBindingPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolutionBindingPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the VpcdnsResolutionBindingPatch
func (vpcdnsResolutionBindingPatch *VpcdnsResolutionBindingPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpcdnsResolutionBindingPatch.Name) {
		_patch["name"] = vpcdnsResolutionBindingPatch.Name
	}

	return
}

// VpcdnsResolver : VpcdnsResolver struct
// Models which "extend" this model:
// - VpcdnsResolverTypeDelegated
// - VpcdnsResolverTypeManual
// - VpcdnsResolverTypeSystem
type VpcdnsResolver struct {
	// The DNS servers for this VPC. The servers are populated:
	//
	// - by the system when `dns.resolver.type` is `system`
	// - using the DNS servers in `dns.resolver.vpc` when `dns.resolver.type` is `delegated`
	// - using `dns.resolver.manual_servers` when the `dns.resolver.type` is `manual`
	//
	// The maximum number of DNS servers is expected to
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Servers []DnsServer `json:"servers" validate:"required"`

	// The type of the DNS resolver used for the VPC.
	//
	// - `delegated`: DNS server addresses are provided by the DNS resolver of the VPC
	//                specified in `dns.resolver.vpc`.
	// - `manual`: DNS server addresses are specified in `dns.resolver.manual_servers`.
	// - `system`: DNS server addresses are provided by the system.
	//
	// The maximum number of DNS servers is expected to
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`

	// The VPC whose DNS resolver provides the DNS server addresses for this VPC.
	//
	// The VPC may be remote and therefore may not be directly retrievable.
	VPC *VPCReferenceDnsResolverContext `json:"vpc,omitempty"`

	// The manually specified DNS servers for this VPC.
	//
	// If the DNS servers have `zone_affinity`, the DHCP [Domain Name Server
	// Option](https://datatracker.ietf.org/doc/html/rfc2132#section-3.8) for a zone will list the DNS server with the
	// affinity for that zone first, followed by the unique DNS servers from other zones.
	//
	// If the DNS servers do not have `zone_affinity`, the DHCP [Domain Name Server
	// Option](https://datatracker.ietf.org/doc/html/rfc2132#section-3.8) for each zone will list all the manual DNS
	// servers in the order specified.
	//
	// The maximum number of manual DNS servers is expected to
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	ManualServers []DnsServer `json:"manual_servers,omitempty"`

	// The configuration of the system DNS resolver for this VPC.
	//
	// - `custom_resolver`: A custom DNS resolver is configured for this VPC.
	//
	// - `private_resolver`: A private DNS resolver is configured for this VPC. Applies when
	//   the VPC has either or both of the following:
	//
	//     - at least one endpoint gateway residing in it
	//     - a [DNS Services](https://cloud.ibm.com/docs/dns-svcs) private zone configured for it
	//
	// - `default`: The provider default DNS resolvers are configured for this VPC.
	//
	//   This system DNS resolver configuration is used when the VPC has:
	//
	//   - no custom DNS resolver configured for it, and
	//   - no endpoint gateways residing in it, and
	//   - no [DNS Services](https://cloud.ibm.com/docs/dns-svcs) private zone configured for it.
	Configuration *string `json:"configuration,omitempty"`
}

// Constants associated with the VpcdnsResolver.Type property.
// The type of the DNS resolver used for the VPC.
//
//   - `delegated`: DNS server addresses are provided by the DNS resolver of the VPC
//     specified in `dns.resolver.vpc`.
//   - `manual`: DNS server addresses are specified in `dns.resolver.manual_servers`.
//   - `system`: DNS server addresses are provided by the system.
//
// The maximum number of DNS servers is expected to
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VpcdnsResolverTypeDelegatedConst = "delegated"
	VpcdnsResolverTypeManualConst    = "manual"
	VpcdnsResolverTypeSystemConst    = "system"
)

// Constants associated with the VpcdnsResolver.Configuration property.
// The configuration of the system DNS resolver for this VPC.
//
// - `custom_resolver`: A custom DNS resolver is configured for this VPC.
//
//   - `private_resolver`: A private DNS resolver is configured for this VPC. Applies when
//     the VPC has either or both of the following:
//
//   - at least one endpoint gateway residing in it
//
//   - a [DNS Services](https://cloud.ibm.com/docs/dns-svcs) private zone configured for it
//
// - `default`: The provider default DNS resolvers are configured for this VPC.
//
//	This system DNS resolver configuration is used when the VPC has:
//
//	- no custom DNS resolver configured for it, and
//	- no endpoint gateways residing in it, and
//	- no [DNS Services](https://cloud.ibm.com/docs/dns-svcs) private zone configured for it.
const (
	VpcdnsResolverConfigurationCustomResolverConst  = "custom_resolver"
	VpcdnsResolverConfigurationDefaultConst         = "default"
	VpcdnsResolverConfigurationPrivateResolverConst = "private_resolver"
)

func (*VpcdnsResolver) isaVpcdnsResolver() bool {
	return true
}

type VpcdnsResolverIntf interface {
	isaVpcdnsResolver() bool
}

// UnmarshalVpcdnsResolver unmarshals an instance of VpcdnsResolver from the specified map of raw messages.
func UnmarshalVpcdnsResolver(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolver)
	err = core.UnmarshalModel(m, "servers", &obj.Servers, UnmarshalDnsServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "servers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReferenceDnsResolverContext)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "manual_servers", &obj.ManualServers, UnmarshalDnsServer)
	if err != nil {
		err = core.SDKErrorf(err, "", "manual_servers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "configuration", &obj.Configuration)
	if err != nil {
		err = core.SDKErrorf(err, "", "configuration-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpcdnsResolverPatch : VpcdnsResolverPatch struct
type VpcdnsResolverPatch struct {
	// The DNS servers to use for this VPC, replacing any existing servers. All the DNS servers must either:
	//
	// - have a unique `zone_affinity`, or
	// - not have a `zone_affinity`.
	//
	// If `zone_affinity` is specified, exactly one DNS server must be specified for each zone in the region. The DHCP
	// [Domain Name Server Option](https://datatracker.ietf.org/doc/html/rfc2132#section-3.8) for a zone will list this DNS
	// server first, followed by unique DNS servers from other zones if available.
	//
	// If `zone_affinity` is not specified, the DHCP [Domain Name Server
	// Option](https://datatracker.ietf.org/doc/html/rfc2132#section-3.8) for each zone will list all the manual DNS
	// servers in the order specified.
	//
	// `dns.resolver.manual_servers` must be set if and only if `dns.resolver.type` is `manual`.
	ManualServers []DnsServerPrototype `json:"manual_servers,omitempty"`

	// The type of the DNS resolver to use.
	//
	// - `delegated`: DNS server addresses will be provided by the resolver for the VPC
	//                specified in `dns.resolver.vpc`. Requires `dns.enable_hub` to be
	//                `false`.
	// - `manual`: DNS server addresses are specified in `dns.resolver.manual_servers`.
	// - `system`: DNS server addresses will be provided by the system and depend on the
	//             configuration.
	//
	// Updating from `manual` requires `dns.resolver.manual_servers` to be specified as
	// `null`.
	//
	// Updating to `manual` requires `dns.resolver.manual_servers` to be specified and not empty.
	//
	// Updating from `delegated` requires `dns.resolver.vpc` to be specified as `null`.
	Type *string `json:"type,omitempty"`

	// The VPC to provide DNS server addresses for this VPC.  The specified VPC must be configured
	// with a [DNS Services](https://cloud.ibm.com/docs/dns-svcs) custom resolver and must be in
	// one of this VPC's DNS resolution bindings.
	//
	// Specify `null` to remove an existing VPC.
	//
	// This property must be set if and only if `dns.resolver.type` is `delegated`.
	VPC VpcdnsResolverVPCPatchIntf `json:"vpc,omitempty"`
}

// Constants associated with the VpcdnsResolverPatch.Type property.
// The type of the DNS resolver to use.
//
//   - `delegated`: DNS server addresses will be provided by the resolver for the VPC
//     specified in `dns.resolver.vpc`. Requires `dns.enable_hub` to be
//     `false`.
//   - `manual`: DNS server addresses are specified in `dns.resolver.manual_servers`.
//   - `system`: DNS server addresses will be provided by the system and depend on the
//     configuration.
//
// Updating from `manual` requires `dns.resolver.manual_servers` to be specified as
// `null`.
//
// Updating to `manual` requires `dns.resolver.manual_servers` to be specified and not empty.
//
// Updating from `delegated` requires `dns.resolver.vpc` to be specified as `null`.
const (
	VpcdnsResolverPatchTypeDelegatedConst = "delegated"
	VpcdnsResolverPatchTypeManualConst    = "manual"
	VpcdnsResolverPatchTypeSystemConst    = "system"
)

// UnmarshalVpcdnsResolverPatch unmarshals an instance of VpcdnsResolverPatch from the specified map of raw messages.
func UnmarshalVpcdnsResolverPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolverPatch)
	err = core.UnmarshalModel(m, "manual_servers", &obj.ManualServers, UnmarshalDnsServerPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "manual_servers-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVpcdnsResolverVPCPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VpcdnsResolverPatch
func (vpcdnsResolverPatch *VpcdnsResolverPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpcdnsResolverPatch.ManualServers) {
		var manualServersPatches []map[string]interface{}
		for _, manualServers := range vpcdnsResolverPatch.ManualServers {
			manualServersPatches = append(manualServersPatches, manualServers.asPatch())
		}
		_patch["manual_servers"] = manualServersPatches
	}
	if !core.IsNil(vpcdnsResolverPatch.Type) {
		_patch["type"] = vpcdnsResolverPatch.Type
	}
	if !core.IsNil(vpcdnsResolverPatch.VPC) {
		_patch["vpc"] = vpcdnsResolverPatch.VPC.asPatch()
	}

	return
}

// VpcdnsResolverPrototype : VpcdnsResolverPrototype struct
// Models which "extend" this model:
// - VpcdnsResolverPrototypeVpcdnsResolverTypeManualPrototype
// - VpcdnsResolverPrototypeVpcdnsResolverTypeSystemPrototype
type VpcdnsResolverPrototype struct {
	// The type of the DNS resolver to use.
	//
	// - `manual`: DNS server addresses are specified in `dns.resolver.manual_servers`.
	// - `system`: DNS server addresses will be provided by the system and depend on the
	//             configuration.
	Type *string `json:"type,omitempty"`

	// The DNS servers to use for this VPC. All the DNS servers must either:
	//
	// - have a unique `zone_affinity`, or
	// - not have a `zone_affinity`.
	//
	// If `zone_affinity` is specified, exactly one DNS server must be specified for each zone in the region. The DHCP
	// [Domain Name Server Option](https://datatracker.ietf.org/doc/html/rfc2132#section-3.8) for a zone will list this DNS
	// server first, followed by unique DNS servers from other zones if available.
	//
	// If `zone_affinity` is not specified, the DHCP [Domain Name Server
	// Option](https://datatracker.ietf.org/doc/html/rfc2132#section-3.8) for each zone will list all the manual DNS
	// servers in the order specified.
	ManualServers []DnsServerPrototype `json:"manual_servers,omitempty"`
}

// Constants associated with the VpcdnsResolverPrototype.Type property.
// The type of the DNS resolver to use.
//
//   - `manual`: DNS server addresses are specified in `dns.resolver.manual_servers`.
//   - `system`: DNS server addresses will be provided by the system and depend on the
//     configuration.
const (
	VpcdnsResolverPrototypeTypeManualConst = "manual"
	VpcdnsResolverPrototypeTypeSystemConst = "system"
)

func (*VpcdnsResolverPrototype) isaVpcdnsResolverPrototype() bool {
	return true
}

type VpcdnsResolverPrototypeIntf interface {
	isaVpcdnsResolverPrototype() bool
}

// UnmarshalVpcdnsResolverPrototype unmarshals an instance of VpcdnsResolverPrototype from the specified map of raw messages.
func UnmarshalVpcdnsResolverPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolverPrototype)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "manual_servers", &obj.ManualServers, UnmarshalDnsServerPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "manual_servers-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VpcdnsResolverVPCPatch : The VPC to provide DNS server addresses for this VPC.  The specified VPC must be configured with a [DNS
// Services](https://cloud.ibm.com/docs/dns-svcs) custom resolver and must be in one of this VPC's DNS resolution
// bindings.
//
// Specify `null` to remove an existing VPC.
//
// This property must be set if and only if `dns.resolver.type` is `delegated`.
// Models which "extend" this model:
// - VpcdnsResolverVPCPatchVPCIdentityByID
// - VpcdnsResolverVPCPatchVPCIdentityByCRN
// - VpcdnsResolverVPCPatchVPCIdentityByHref
type VpcdnsResolverVPCPatch struct {
	// The unique identifier for this VPC.
	ID *string `json:"id,omitempty"`

	// The CRN for this VPC.
	CRN *string `json:"crn,omitempty"`

	// The URL for this VPC.
	Href *string `json:"href,omitempty"`
}

func (*VpcdnsResolverVPCPatch) isaVpcdnsResolverVPCPatch() bool {
	return true
}

type VpcdnsResolverVPCPatchIntf interface {
	isaVpcdnsResolverVPCPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalVpcdnsResolverVPCPatch unmarshals an instance of VpcdnsResolverVPCPatch from the specified map of raw messages.
func UnmarshalVpcdnsResolverVPCPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VpcdnsResolverVPCPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VpcdnsResolverVPCPatch
func (vpcdnsResolverVPCPatch *VpcdnsResolverVPCPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpcdnsResolverVPCPatch.ID) {
		_patch["id"] = vpcdnsResolverVPCPatch.ID
	}
	if !core.IsNil(vpcdnsResolverVPCPatch.CRN) {
		_patch["crn"] = vpcdnsResolverVPCPatch.CRN
	}
	if !core.IsNil(vpcdnsResolverVPCPatch.Href) {
		_patch["href"] = vpcdnsResolverVPCPatch.Href
	}

	return
}

// VPCHealthReason : VPCHealthReason struct
type VPCHealthReason struct {
	// A reason code for this health state.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPCHealthReason.Code property.
// A reason code for this health state.
const (
	VPCHealthReasonCodeDnsResolutionBindingFailedConst = "dns_resolution_binding_failed"
	VPCHealthReasonCodeInternalErrorConst              = "internal_error"
)

// UnmarshalVPCHealthReason unmarshals an instance of VPCHealthReason from the specified map of raw messages.
func UnmarshalVPCHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPCIdentity : Identifies a VPC by a unique property.
// Models which "extend" this model:
// - VPCIdentityByID
// - VPCIdentityByCRN
// - VPCIdentityByHref
type VPCIdentity struct {
	// The unique identifier for this VPC.
	ID *string `json:"id,omitempty"`

	// The CRN for this VPC.
	CRN *string `json:"crn,omitempty"`

	// The URL for this VPC.
	Href *string `json:"href,omitempty"`
}

func (*VPCIdentity) isaVPCIdentity() bool {
	return true
}

type VPCIdentityIntf interface {
	isaVPCIdentity() bool
	asPatch() map[string]interface{}
}

// UnmarshalVPCIdentity unmarshals an instance of VPCIdentity from the specified map of raw messages.
func UnmarshalVPCIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCIdentity)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VPCIdentity
func (vpcIdentity *VPCIdentity) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpcIdentity.ID) {
		_patch["id"] = vpcIdentity.ID
	}
	if !core.IsNil(vpcIdentity.CRN) {
		_patch["crn"] = vpcIdentity.CRN
	}
	if !core.IsNil(vpcIdentity.Href) {
		_patch["href"] = vpcIdentity.Href
	}

	return
}

// VPCPatch : VPCPatch struct
type VPCPatch struct {
	// The DNS configuration for this VPC.
	Dns *VpcdnsPatch `json:"dns,omitempty"`

	// The name for this VPC. The name must not be used by another VPC in the region.
	Name *string `json:"name,omitempty"`
}

// UnmarshalVPCPatch unmarshals an instance of VPCPatch from the specified map of raw messages.
func UnmarshalVPCPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCPatch)
	err = core.UnmarshalModel(m, "dns", &obj.Dns, UnmarshalVpcdnsPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "dns-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the VPCPatch
func (vpcPatch *VPCPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpcPatch.Dns) {
		_patch["dns"] = vpcPatch.Dns.asPatch()
	}
	if !core.IsNil(vpcPatch.Name) {
		_patch["name"] = vpcPatch.Name
	}

	return
}

// VPCReference : VPCReference struct
type VPCReference struct {
	// The CRN for this VPC.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this VPC.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPC.
	ID *string `json:"id" validate:"required"`

	// The name for this VPC. The name is unique across all VPCs in the region.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the VPCReference.ResourceType property.
// The resource type.
const (
	VPCReferenceResourceTypeVPCConst = "vpc"
)

// UnmarshalVPCReference unmarshals an instance of VPCReference from the specified map of raw messages.
func UnmarshalVPCReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCReference)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPCReferenceDnsResolverContext : A VPC whose DNS resolver is delegated to provide DNS servers for this VPC.
//
// The VPC may be remote and therefore may not be directly retrievable.
type VPCReferenceDnsResolverContext struct {
	// The CRN for this VPC.
	CRN *string `json:"crn" validate:"required"`

	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this VPC.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPC.
	ID *string `json:"id" validate:"required"`

	// The name for this VPC. The name is unique across all VPCs in the region.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *VPCRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the VPCReferenceDnsResolverContext.ResourceType property.
// The resource type.
const (
	VPCReferenceDnsResolverContextResourceTypeVPCConst = "vpc"
)

// UnmarshalVPCReferenceDnsResolverContext unmarshals an instance of VPCReferenceDnsResolverContext from the specified map of raw messages.
func UnmarshalVPCReferenceDnsResolverContext(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCReferenceDnsResolverContext)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalVPCRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPCReferenceRemote : VPCReferenceRemote struct
type VPCReferenceRemote struct {
	// The CRN for this VPC.
	CRN *string `json:"crn" validate:"required"`

	// The URL for this VPC.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPC.
	ID *string `json:"id" validate:"required"`

	// The name for this VPC. The name is unique across all VPCs in the region.
	Name *string `json:"name" validate:"required"`

	// If present, this property indicates that the resource associated with this reference
	// is remote and therefore may not be directly retrievable.
	Remote *VPCRemote `json:"remote,omitempty"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the VPCReferenceRemote.ResourceType property.
// The resource type.
const (
	VPCReferenceRemoteResourceTypeVPCConst = "vpc"
)

// UnmarshalVPCReferenceRemote unmarshals an instance of VPCReferenceRemote from the specified map of raw messages.
func UnmarshalVPCReferenceRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCReferenceRemote)
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "remote", &obj.Remote, UnmarshalVPCRemote)
	if err != nil {
		err = core.SDKErrorf(err, "", "remote-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPCRemote : If present, this property indicates that the resource associated with this reference is remote and therefore may not
// be directly retrievable.
type VPCRemote struct {
	// If present, this property indicates that the referenced resource is remote to this
	// account, and identifies the owning account.
	Account *AccountReference `json:"account,omitempty"`

	// If present, this property indicates that the referenced resource is remote to this
	// region, and identifies the native region.
	Region *RegionReference `json:"region,omitempty"`
}

// UnmarshalVPCRemote unmarshals an instance of VPCRemote from the specified map of raw messages.
func UnmarshalVPCRemote(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPCRemote)
	err = core.UnmarshalModel(m, "account", &obj.Account, UnmarshalAccountReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "account-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "region", &obj.Region, UnmarshalRegionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "region-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGateway : VPNGateway struct
// Models which "extend" this model:
// - VPNGatewayPolicyMode
// - VPNGatewayRouteMode
type VPNGateway struct {
	// The connections for this VPN gateway.
	Connections []VPNGatewayConnectionReference `json:"connections" validate:"required"`

	// The date and time that this VPN gateway was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The CRN for this VPN gateway.
	CRN *string `json:"crn" validate:"required"`

	// The reasons for the current `health_state` (if any).
	HealthReasons []VPNGatewayHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The URL for this VPN gateway.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPN gateway.
	ID *string `json:"id" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []VPNGatewayLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the VPN gateway.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The members for the VPN gateway.
	Members []VPNGatewayMember `json:"members" validate:"required"`

	// The name for this VPN gateway. The name is unique across all VPN gateways in the VPC.
	Name *string `json:"name" validate:"required"`

	// The resource group for this VPN gateway.
	ResourceGroup *ResourceGroupReference `json:"resource_group" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	Subnet *SubnetReference `json:"subnet" validate:"required"`

	// The VPC this VPN gateway resides in.
	VPC *VPCReference `json:"vpc" validate:"required"`

	// The mode for this VPN gateway.
	Mode *string `json:"mode,omitempty"`
}

// Constants associated with the VPNGateway.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	VPNGatewayHealthStateDegradedConst     = "degraded"
	VPNGatewayHealthStateFaultedConst      = "faulted"
	VPNGatewayHealthStateInapplicableConst = "inapplicable"
	VPNGatewayHealthStateOkConst           = "ok"
)

// Constants associated with the VPNGateway.LifecycleState property.
// The lifecycle state of the VPN gateway.
const (
	VPNGatewayLifecycleStateDeletingConst  = "deleting"
	VPNGatewayLifecycleStateFailedConst    = "failed"
	VPNGatewayLifecycleStatePendingConst   = "pending"
	VPNGatewayLifecycleStateStableConst    = "stable"
	VPNGatewayLifecycleStateSuspendedConst = "suspended"
	VPNGatewayLifecycleStateUpdatingConst  = "updating"
	VPNGatewayLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the VPNGateway.ResourceType property.
// The resource type.
const (
	VPNGatewayResourceTypeVPNGatewayConst = "vpn_gateway"
)

// Constants associated with the VPNGateway.Mode property.
// The mode for this VPN gateway.
const (
	VPNGatewayModePolicyConst = "policy"
)

func (*VPNGateway) isaVPNGateway() bool {
	return true
}

type VPNGatewayIntf interface {
	isaVPNGateway() bool
}

// UnmarshalVPNGateway unmarshals an instance of VPNGateway from the specified map of raw messages.
func UnmarshalVPNGateway(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGateway)
	err = core.UnmarshalModel(m, "connections", &obj.Connections, UnmarshalVPNGatewayConnectionReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "created_at", &obj.CreatedAt)
	if err != nil {
		err = core.SDKErrorf(err, "", "created_at-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "crn", &obj.CRN)
	if err != nil {
		err = core.SDKErrorf(err, "", "crn-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalVPNGatewayHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalVPNGatewayLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "members", &obj.Members, UnmarshalVPNGatewayMember)
	if err != nil {
		err = core.SDKErrorf(err, "", "members-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "resource_group", &obj.ResourceGroup, UnmarshalResourceGroupReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_group-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "subnet", &obj.Subnet, UnmarshalSubnetReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "subnet-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpc", &obj.VPC, UnmarshalVPCReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpc-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "mode", &obj.Mode)
	if err != nil {
		err = core.SDKErrorf(err, "", "mode-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayCollection : VPNGatewayCollection struct
type VPNGatewayCollection struct {
	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`

	// A page of VPN gateways.
	VPNGateways []VPNGatewayIntf `json:"vpn_gateways" validate:"required"`
}

// UnmarshalVPNGatewayCollection unmarshals an instance of VPNGatewayCollection from the specified map of raw messages.
func UnmarshalVPNGatewayCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayCollection)
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "vpn_gateways", &obj.VPNGateways, UnmarshalVPNGateway)
	if err != nil {
		err = core.SDKErrorf(err, "", "vpn_gateways-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *VPNGatewayCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// VPNGatewayConnection : VPNGatewayConnection struct
// Models which "extend" this model:
// - VPNGatewayConnectionRouteMode
// - VPNGatewayConnectionPolicyMode
type VPNGatewayConnection struct {
	// If set to false, the VPN gateway connection is shut down.
	AdminStateUp *bool `json:"admin_state_up" validate:"required"`

	// The authentication mode.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	AuthenticationMode *string `json:"authentication_mode" validate:"required"`

	// The date and time that this VPN gateway connection was created.
	CreatedAt *strfmt.DateTime `json:"created_at" validate:"required"`

	// The dead peer detection configuration.
	DeadPeerDetection *VPNGatewayConnectionDpd `json:"dead_peer_detection" validate:"required"`

	// The establish mode of the VPN gateway connection:
	// - `bidirectional`: Either side of the VPN gateway can initiate IKE protocol
	//    negotiations or rekeying processes.
	// - `peer_only`: Only the peer can initiate IKE protocol negotiations for this VPN gateway
	//    connection. Additionally, the peer is responsible for initiating the rekeying process
	//    after the connection is established. If rekeying does not occur, the VPN gateway
	//    connection will be brought down after its lifetime expires.
	EstablishMode *string `json:"establish_mode" validate:"required"`

	// The URL for this VPN gateway connection.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPN gateway connection.
	ID *string `json:"id" validate:"required"`

	// The IKE policy. If absent, [auto-negotiation is
	// used](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ike-auto-negotiation-phase-1).
	IkePolicy *IkePolicyReference `json:"ike_policy,omitempty"`

	// The IPsec policy. If absent, [auto-negotiation is
	// used](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ipsec-auto-negotiation-phase-2).
	IpsecPolicy *IPsecPolicyReference `json:"ipsec_policy,omitempty"`

	// The mode of the VPN gateway.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Mode *string `json:"mode" validate:"required"`

	// The name for this VPN gateway connection. The name is unique across all connections for the VPN gateway.
	Name *string `json:"name" validate:"required"`

	// The pre-shared key.
	Psk *string `json:"psk" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`

	// The status of a VPN gateway connection.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current VPN gateway connection status (if any).
	StatusReasons []VPNGatewayConnectionStatusReason `json:"status_reasons" validate:"required"`

	// Indicates whether the traffic is distributed between the `up` tunnels of the VPN gateway connection when the VPC
	// route's next hop is a VPN connection. If `false`, the traffic is only routed through the `up` tunnel with the lower
	// `public_ip` address.
	DistributeTraffic *bool `json:"distribute_traffic,omitempty"`

	Local *VPNGatewayConnectionStaticRouteModeLocal `json:"local,omitempty"`

	Peer VPNGatewayConnectionStaticRouteModePeerIntf `json:"peer,omitempty"`

	// The routing protocol for this VPN gateway connection.
	RoutingProtocol *string `json:"routing_protocol,omitempty"`

	// The VPN tunnel configuration for this VPN gateway connection (in static route mode).
	Tunnels []VPNGatewayConnectionStaticRouteModeTunnel `json:"tunnels,omitempty"`
}

// Constants associated with the VPNGatewayConnection.AuthenticationMode property.
// The authentication mode.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayConnectionAuthenticationModePskConst = "psk"
)

// Constants associated with the VPNGatewayConnection.EstablishMode property.
// The establish mode of the VPN gateway connection:
//   - `bidirectional`: Either side of the VPN gateway can initiate IKE protocol
//     negotiations or rekeying processes.
//   - `peer_only`: Only the peer can initiate IKE protocol negotiations for this VPN gateway
//     connection. Additionally, the peer is responsible for initiating the rekeying process
//     after the connection is established. If rekeying does not occur, the VPN gateway
//     connection will be brought down after its lifetime expires.
const (
	VPNGatewayConnectionEstablishModeBidirectionalConst = "bidirectional"
	VPNGatewayConnectionEstablishModePeerOnlyConst      = "peer_only"
)

// Constants associated with the VPNGatewayConnection.Mode property.
// The mode of the VPN gateway.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayConnectionModePolicyConst = "policy"
	VPNGatewayConnectionModeRouteConst  = "route"
)

// Constants associated with the VPNGatewayConnection.ResourceType property.
// The resource type.
const (
	VPNGatewayConnectionResourceTypeVPNGatewayConnectionConst = "vpn_gateway_connection"
)

// Constants associated with the VPNGatewayConnection.Status property.
// The status of a VPN gateway connection.
const (
	VPNGatewayConnectionStatusDownConst = "down"
	VPNGatewayConnectionStatusUpConst   = "up"
)

// Constants associated with the VPNGatewayConnection.RoutingProtocol property.
// The routing protocol for this VPN gateway connection.
const (
	VPNGatewayConnectionRoutingProtocolNoneConst = "none"
)

func (*VPNGatewayConnection) isaVPNGatewayConnection() bool {
	return true
}

type VPNGatewayConnectionIntf interface {
	isaVPNGatewayConnection() bool
}

// UnmarshalVPNGatewayConnection unmarshals an instance of VPNGatewayConnection from the specified map of raw messages.
func UnmarshalVPNGatewayConnection(m map[string]json.RawMessage, result interface{}) (err error) {
	// Retrieve discriminator value to determine correct "subclass".
	var discValue string
	err = core.UnmarshalPrimitive(m, "mode", &discValue)
	if err != nil {
		errMsg := fmt.Sprintf("error unmarshalling discriminator property 'mode': %s", err.Error())
		err = core.SDKErrorf(err, errMsg, "discriminator-unmarshal-error", common.GetComponentInfo())
		return
	}
	if discValue == "" {
		err = core.SDKErrorf(err, "required discriminator property 'mode' not found in JSON object", "missing-discriminator", common.GetComponentInfo())
		return
	}
	if discValue == "policy" {
		err = core.UnmarshalModel(m, "", result, UnmarshalVPNGatewayConnectionPolicyMode)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-VPNGatewayConnectionPolicyMode-error", common.GetComponentInfo())
		}
	} else if discValue == "route" {
		err = core.UnmarshalModel(m, "", result, UnmarshalVPNGatewayConnectionRouteMode)
		if err != nil {
			err = core.SDKErrorf(err, "", "unmarshal-VPNGatewayConnectionRouteMode-error", common.GetComponentInfo())
		}
	} else {
		errMsg := fmt.Sprintf("unrecognized value for discriminator property 'mode': %s", discValue)
		err = core.SDKErrorf(err, errMsg, "invalid-discriminator", common.GetComponentInfo())
	}
	return
}

// VPNGatewayConnectionCIDRs : VPNGatewayConnectionCIDRs struct
type VPNGatewayConnectionCIDRs struct {
	// The CIDRs for this resource.
	CIDRs []string `json:"cidrs" validate:"required"`
}

// UnmarshalVPNGatewayConnectionCIDRs unmarshals an instance of VPNGatewayConnectionCIDRs from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionCIDRs(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionCIDRs)
	err = core.UnmarshalPrimitive(m, "cidrs", &obj.CIDRs)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidrs-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionCollection : VPNGatewayConnectionCollection struct
type VPNGatewayConnectionCollection struct {
	// A page of connections for the VPN gateway.
	Connections []VPNGatewayConnectionIntf `json:"connections" validate:"required"`

	// A link to the first page of resources.
	First *PageLink `json:"first" validate:"required"`

	// The maximum number of resources that can be returned by the request.
	Limit *int64 `json:"limit" validate:"required"`

	// A link to the next page of resources. This property is present for all pages
	// except the last page.
	Next *PageLink `json:"next,omitempty"`

	// The total number of resources across all pages.
	TotalCount *int64 `json:"total_count" validate:"required"`
}

// UnmarshalVPNGatewayConnectionCollection unmarshals an instance of VPNGatewayConnectionCollection from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionCollection(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionCollection)
	err = core.UnmarshalModel(m, "connections", &obj.Connections, UnmarshalVPNGatewayConnection)
	if err != nil {
		err = core.SDKErrorf(err, "", "connections-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "first", &obj.First, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "first-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "limit", &obj.Limit)
	if err != nil {
		err = core.SDKErrorf(err, "", "limit-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "next", &obj.Next, UnmarshalPageLink)
	if err != nil {
		err = core.SDKErrorf(err, "", "next-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "total_count", &obj.TotalCount)
	if err != nil {
		err = core.SDKErrorf(err, "", "total_count-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// Retrieve the value to be passed to a request to access the next page of results
func (resp *VPNGatewayConnectionCollection) GetNextStart() (*string, error) {
	if core.IsNil(resp.Next) {
		return nil, nil
	}
	start, err := core.GetQueryParam(resp.Next.Href, "start")
	if err != nil {
		err = core.SDKErrorf(err, "", "read-query-param-error", common.GetComponentInfo())
		return nil, err
	} else if start == nil {
		return nil, nil
	}
	return start, nil
}

// VPNGatewayConnectionDpd : The dead peer detection configuration.
type VPNGatewayConnectionDpd struct {
	// The dead peer detection action.
	Action *string `json:"action" validate:"required"`

	// The dead peer detection interval in seconds. Must not be greater than `timeout`.
	Interval *int64 `json:"interval" validate:"required"`

	// The dead peer detection timeout in seconds. Must not be less than `interval`.
	Timeout *int64 `json:"timeout" validate:"required"`
}

// Constants associated with the VPNGatewayConnectionDpd.Action property.
// The dead peer detection action.
const (
	VPNGatewayConnectionDpdActionClearConst   = "clear"
	VPNGatewayConnectionDpdActionHoldConst    = "hold"
	VPNGatewayConnectionDpdActionNoneConst    = "none"
	VPNGatewayConnectionDpdActionRestartConst = "restart"
)

// UnmarshalVPNGatewayConnectionDpd unmarshals an instance of VPNGatewayConnectionDpd from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionDpd(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionDpd)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interval", &obj.Interval)
	if err != nil {
		err = core.SDKErrorf(err, "", "interval-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "timeout", &obj.Timeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "timeout-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionDpdPatch : The dead peer detection configuration.
type VPNGatewayConnectionDpdPatch struct {
	// The dead peer detection action.
	Action *string `json:"action,omitempty"`

	// The dead peer detection interval in seconds. Must not be greater than `timeout`.
	Interval *int64 `json:"interval,omitempty"`

	// The dead peer detection timeout in seconds. Must not be less than `interval`.
	Timeout *int64 `json:"timeout,omitempty"`
}

// Constants associated with the VPNGatewayConnectionDpdPatch.Action property.
// The dead peer detection action.
const (
	VPNGatewayConnectionDpdPatchActionClearConst   = "clear"
	VPNGatewayConnectionDpdPatchActionHoldConst    = "hold"
	VPNGatewayConnectionDpdPatchActionNoneConst    = "none"
	VPNGatewayConnectionDpdPatchActionRestartConst = "restart"
)

// UnmarshalVPNGatewayConnectionDpdPatch unmarshals an instance of VPNGatewayConnectionDpdPatch from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionDpdPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionDpdPatch)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interval", &obj.Interval)
	if err != nil {
		err = core.SDKErrorf(err, "", "interval-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "timeout", &obj.Timeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "timeout-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VPNGatewayConnectionDpdPatch
func (vpnGatewayConnectionDpdPatch *VPNGatewayConnectionDpdPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpnGatewayConnectionDpdPatch.Action) {
		_patch["action"] = vpnGatewayConnectionDpdPatch.Action
	}
	if !core.IsNil(vpnGatewayConnectionDpdPatch.Interval) {
		_patch["interval"] = vpnGatewayConnectionDpdPatch.Interval
	}
	if !core.IsNil(vpnGatewayConnectionDpdPatch.Timeout) {
		_patch["timeout"] = vpnGatewayConnectionDpdPatch.Timeout
	}

	return
}

// VPNGatewayConnectionDpdPrototype : The dead peer detection configuration.
type VPNGatewayConnectionDpdPrototype struct {
	// The dead peer detection action.
	Action *string `json:"action,omitempty"`

	// The dead peer detection interval in seconds. Must not be greater than `timeout`.
	Interval *int64 `json:"interval,omitempty"`

	// The dead peer detection timeout in seconds. Must not be less than `interval`.
	Timeout *int64 `json:"timeout,omitempty"`
}

// Constants associated with the VPNGatewayConnectionDpdPrototype.Action property.
// The dead peer detection action.
const (
	VPNGatewayConnectionDpdPrototypeActionClearConst   = "clear"
	VPNGatewayConnectionDpdPrototypeActionHoldConst    = "hold"
	VPNGatewayConnectionDpdPrototypeActionNoneConst    = "none"
	VPNGatewayConnectionDpdPrototypeActionRestartConst = "restart"
)

// UnmarshalVPNGatewayConnectionDpdPrototype unmarshals an instance of VPNGatewayConnectionDpdPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionDpdPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionDpdPrototype)
	err = core.UnmarshalPrimitive(m, "action", &obj.Action)
	if err != nil {
		err = core.SDKErrorf(err, "", "action-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "interval", &obj.Interval)
	if err != nil {
		err = core.SDKErrorf(err, "", "interval-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "timeout", &obj.Timeout)
	if err != nil {
		err = core.SDKErrorf(err, "", "timeout-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionIkeIdentity : VPNGatewayConnectionIkeIdentity struct
// Models which "extend" this model:
// - VPNGatewayConnectionIkeIdentityVPNGatewayConnectionIkeIdentityFqdn
// - VPNGatewayConnectionIkeIdentityVPNGatewayConnectionIkeIdentityHostname
// - VPNGatewayConnectionIkeIdentityVPNGatewayConnectionIkeIdentityIPv4
// - VPNGatewayConnectionIkeIdentityVPNGatewayConnectionIkeIdentityKeyID
type VPNGatewayConnectionIkeIdentity struct {
	// The IKE identity type.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Type *string `json:"type" validate:"required"`

	// The IKE identity FQDN value.
	Value *string `json:"value,omitempty"`
}

// Constants associated with the VPNGatewayConnectionIkeIdentity.Type property.
// The IKE identity type.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayConnectionIkeIdentityTypeFqdnConst        = "fqdn"
	VPNGatewayConnectionIkeIdentityTypeHostnameConst    = "hostname"
	VPNGatewayConnectionIkeIdentityTypeIpv4AddressConst = "ipv4_address"
	VPNGatewayConnectionIkeIdentityTypeKeyIDConst       = "key_id"
)

func (*VPNGatewayConnectionIkeIdentity) isaVPNGatewayConnectionIkeIdentity() bool {
	return true
}

type VPNGatewayConnectionIkeIdentityIntf interface {
	isaVPNGatewayConnectionIkeIdentity() bool
}

// UnmarshalVPNGatewayConnectionIkeIdentity unmarshals an instance of VPNGatewayConnectionIkeIdentity from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionIkeIdentity(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionIkeIdentity)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionIkeIdentityPrototype : VPNGatewayConnectionIkeIdentityPrototype struct
// Models which "extend" this model:
// - VPNGatewayConnectionIkeIdentityPrototypeVPNGatewayConnectionIkeIdentityFqdn
// - VPNGatewayConnectionIkeIdentityPrototypeVPNGatewayConnectionIkeIdentityHostname
// - VPNGatewayConnectionIkeIdentityPrototypeVPNGatewayConnectionIkeIdentityIPv4
// - VPNGatewayConnectionIkeIdentityPrototypeVPNGatewayConnectionIkeIdentityKeyID
type VPNGatewayConnectionIkeIdentityPrototype struct {
	// The IKE identity type.
	Type *string `json:"type" validate:"required"`

	// The IKE identity FQDN value.
	Value *string `json:"value,omitempty"`
}

// Constants associated with the VPNGatewayConnectionIkeIdentityPrototype.Type property.
// The IKE identity type.
const (
	VPNGatewayConnectionIkeIdentityPrototypeTypeFqdnConst        = "fqdn"
	VPNGatewayConnectionIkeIdentityPrototypeTypeHostnameConst    = "hostname"
	VPNGatewayConnectionIkeIdentityPrototypeTypeIpv4AddressConst = "ipv4_address"
	VPNGatewayConnectionIkeIdentityPrototypeTypeKeyIDConst       = "key_id"
)

func (*VPNGatewayConnectionIkeIdentityPrototype) isaVPNGatewayConnectionIkeIdentityPrototype() bool {
	return true
}

type VPNGatewayConnectionIkeIdentityPrototypeIntf interface {
	isaVPNGatewayConnectionIkeIdentityPrototype() bool
}

// UnmarshalVPNGatewayConnectionIkeIdentityPrototype unmarshals an instance of VPNGatewayConnectionIkeIdentityPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionIkeIdentityPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionIkeIdentityPrototype)
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "value", &obj.Value)
	if err != nil {
		err = core.SDKErrorf(err, "", "value-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionIkePolicyPatch : The IKE policy to use. Specify `null` to remove any existing policy, [resulting in
// auto-negotiation](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ike-auto-negotiation-phase-1).
// Models which "extend" this model:
// - VPNGatewayConnectionIkePolicyPatchIkePolicyIdentityByID
// - VPNGatewayConnectionIkePolicyPatchIkePolicyIdentityByHref
type VPNGatewayConnectionIkePolicyPatch struct {
	// The unique identifier for this IKE policy.
	ID *string `json:"id,omitempty"`

	// The URL for this IKE policy.
	Href *string `json:"href,omitempty"`
}

func (*VPNGatewayConnectionIkePolicyPatch) isaVPNGatewayConnectionIkePolicyPatch() bool {
	return true
}

type VPNGatewayConnectionIkePolicyPatchIntf interface {
	isaVPNGatewayConnectionIkePolicyPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalVPNGatewayConnectionIkePolicyPatch unmarshals an instance of VPNGatewayConnectionIkePolicyPatch from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionIkePolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionIkePolicyPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VPNGatewayConnectionIkePolicyPatch
func (vpnGatewayConnectionIkePolicyPatch *VPNGatewayConnectionIkePolicyPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpnGatewayConnectionIkePolicyPatch.ID) {
		_patch["id"] = vpnGatewayConnectionIkePolicyPatch.ID
	}
	if !core.IsNil(vpnGatewayConnectionIkePolicyPatch.Href) {
		_patch["href"] = vpnGatewayConnectionIkePolicyPatch.Href
	}

	return
}

// VPNGatewayConnectionIkePolicyPrototype : The IKE policy to use. If unspecified, [auto-negotiation will be
// used](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ike-auto-negotiation-phase-1).
// Models which "extend" this model:
// - VPNGatewayConnectionIkePolicyPrototypeIkePolicyIdentityByID
// - VPNGatewayConnectionIkePolicyPrototypeIkePolicyIdentityByHref
type VPNGatewayConnectionIkePolicyPrototype struct {
	// The unique identifier for this IKE policy.
	ID *string `json:"id,omitempty"`

	// The URL for this IKE policy.
	Href *string `json:"href,omitempty"`
}

func (*VPNGatewayConnectionIkePolicyPrototype) isaVPNGatewayConnectionIkePolicyPrototype() bool {
	return true
}

type VPNGatewayConnectionIkePolicyPrototypeIntf interface {
	isaVPNGatewayConnectionIkePolicyPrototype() bool
}

// UnmarshalVPNGatewayConnectionIkePolicyPrototype unmarshals an instance of VPNGatewayConnectionIkePolicyPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionIkePolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionIkePolicyPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionIPsecPolicyPatch : The IPsec policy to use. Specify `null` to remove any existing policy, [resulting in
// auto-negotiation](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ipsec-auto-negotiation-phase-2).
// Models which "extend" this model:
// - VPNGatewayConnectionIPsecPolicyPatchIPsecPolicyIdentityByID
// - VPNGatewayConnectionIPsecPolicyPatchIPsecPolicyIdentityByHref
type VPNGatewayConnectionIPsecPolicyPatch struct {
	// The unique identifier for this IPsec policy.
	ID *string `json:"id,omitempty"`

	// The URL for this IPsec policy.
	Href *string `json:"href,omitempty"`
}

func (*VPNGatewayConnectionIPsecPolicyPatch) isaVPNGatewayConnectionIPsecPolicyPatch() bool {
	return true
}

type VPNGatewayConnectionIPsecPolicyPatchIntf interface {
	isaVPNGatewayConnectionIPsecPolicyPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalVPNGatewayConnectionIPsecPolicyPatch unmarshals an instance of VPNGatewayConnectionIPsecPolicyPatch from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionIPsecPolicyPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionIPsecPolicyPatch)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VPNGatewayConnectionIPsecPolicyPatch
func (vpnGatewayConnectionIPsecPolicyPatch *VPNGatewayConnectionIPsecPolicyPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpnGatewayConnectionIPsecPolicyPatch.ID) {
		_patch["id"] = vpnGatewayConnectionIPsecPolicyPatch.ID
	}
	if !core.IsNil(vpnGatewayConnectionIPsecPolicyPatch.Href) {
		_patch["href"] = vpnGatewayConnectionIPsecPolicyPatch.Href
	}

	return
}

// VPNGatewayConnectionIPsecPolicyPrototype : The IPsec policy to use. If unspecified, [auto-negotiation will be
// used](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ipsec-auto-negotiation-phase-2).
// Models which "extend" this model:
// - VPNGatewayConnectionIPsecPolicyPrototypeIPsecPolicyIdentityByID
// - VPNGatewayConnectionIPsecPolicyPrototypeIPsecPolicyIdentityByHref
type VPNGatewayConnectionIPsecPolicyPrototype struct {
	// The unique identifier for this IPsec policy.
	ID *string `json:"id,omitempty"`

	// The URL for this IPsec policy.
	Href *string `json:"href,omitempty"`
}

func (*VPNGatewayConnectionIPsecPolicyPrototype) isaVPNGatewayConnectionIPsecPolicyPrototype() bool {
	return true
}

type VPNGatewayConnectionIPsecPolicyPrototypeIntf interface {
	isaVPNGatewayConnectionIPsecPolicyPrototype() bool
}

// UnmarshalVPNGatewayConnectionIPsecPolicyPrototype unmarshals an instance of VPNGatewayConnectionIPsecPolicyPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionIPsecPolicyPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionIPsecPolicyPrototype)
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionPatch : VPNGatewayConnectionPatch struct
type VPNGatewayConnectionPatch struct {
	// If set to false, the VPN gateway connection is shut down.
	AdminStateUp *bool `json:"admin_state_up,omitempty"`

	// The dead peer detection configuration.
	DeadPeerDetection *VPNGatewayConnectionDpdPatch `json:"dead_peer_detection,omitempty"`

	// Indicates whether the traffic is distributed between the `up` tunnels of the VPN gateway connection when the VPC
	// route's next hop is a VPN connection. If `false`, the traffic is only routed through the `up` tunnel with the lower
	// `public_ip` address. Before enabling it on VPN connections to on-prem private networks, review
	// [distributing traffic
	// restrictions](https://cloud.ibm.com/docs/vpc?topic=vpc-vpn-limitations#distributing-traffic-restrictions).
	//
	// If specified, `mode` must be `route`.
	DistributeTraffic *bool `json:"distribute_traffic,omitempty"`

	// The establish mode of the VPN gateway connection:
	// - `bidirectional`: Either side of the VPN gateway can initiate IKE protocol
	//    negotiations or rekeying processes.
	// - `peer_only`: Only the peer can initiate IKE protocol negotiations for this VPN gateway
	//    connection. Additionally, the peer is responsible for initiating the rekeying process
	//    after the connection is established. If rekeying does not occur, the VPN gateway
	//    connection will be brought down after its lifetime expires.
	EstablishMode *string `json:"establish_mode,omitempty"`

	// The IKE policy to use. Specify `null` to remove any existing policy, [resulting in
	// auto-negotiation](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ike-auto-negotiation-phase-1).
	IkePolicy VPNGatewayConnectionIkePolicyPatchIntf `json:"ike_policy,omitempty"`

	// The IPsec policy to use. Specify `null` to remove any existing policy, [resulting in
	// auto-negotiation](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ipsec-auto-negotiation-phase-2).
	IpsecPolicy VPNGatewayConnectionIPsecPolicyPatchIntf `json:"ipsec_policy,omitempty"`

	// The name for this VPN gateway connection. The name must not be used by another connection for the VPN gateway.
	Name *string `json:"name,omitempty"`

	Peer VPNGatewayConnectionPeerPatchIntf `json:"peer,omitempty"`

	// The pre-shared key.
	Psk *string `json:"psk,omitempty"`
}

// Constants associated with the VPNGatewayConnectionPatch.EstablishMode property.
// The establish mode of the VPN gateway connection:
//   - `bidirectional`: Either side of the VPN gateway can initiate IKE protocol
//     negotiations or rekeying processes.
//   - `peer_only`: Only the peer can initiate IKE protocol negotiations for this VPN gateway
//     connection. Additionally, the peer is responsible for initiating the rekeying process
//     after the connection is established. If rekeying does not occur, the VPN gateway
//     connection will be brought down after its lifetime expires.
const (
	VPNGatewayConnectionPatchEstablishModeBidirectionalConst = "bidirectional"
	VPNGatewayConnectionPatchEstablishModePeerOnlyConst      = "peer_only"
)

// UnmarshalVPNGatewayConnectionPatch unmarshals an instance of VPNGatewayConnectionPatch from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPatch)
	err = core.UnmarshalPrimitive(m, "admin_state_up", &obj.AdminStateUp)
	if err != nil {
		err = core.SDKErrorf(err, "", "admin_state_up-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "dead_peer_detection", &obj.DeadPeerDetection, UnmarshalVPNGatewayConnectionDpdPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "dead_peer_detection-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "distribute_traffic", &obj.DistributeTraffic)
	if err != nil {
		err = core.SDKErrorf(err, "", "distribute_traffic-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "establish_mode", &obj.EstablishMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "establish_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_policy", &obj.IkePolicy, UnmarshalVPNGatewayConnectionIkePolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ipsec_policy", &obj.IpsecPolicy, UnmarshalVPNGatewayConnectionIPsecPolicyPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipsec_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "peer", &obj.Peer, UnmarshalVPNGatewayConnectionPeerPatch)
	if err != nil {
		err = core.SDKErrorf(err, "", "peer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "psk", &obj.Psk)
	if err != nil {
		err = core.SDKErrorf(err, "", "psk-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the VPNGatewayConnectionPatch
func (vpnGatewayConnectionPatch *VPNGatewayConnectionPatch) AsPatch() (_patch map[string]interface{}, err error) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpnGatewayConnectionPatch.AdminStateUp) {
		_patch["admin_state_up"] = vpnGatewayConnectionPatch.AdminStateUp
	}
	if !core.IsNil(vpnGatewayConnectionPatch.DeadPeerDetection) {
		_patch["dead_peer_detection"] = vpnGatewayConnectionPatch.DeadPeerDetection.asPatch()
	}
	if !core.IsNil(vpnGatewayConnectionPatch.DistributeTraffic) {
		_patch["distribute_traffic"] = vpnGatewayConnectionPatch.DistributeTraffic
	}
	if !core.IsNil(vpnGatewayConnectionPatch.EstablishMode) {
		_patch["establish_mode"] = vpnGatewayConnectionPatch.EstablishMode
	}
	if !core.IsNil(vpnGatewayConnectionPatch.IkePolicy) {
		_patch["ike_policy"] = vpnGatewayConnectionPatch.IkePolicy.asPatch()
	}
	if !core.IsNil(vpnGatewayConnectionPatch.IpsecPolicy) {
		_patch["ipsec_policy"] = vpnGatewayConnectionPatch.IpsecPolicy.asPatch()
	}
	if !core.IsNil(vpnGatewayConnectionPatch.Name) {
		_patch["name"] = vpnGatewayConnectionPatch.Name
	}
	if !core.IsNil(vpnGatewayConnectionPatch.Peer) {
		_patch["peer"] = vpnGatewayConnectionPatch.Peer.asPatch()
	}
	if !core.IsNil(vpnGatewayConnectionPatch.Psk) {
		_patch["psk"] = vpnGatewayConnectionPatch.Psk
	}

	return
}

// VPNGatewayConnectionPeerPatch : VPNGatewayConnectionPeerPatch struct
// Models which "extend" this model:
// - VPNGatewayConnectionPeerPatchVPNGatewayConnectionPolicyModePeerPatch
// - VPNGatewayConnectionPeerPatchVPNGatewayConnectionStaticRouteModePeerPatch
type VPNGatewayConnectionPeerPatch struct {
	// The IP address of the peer VPN gateway for this connection.
	Address *string `json:"address,omitempty"`

	// The FQDN of the peer VPN gateway for this connection.
	Fqdn *string `json:"fqdn,omitempty"`
}

func (*VPNGatewayConnectionPeerPatch) isaVPNGatewayConnectionPeerPatch() bool {
	return true
}

type VPNGatewayConnectionPeerPatchIntf interface {
	isaVPNGatewayConnectionPeerPatch() bool
	asPatch() map[string]interface{}
}

// UnmarshalVPNGatewayConnectionPeerPatch unmarshals an instance of VPNGatewayConnectionPeerPatch from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPeerPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPeerPatch)
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fqdn", &obj.Fqdn)
	if err != nil {
		err = core.SDKErrorf(err, "", "fqdn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// asPatch returns a generic map representation of the VPNGatewayConnectionPeerPatch
func (vpnGatewayConnectionPeerPatch *VPNGatewayConnectionPeerPatch) asPatch() (_patch map[string]interface{}) {
	_patch = map[string]interface{}{}
	if !core.IsNil(vpnGatewayConnectionPeerPatch.Address) {
		_patch["address"] = vpnGatewayConnectionPeerPatch.Address
	}
	if !core.IsNil(vpnGatewayConnectionPeerPatch.Fqdn) {
		_patch["fqdn"] = vpnGatewayConnectionPeerPatch.Fqdn
	}

	return
}

// VPNGatewayConnectionPolicyModeLocal : VPNGatewayConnectionPolicyModeLocal struct
type VPNGatewayConnectionPolicyModeLocal struct {
	// The local CIDRs for this VPN gateway connection.
	CIDRs []string `json:"cidrs" validate:"required"`

	// The local IKE identities.
	//
	// A VPN gateway in policy mode consists of two members in active-standby mode. The local IKE identity applies to the
	// active member.
	IkeIdentities []VPNGatewayConnectionIkeIdentityIntf `json:"ike_identities" validate:"required"`
}

// UnmarshalVPNGatewayConnectionPolicyModeLocal unmarshals an instance of VPNGatewayConnectionPolicyModeLocal from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPolicyModeLocal(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPolicyModeLocal)
	err = core.UnmarshalPrimitive(m, "cidrs", &obj.CIDRs)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidrs-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_identities", &obj.IkeIdentities, UnmarshalVPNGatewayConnectionIkeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identities-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionPolicyModeLocalPrototype : VPNGatewayConnectionPolicyModeLocalPrototype struct
type VPNGatewayConnectionPolicyModeLocalPrototype struct {
	// The local CIDRs for this VPN gateway connection.
	CIDRs []string `json:"cidrs" validate:"required"`

	// The local IKE identities to use.
	//
	// A VPN gateway in policy mode consists of two members in active-standby mode. The specified identity will be applied
	// to the active member.
	//
	// If unspecified, then `type` will be `ipv4_address` and `value` will be the public IP address of the VPN gateway.
	IkeIdentities []VPNGatewayConnectionIkeIdentityPrototypeIntf `json:"ike_identities,omitempty"`
}

// NewVPNGatewayConnectionPolicyModeLocalPrototype : Instantiate VPNGatewayConnectionPolicyModeLocalPrototype (Generic Model Constructor)
func (*VpcV1) NewVPNGatewayConnectionPolicyModeLocalPrototype(cidrs []string) (_model *VPNGatewayConnectionPolicyModeLocalPrototype, err error) {
	_model = &VPNGatewayConnectionPolicyModeLocalPrototype{
		CIDRs: cidrs,
	}
	err = core.ValidateStruct(_model, "required parameters")
	if err != nil {
		err = core.SDKErrorf(err, "", "model-missing-required", common.GetComponentInfo())
	}
	return
}

// UnmarshalVPNGatewayConnectionPolicyModeLocalPrototype unmarshals an instance of VPNGatewayConnectionPolicyModeLocalPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPolicyModeLocalPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPolicyModeLocalPrototype)
	err = core.UnmarshalPrimitive(m, "cidrs", &obj.CIDRs)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidrs-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_identities", &obj.IkeIdentities, UnmarshalVPNGatewayConnectionIkeIdentityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identities-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionPolicyModePeer : VPNGatewayConnectionPolicyModePeer struct
// Models which "extend" this model:
// - VPNGatewayConnectionPolicyModePeerVPNGatewayConnectionPeerByAddress
// - VPNGatewayConnectionPolicyModePeerVPNGatewayConnectionPeerByFqdn
type VPNGatewayConnectionPolicyModePeer struct {
	// The peer CIDRs for this VPN gateway connection.
	CIDRs []string `json:"cidrs" validate:"required"`

	// The peer IKE identity.
	IkeIdentity VPNGatewayConnectionIkeIdentityIntf `json:"ike_identity" validate:"required"`

	// Indicates whether `peer.address` or `peer.fqdn` is used.
	Type *string `json:"type" validate:"required"`

	// The IP address of the peer VPN gateway for this connection.
	Address *string `json:"address,omitempty"`

	// The FQDN of the peer VPN gateway for this connection.
	Fqdn *string `json:"fqdn,omitempty"`
}

// Constants associated with the VPNGatewayConnectionPolicyModePeer.Type property.
// Indicates whether `peer.address` or `peer.fqdn` is used.
const (
	VPNGatewayConnectionPolicyModePeerTypeAddressConst = "address"
	VPNGatewayConnectionPolicyModePeerTypeFqdnConst    = "fqdn"
)

func (*VPNGatewayConnectionPolicyModePeer) isaVPNGatewayConnectionPolicyModePeer() bool {
	return true
}

type VPNGatewayConnectionPolicyModePeerIntf interface {
	isaVPNGatewayConnectionPolicyModePeer() bool
}

// UnmarshalVPNGatewayConnectionPolicyModePeer unmarshals an instance of VPNGatewayConnectionPolicyModePeer from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPolicyModePeer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPolicyModePeer)
	err = core.UnmarshalPrimitive(m, "cidrs", &obj.CIDRs)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidrs-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_identity", &obj.IkeIdentity, UnmarshalVPNGatewayConnectionIkeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fqdn", &obj.Fqdn)
	if err != nil {
		err = core.SDKErrorf(err, "", "fqdn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionPolicyModePeerPrototype : VPNGatewayConnectionPolicyModePeerPrototype struct
// Models which "extend" this model:
// - VPNGatewayConnectionPolicyModePeerPrototypeVPNGatewayConnectionPeerByAddress
// - VPNGatewayConnectionPolicyModePeerPrototypeVPNGatewayConnectionPeerByFqdn
type VPNGatewayConnectionPolicyModePeerPrototype struct {
	// The peer CIDRs for this VPN gateway connection.
	CIDRs []string `json:"cidrs" validate:"required"`

	// The peer IKE identity to use.
	//
	// If unspecified:
	// - If `peer.address` is specified, the `type` will be `ipv4_address`, and
	// the `value` will be `peer.address`.
	// - If `peer.fqdn` is specified, the `type` will be `fqdn`, and the `value`
	// will be `peer.fqdn`.
	IkeIdentity VPNGatewayConnectionIkeIdentityPrototypeIntf `json:"ike_identity,omitempty"`

	// The IP address of the peer VPN gateway for this connection.
	Address *string `json:"address,omitempty"`

	// The FQDN of the peer VPN gateway for this connection.
	Fqdn *string `json:"fqdn,omitempty"`
}

func (*VPNGatewayConnectionPolicyModePeerPrototype) isaVPNGatewayConnectionPolicyModePeerPrototype() bool {
	return true
}

type VPNGatewayConnectionPolicyModePeerPrototypeIntf interface {
	isaVPNGatewayConnectionPolicyModePeerPrototype() bool
}

// UnmarshalVPNGatewayConnectionPolicyModePeerPrototype unmarshals an instance of VPNGatewayConnectionPolicyModePeerPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPolicyModePeerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPolicyModePeerPrototype)
	err = core.UnmarshalPrimitive(m, "cidrs", &obj.CIDRs)
	if err != nil {
		err = core.SDKErrorf(err, "", "cidrs-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_identity", &obj.IkeIdentity, UnmarshalVPNGatewayConnectionIkeIdentityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fqdn", &obj.Fqdn)
	if err != nil {
		err = core.SDKErrorf(err, "", "fqdn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionPrototype : VPNGatewayConnectionPrototype struct
// Models which "extend" this model:
// - VPNGatewayConnectionPrototypeVPNGatewayConnectionStaticRouteModePrototype
// - VPNGatewayConnectionPrototypeVPNGatewayConnectionPolicyModePrototype
type VPNGatewayConnectionPrototype struct {
	// If set to false, the VPN gateway connection is shut down.
	AdminStateUp *bool `json:"admin_state_up,omitempty"`

	// The dead peer detection configuration.
	DeadPeerDetection *VPNGatewayConnectionDpdPrototype `json:"dead_peer_detection,omitempty"`

	// The establish mode of the VPN gateway connection:
	// - `bidirectional`: Either side of the VPN gateway can initiate IKE protocol
	//    negotiations or rekeying processes.
	// - `peer_only`: Only the peer can initiate IKE protocol negotiations for this VPN gateway
	//    connection. Additionally, the peer is responsible for initiating the rekeying process
	//    after the connection is established. If rekeying does not occur, the VPN gateway
	//    connection will be brought down after its lifetime expires.
	EstablishMode *string `json:"establish_mode,omitempty"`

	// The IKE policy to use. If unspecified, [auto-negotiation will be
	// used](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ike-auto-negotiation-phase-1).
	IkePolicy VPNGatewayConnectionIkePolicyPrototypeIntf `json:"ike_policy,omitempty"`

	// The IPsec policy to use. If unspecified, [auto-negotiation will be
	// used](https://cloud.ibm.com/docs/vpc?topic=vpc-using-vpn&interface=ui#ipsec-auto-negotiation-phase-2).
	IpsecPolicy VPNGatewayConnectionIPsecPolicyPrototypeIntf `json:"ipsec_policy,omitempty"`

	// The name for this VPN gateway connection. The name must not be used by another connection for the VPN gateway. If
	// unspecified, the name will be a hyphenated list of randomly-selected words.
	Name *string `json:"name,omitempty"`

	// The pre-shared key.
	Psk *string `json:"psk" validate:"required"`

	// Indicates whether the traffic is distributed between the `up` tunnels of the VPN gateway connection when the VPC
	// route's next hop is a VPN connection. If `false`, the traffic is only routed through the `up` tunnel with the lower
	// `public_ip` address. Before enabling it on VPN connections to on-prem private networks, review
	// [distributing traffic
	// restrictions](https://cloud.ibm.com/docs/vpc?topic=vpc-vpn-limitations#distributing-traffic-restrictions).
	DistributeTraffic *bool `json:"distribute_traffic,omitempty"`

	Local *VPNGatewayConnectionStaticRouteModeLocalPrototype `json:"local,omitempty"`

	Peer VPNGatewayConnectionStaticRouteModePeerPrototypeIntf `json:"peer,omitempty"`

	// The routing protocol for this VPN gateway connection.
	RoutingProtocol *string `json:"routing_protocol,omitempty"`
}

// Constants associated with the VPNGatewayConnectionPrototype.EstablishMode property.
// The establish mode of the VPN gateway connection:
//   - `bidirectional`: Either side of the VPN gateway can initiate IKE protocol
//     negotiations or rekeying processes.
//   - `peer_only`: Only the peer can initiate IKE protocol negotiations for this VPN gateway
//     connection. Additionally, the peer is responsible for initiating the rekeying process
//     after the connection is established. If rekeying does not occur, the VPN gateway
//     connection will be brought down after its lifetime expires.
const (
	VPNGatewayConnectionPrototypeEstablishModeBidirectionalConst = "bidirectional"
	VPNGatewayConnectionPrototypeEstablishModePeerOnlyConst      = "peer_only"
)

// Constants associated with the VPNGatewayConnectionPrototype.RoutingProtocol property.
// The routing protocol for this VPN gateway connection.
const (
	VPNGatewayConnectionPrototypeRoutingProtocolNoneConst = "none"
)

func (*VPNGatewayConnectionPrototype) isaVPNGatewayConnectionPrototype() bool {
	return true
}

type VPNGatewayConnectionPrototypeIntf interface {
	isaVPNGatewayConnectionPrototype() bool
}

// UnmarshalVPNGatewayConnectionPrototype unmarshals an instance of VPNGatewayConnectionPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionPrototype)
	err = core.UnmarshalPrimitive(m, "admin_state_up", &obj.AdminStateUp)
	if err != nil {
		err = core.SDKErrorf(err, "", "admin_state_up-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "dead_peer_detection", &obj.DeadPeerDetection, UnmarshalVPNGatewayConnectionDpdPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "dead_peer_detection-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "establish_mode", &obj.EstablishMode)
	if err != nil {
		err = core.SDKErrorf(err, "", "establish_mode-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ike_policy", &obj.IkePolicy, UnmarshalVPNGatewayConnectionIkePolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "ipsec_policy", &obj.IpsecPolicy, UnmarshalVPNGatewayConnectionIPsecPolicyPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ipsec_policy-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "psk", &obj.Psk)
	if err != nil {
		err = core.SDKErrorf(err, "", "psk-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "distribute_traffic", &obj.DistributeTraffic)
	if err != nil {
		err = core.SDKErrorf(err, "", "distribute_traffic-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "local", &obj.Local, UnmarshalVPNGatewayConnectionStaticRouteModeLocalPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "local-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "peer", &obj.Peer, UnmarshalVPNGatewayConnectionStaticRouteModePeerPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "peer-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "routing_protocol", &obj.RoutingProtocol)
	if err != nil {
		err = core.SDKErrorf(err, "", "routing_protocol-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionReference : VPNGatewayConnectionReference struct
type VPNGatewayConnectionReference struct {
	// If present, this property indicates the referenced resource has been deleted, and provides
	// some supplementary information.
	Deleted *Deleted `json:"deleted,omitempty"`

	// The URL for this VPN gateway connection.
	Href *string `json:"href" validate:"required"`

	// The unique identifier for this VPN gateway connection.
	ID *string `json:"id" validate:"required"`

	// The name for this VPN gateway connection. The name is unique across all connections for the VPN gateway.
	Name *string `json:"name" validate:"required"`

	// The resource type.
	ResourceType *string `json:"resource_type" validate:"required"`
}

// Constants associated with the VPNGatewayConnectionReference.ResourceType property.
// The resource type.
const (
	VPNGatewayConnectionReferenceResourceTypeVPNGatewayConnectionConst = "vpn_gateway_connection"
)

// UnmarshalVPNGatewayConnectionReference unmarshals an instance of VPNGatewayConnectionReference from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionReference(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionReference)
	err = core.UnmarshalModel(m, "deleted", &obj.Deleted, UnmarshalDeleted)
	if err != nil {
		err = core.SDKErrorf(err, "", "deleted-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "href", &obj.Href)
	if err != nil {
		err = core.SDKErrorf(err, "", "href-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "id", &obj.ID)
	if err != nil {
		err = core.SDKErrorf(err, "", "id-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "resource_type", &obj.ResourceType)
	if err != nil {
		err = core.SDKErrorf(err, "", "resource_type-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionStaticRouteModeLocal : VPNGatewayConnectionStaticRouteModeLocal struct
type VPNGatewayConnectionStaticRouteModeLocal struct {
	// The local IKE identities.
	//
	// A VPN gateway in static route mode consists of two members in active-active mode. The first identity applies to the
	// first member, and the second identity applies to the second member.
	IkeIdentities []VPNGatewayConnectionIkeIdentityIntf `json:"ike_identities" validate:"required"`
}

// UnmarshalVPNGatewayConnectionStaticRouteModeLocal unmarshals an instance of VPNGatewayConnectionStaticRouteModeLocal from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionStaticRouteModeLocal(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionStaticRouteModeLocal)
	err = core.UnmarshalModel(m, "ike_identities", &obj.IkeIdentities, UnmarshalVPNGatewayConnectionIkeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identities-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionStaticRouteModeLocalPrototype : VPNGatewayConnectionStaticRouteModeLocalPrototype struct
type VPNGatewayConnectionStaticRouteModeLocalPrototype struct {
	// The local IKE identities to use.
	//
	// A VPN gateway in static route mode consists of two members in active-active mode. The first specified identity will
	// be applied to the first member, and the second specified identity will be applied to the second member.
	//
	// If unspecified, then `type` will be `ipv4_address` and `value` will be the public IP address of the member's VPN
	// connection tunnel.
	IkeIdentities []VPNGatewayConnectionIkeIdentityPrototypeIntf `json:"ike_identities,omitempty"`
}

// UnmarshalVPNGatewayConnectionStaticRouteModeLocalPrototype unmarshals an instance of VPNGatewayConnectionStaticRouteModeLocalPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionStaticRouteModeLocalPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionStaticRouteModeLocalPrototype)
	err = core.UnmarshalModel(m, "ike_identities", &obj.IkeIdentities, UnmarshalVPNGatewayConnectionIkeIdentityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identities-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionStaticRouteModePeer : VPNGatewayConnectionStaticRouteModePeer struct
// Models which "extend" this model:
// - VPNGatewayConnectionStaticRouteModePeerVPNGatewayConnectionPeerByAddress
// - VPNGatewayConnectionStaticRouteModePeerVPNGatewayConnectionPeerByFqdn
type VPNGatewayConnectionStaticRouteModePeer struct {
	// The peer IKE identity.
	IkeIdentity VPNGatewayConnectionIkeIdentityIntf `json:"ike_identity" validate:"required"`

	// Indicates whether `peer.address` or `peer.fqdn` is used.
	Type *string `json:"type" validate:"required"`

	// The IP address of the peer VPN gateway for this connection.
	Address *string `json:"address,omitempty"`

	// The FQDN of the peer VPN gateway for this connection.
	Fqdn *string `json:"fqdn,omitempty"`
}

// Constants associated with the VPNGatewayConnectionStaticRouteModePeer.Type property.
// Indicates whether `peer.address` or `peer.fqdn` is used.
const (
	VPNGatewayConnectionStaticRouteModePeerTypeAddressConst = "address"
	VPNGatewayConnectionStaticRouteModePeerTypeFqdnConst    = "fqdn"
)

func (*VPNGatewayConnectionStaticRouteModePeer) isaVPNGatewayConnectionStaticRouteModePeer() bool {
	return true
}

type VPNGatewayConnectionStaticRouteModePeerIntf interface {
	isaVPNGatewayConnectionStaticRouteModePeer() bool
}

// UnmarshalVPNGatewayConnectionStaticRouteModePeer unmarshals an instance of VPNGatewayConnectionStaticRouteModePeer from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionStaticRouteModePeer(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionStaticRouteModePeer)
	err = core.UnmarshalModel(m, "ike_identity", &obj.IkeIdentity, UnmarshalVPNGatewayConnectionIkeIdentity)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "type", &obj.Type)
	if err != nil {
		err = core.SDKErrorf(err, "", "type-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fqdn", &obj.Fqdn)
	if err != nil {
		err = core.SDKErrorf(err, "", "fqdn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionStaticRouteModePeerPrototype : VPNGatewayConnectionStaticRouteModePeerPrototype struct
// Models which "extend" this model:
// - VPNGatewayConnectionStaticRouteModePeerPrototypeVPNGatewayConnectionPeerByAddress
// - VPNGatewayConnectionStaticRouteModePeerPrototypeVPNGatewayConnectionPeerByFqdn
type VPNGatewayConnectionStaticRouteModePeerPrototype struct {
	// The peer IKE identity to use.
	//
	// If unspecified:
	// - If `peer.address` is specified, the `type` will be `ipv4_address`, and
	// the `value` will be `peer.address`.
	// - If `peer.fqdn` is specified, the `type` will be `fqdn`, and the `value`
	// will be `peer.fqdn`.
	IkeIdentity VPNGatewayConnectionIkeIdentityPrototypeIntf `json:"ike_identity,omitempty"`

	// The IP address of the peer VPN gateway for this connection.
	Address *string `json:"address,omitempty"`

	// The FQDN of the peer VPN gateway for this connection.
	Fqdn *string `json:"fqdn,omitempty"`
}

func (*VPNGatewayConnectionStaticRouteModePeerPrototype) isaVPNGatewayConnectionStaticRouteModePeerPrototype() bool {
	return true
}

type VPNGatewayConnectionStaticRouteModePeerPrototypeIntf interface {
	isaVPNGatewayConnectionStaticRouteModePeerPrototype() bool
}

// UnmarshalVPNGatewayConnectionStaticRouteModePeerPrototype unmarshals an instance of VPNGatewayConnectionStaticRouteModePeerPrototype from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionStaticRouteModePeerPrototype(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionStaticRouteModePeerPrototype)
	err = core.UnmarshalModel(m, "ike_identity", &obj.IkeIdentity, UnmarshalVPNGatewayConnectionIkeIdentityPrototype)
	if err != nil {
		err = core.SDKErrorf(err, "", "ike_identity-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "address", &obj.Address)
	if err != nil {
		err = core.SDKErrorf(err, "", "address-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "fqdn", &obj.Fqdn)
	if err != nil {
		err = core.SDKErrorf(err, "", "fqdn-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionStaticRouteModeTunnel : VPNGatewayConnectionStaticRouteModeTunnel struct
type VPNGatewayConnectionStaticRouteModeTunnel struct {
	// The IP address of the VPN gateway member in which the tunnel resides.
	PublicIP *IP `json:"public_ip" validate:"required"`

	// The status of the VPN Tunnel.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Status *string `json:"status" validate:"required"`

	// The reasons for the current status (if any).
	StatusReasons []VPNGatewayConnectionTunnelStatusReason `json:"status_reasons" validate:"required"`
}

// Constants associated with the VPNGatewayConnectionStaticRouteModeTunnel.Status property.
// The status of the VPN Tunnel.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayConnectionStaticRouteModeTunnelStatusDownConst = "down"
	VPNGatewayConnectionStaticRouteModeTunnelStatusUpConst   = "up"
)

// UnmarshalVPNGatewayConnectionStaticRouteModeTunnel unmarshals an instance of VPNGatewayConnectionStaticRouteModeTunnel from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionStaticRouteModeTunnel(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionStaticRouteModeTunnel)
	err = core.UnmarshalModel(m, "public_ip", &obj.PublicIP, UnmarshalIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "status", &obj.Status)
	if err != nil {
		err = core.SDKErrorf(err, "", "status-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "status_reasons", &obj.StatusReasons, UnmarshalVPNGatewayConnectionTunnelStatusReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "status_reasons-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionStatusReason : VPNGatewayConnectionStatusReason struct
type VPNGatewayConnectionStatusReason struct {
	// A snake case string succinctly identifying the status reason.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this VPN gateway connection's status.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPNGatewayConnectionStatusReason.Code property.
// A snake case string succinctly identifying the status reason.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayConnectionStatusReasonCodeCannotAuthenticateConnectionConst   = "cannot_authenticate_connection"
	VPNGatewayConnectionStatusReasonCodeIkePolicyMismatchConst              = "ike_policy_mismatch"
	VPNGatewayConnectionStatusReasonCodeIkeV1IDLocalRemoteCIDRMismatchConst = "ike_v1_id_local_remote_cidr_mismatch"
	VPNGatewayConnectionStatusReasonCodeIkeV2LocalRemoteCIDRMismatchConst   = "ike_v2_local_remote_cidr_mismatch"
	VPNGatewayConnectionStatusReasonCodeInternalErrorConst                  = "internal_error"
	VPNGatewayConnectionStatusReasonCodeIpsecPolicyMismatchConst            = "ipsec_policy_mismatch"
	VPNGatewayConnectionStatusReasonCodePeerNotRespondingConst              = "peer_not_responding"
)

// UnmarshalVPNGatewayConnectionStatusReason unmarshals an instance of VPNGatewayConnectionStatusReason from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayConnectionTunnelStatusReason : VPNGatewayConnectionTunnelStatusReason struct
type VPNGatewayConnectionTunnelStatusReason struct {
	// A reason code for this status:
	// - `cannot_authenticate_connection`: Failed to authenticate a connection because of
	//   mismatched IKE ID and PSK (check IKE ID and PSK in peer VPN configuration)
	// - `internal_error`: Internal error (contact IBM support)
	// - `ike_policy_mismatch`: None of the proposed IKE crypto suites was acceptable (check
	//    the IKE policies on both sides of the VPN)
	// - `ike_v1_id_local_remote_cidr_mismatch`: Invalid IKE ID or mismatched local CIDRs and
	//   remote CIDRs in IKE V1 (check the IKE ID or the local CIDRs and remote CIDRs in IKE
	//   V1 configuration)
	// - `ike_v2_local_remote_cidr_mismatch`: Mismatched local CIDRs and remote CIDRs in IKE
	//   V2 (check the local CIDRs and remote CIDRs in IKE V2 configuration)
	// - `ipsec_policy_mismatch`: None of the proposed IPsec crypto suites was acceptable
	//   (check the IPsec policies on both sides of the VPN)
	// - `peer_not_responding`: No response from peer (check network ACL configuration, peer
	//   availability, and on-premise firewall configuration)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this VPN gateway connection tunnel's status.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about this status reason.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPNGatewayConnectionTunnelStatusReason.Code property.
// A reason code for this status:
//   - `cannot_authenticate_connection`: Failed to authenticate a connection because of
//     mismatched IKE ID and PSK (check IKE ID and PSK in peer VPN configuration)
//   - `internal_error`: Internal error (contact IBM support)
//   - `ike_policy_mismatch`: None of the proposed IKE crypto suites was acceptable (check
//     the IKE policies on both sides of the VPN)
//   - `ike_v1_id_local_remote_cidr_mismatch`: Invalid IKE ID or mismatched local CIDRs and
//     remote CIDRs in IKE V1 (check the IKE ID or the local CIDRs and remote CIDRs in IKE
//     V1 configuration)
//   - `ike_v2_local_remote_cidr_mismatch`: Mismatched local CIDRs and remote CIDRs in IKE
//     V2 (check the local CIDRs and remote CIDRs in IKE V2 configuration)
//   - `ipsec_policy_mismatch`: None of the proposed IPsec crypto suites was acceptable
//     (check the IPsec policies on both sides of the VPN)
//   - `peer_not_responding`: No response from peer (check network ACL configuration, peer
//     availability, and on-premise firewall configuration)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayConnectionTunnelStatusReasonCodeCannotAuthenticateConnectionConst   = "cannot_authenticate_connection"
	VPNGatewayConnectionTunnelStatusReasonCodeIkePolicyMismatchConst              = "ike_policy_mismatch"
	VPNGatewayConnectionTunnelStatusReasonCodeIkeV1IDLocalRemoteCIDRMismatchConst = "ike_v1_id_local_remote_cidr_mismatch"
	VPNGatewayConnectionTunnelStatusReasonCodeIkeV2LocalRemoteCIDRMismatchConst   = "ike_v2_local_remote_cidr_mismatch"
	VPNGatewayConnectionTunnelStatusReasonCodeInternalErrorConst                  = "internal_error"
	VPNGatewayConnectionTunnelStatusReasonCodeIpsecPolicyMismatchConst            = "ipsec_policy_mismatch"
	VPNGatewayConnectionTunnelStatusReasonCodePeerNotRespondingConst              = "peer_not_responding"
)

// UnmarshalVPNGatewayConnectionTunnelStatusReason unmarshals an instance of VPNGatewayConnectionTunnelStatusReason from the specified map of raw messages.
func UnmarshalVPNGatewayConnectionTunnelStatusReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayConnectionTunnelStatusReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayHealthReason : VPNGatewayHealthReason struct
type VPNGatewayHealthReason struct {
	// A reason code for this health state:
	// - `cannot_create_vpc_route`: VPN cannot create route (check for conflict)
	// - `cannot_reserve_ip_address`: IP address exhaustion (release addresses on the VPN's
	//   subnet)
	// - `internal_error`: Internal error (contact IBM support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPNGatewayHealthReason.Code property.
// A reason code for this health state:
//   - `cannot_create_vpc_route`: VPN cannot create route (check for conflict)
//   - `cannot_reserve_ip_address`: IP address exhaustion (release addresses on the VPN's
//     subnet)
//   - `internal_error`: Internal error (contact IBM support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayHealthReasonCodeCannotCreateVPCRouteConst   = "cannot_create_vpc_route"
	VPNGatewayHealthReasonCodeCannotReserveIPAddressConst = "cannot_reserve_ip_address"
	VPNGatewayHealthReasonCodeInternalErrorConst          = "internal_error"
)

// UnmarshalVPNGatewayHealthReason unmarshals an instance of VPNGatewayHealthReason from the specified map of raw messages.
func UnmarshalVPNGatewayHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayLifecycleReason : VPNGatewayLifecycleReason struct
type VPNGatewayLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPNGatewayLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayLifecycleReasonCodeInternalErrorConst               = "internal_error"
	VPNGatewayLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalVPNGatewayLifecycleReason unmarshals an instance of VPNGatewayLifecycleReason from the specified map of raw messages.
func UnmarshalVPNGatewayLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayMember : VPNGatewayMember struct
type VPNGatewayMember struct {
	// The reasons for the current `health_state` (if any).
	HealthReasons []VPNGatewayMemberHealthReason `json:"health_reasons" validate:"required"`

	// The health of this resource:
	// - `ok`: No abnormal behavior detected
	// - `degraded`: Experiencing compromised performance, capacity, or connectivity
	// - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
	// - `inapplicable`: The health state does not apply because of the current lifecycle
	//    state. A resource with a lifecycle state of `failed` or `deleting` will have a
	//    health state of `inapplicable`. A `pending` resource may also have this state.
	HealthState *string `json:"health_state" validate:"required"`

	// The reasons for the current `lifecycle_state` (if any).
	LifecycleReasons []VPNGatewayMemberLifecycleReason `json:"lifecycle_reasons" validate:"required"`

	// The lifecycle state of the VPN gateway member.
	LifecycleState *string `json:"lifecycle_state" validate:"required"`

	// The reserved IP address assigned to the VPN gateway member.
	//
	// This property will be present only when the VPN gateway status is `available`.
	PrivateIP *ReservedIPReference `json:"private_ip" validate:"required"`

	// The public IP address assigned to the VPN gateway member.
	PublicIP *IP `json:"public_ip" validate:"required"`

	// The high availability role assigned to the VPN gateway member.
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Role *string `json:"role" validate:"required"`
}

// Constants associated with the VPNGatewayMember.HealthState property.
// The health of this resource:
//   - `ok`: No abnormal behavior detected
//   - `degraded`: Experiencing compromised performance, capacity, or connectivity
//   - `faulted`: Completely unreachable, inoperative, or otherwise entirely incapacitated
//   - `inapplicable`: The health state does not apply because of the current lifecycle
//     state. A resource with a lifecycle state of `failed` or `deleting` will have a
//     health state of `inapplicable`. A `pending` resource may also have this state.
const (
	VPNGatewayMemberHealthStateDegradedConst     = "degraded"
	VPNGatewayMemberHealthStateFaultedConst      = "faulted"
	VPNGatewayMemberHealthStateInapplicableConst = "inapplicable"
	VPNGatewayMemberHealthStateOkConst           = "ok"
)

// Constants associated with the VPNGatewayMember.LifecycleState property.
// The lifecycle state of the VPN gateway member.
const (
	VPNGatewayMemberLifecycleStateDeletingConst  = "deleting"
	VPNGatewayMemberLifecycleStateFailedConst    = "failed"
	VPNGatewayMemberLifecycleStatePendingConst   = "pending"
	VPNGatewayMemberLifecycleStateStableConst    = "stable"
	VPNGatewayMemberLifecycleStateSuspendedConst = "suspended"
	VPNGatewayMemberLifecycleStateUpdatingConst  = "updating"
	VPNGatewayMemberLifecycleStateWaitingConst   = "waiting"
)

// Constants associated with the VPNGatewayMember.Role property.
// The high availability role assigned to the VPN gateway member.
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayMemberRoleActiveConst  = "active"
	VPNGatewayMemberRoleStandbyConst = "standby"
)

// UnmarshalVPNGatewayMember unmarshals an instance of VPNGatewayMember from the specified map of raw messages.
func UnmarshalVPNGatewayMember(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayMember)
	err = core.UnmarshalModel(m, "health_reasons", &obj.HealthReasons, UnmarshalVPNGatewayMemberHealthReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "health_state", &obj.HealthState)
	if err != nil {
		err = core.SDKErrorf(err, "", "health_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "lifecycle_reasons", &obj.LifecycleReasons, UnmarshalVPNGatewayMemberLifecycleReason)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_reasons-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "lifecycle_state", &obj.LifecycleState)
	if err != nil {
		err = core.SDKErrorf(err, "", "lifecycle_state-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "private_ip", &obj.PrivateIP, UnmarshalReservedIPReference)
	if err != nil {
		err = core.SDKErrorf(err, "", "private_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalModel(m, "public_ip", &obj.PublicIP, UnmarshalIP)
	if err != nil {
		err = core.SDKErrorf(err, "", "public_ip-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "role", &obj.Role)
	if err != nil {
		err = core.SDKErrorf(err, "", "role-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayMemberHealthReason : VPNGatewayMemberHealthReason struct
type VPNGatewayMemberHealthReason struct {
	// A reason code for this health state:
	// - `cannot_reserve_ip_address`: IP address exhaustion (release addresses on the VPN's
	//   subnet)
	// - `internal_error`: Internal error (contact IBM support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this health state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this health state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPNGatewayMemberHealthReason.Code property.
// A reason code for this health state:
//   - `cannot_reserve_ip_address`: IP address exhaustion (release addresses on the VPN's
//     subnet)
//   - `internal_error`: Internal error (contact IBM support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayMemberHealthReasonCodeCannotReserveIPAddressConst = "cannot_reserve_ip_address"
	VPNGatewayMemberHealthReasonCodeInternalErrorConst          = "internal_error"
)

// UnmarshalVPNGatewayMemberHealthReason unmarshals an instance of VPNGatewayMemberHealthReason from the specified map of raw messages.
func UnmarshalVPNGatewayMemberHealthReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayMemberHealthReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayMemberLifecycleReason : VPNGatewayMemberLifecycleReason struct
type VPNGatewayMemberLifecycleReason struct {
	// A reason code for this lifecycle state:
	// - `internal_error`: internal error (contact IBM support)
	// - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
	//   support)
	//
	// The enumerated values for this property may
	// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
	Code *string `json:"code" validate:"required"`

	// An explanation of the reason for this lifecycle state.
	Message *string `json:"message" validate:"required"`

	// A link to documentation about the reason for this lifecycle state.
	MoreInfo *string `json:"more_info,omitempty"`
}

// Constants associated with the VPNGatewayMemberLifecycleReason.Code property.
// A reason code for this lifecycle state:
//   - `internal_error`: internal error (contact IBM support)
//   - `resource_suspended_by_provider`: The resource has been suspended (contact IBM
//     support)
//
// The enumerated values for this property may
// [expand](https://cloud.ibm.com/apidocs/vpc#property-value-expansion) in the future.
const (
	VPNGatewayMemberLifecycleReasonCodeInternalErrorConst               = "internal_error"
	VPNGatewayMemberLifecycleReasonCodeResourceSuspendedByProviderConst = "resource_suspended_by_provider"
)

// UnmarshalVPNGatewayMemberLifecycleReason unmarshals an instance of VPNGatewayMemberLifecycleReason from the specified map of raw messages.
func UnmarshalVPNGatewayMemberLifecycleReason(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayMemberLifecycleReason)
	err = core.UnmarshalPrimitive(m, "code", &obj.Code)
	if err != nil {
		err = core.SDKErrorf(err, "", "code-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "message", &obj.Message)
	if err != nil {
		err = core.SDKErrorf(err, "", "message-error", common.GetComponentInfo())
		return
	}
	err = core.UnmarshalPrimitive(m, "more_info", &obj.MoreInfo)
	if err != nil {
		err = core.SDKErrorf(err, "", "more_info-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// VPNGatewayPatch : VPNGatewayPatch struct
type VPNGatewayPatch struct {
	// The name for this VPN gateway. The name must not be used by another VPN gateway in the VPC.
	Name *string `json:"name,omitempty"`
}

// UnmarshalVPNGatewayPatch unmarshals an instance of VPNGatewayPatch from the specified map of raw messages.
func UnmarshalVPNGatewayPatch(m map[string]json.RawMessage, result interface{}) (err error) {
	obj := new(VPNGatewayPatch)
	err = core.UnmarshalPrimitive(m, "name", &obj.Name)
	if err != nil {
		err = core.SDKErrorf(err, "", "name-error", common.GetComponentInfo())
		return
	}
	reflect.ValueOf(result).Elem().Set(reflect.ValueOf(obj))
	return
}

// AsPatch returns a generic map representation of the VPNGatewayPatch
func (vpnGatewayPatch *VPNGatewayPatch) As