package containerinstance

// Copyright (c) Microsoft and contributors.  All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is regenerated.

import (
	"github.com/Azure/go-autorest/autorest"
	"github.com/Azure/go-autorest/autorest/date"
	"github.com/Azure/go-autorest/autorest/to"
	"net/http"
)

// ContainerGroupNetworkProtocol enumerates the values for container group network protocol.
type ContainerGroupNetworkProtocol string

const (
	// TCP specifies the tcp state for container group network protocol.
	TCP ContainerGroupNetworkProtocol = "TCP"
	// UDP specifies the udp state for container group network protocol.
	UDP ContainerGroupNetworkProtocol = "UDP"
)

// ContainerRestartPolicy enumerates the values for container restart policy.
type ContainerRestartPolicy string

const (
	// Always specifies the always state for container restart policy.
	Always ContainerRestartPolicy = "always"
)

// OperatingSystemTypes enumerates the values for operating system types.
type OperatingSystemTypes string

const (
	// Linux specifies the linux state for operating system types.
	Linux OperatingSystemTypes = "Linux"
	// Windows specifies the windows state for operating system types.
	Windows OperatingSystemTypes = "Windows"
)

// AzureFileVolume is the properties of the Azure File volume. Azure File shares are mounted as volumes.
type AzureFileVolume struct {
	ShareName          *string `json:"shareName,omitempty"`
	ReadOnly           *bool   `json:"readOnly,omitempty"`
	StorageAccountName *string `json:"storageAccountName,omitempty"`
	StorageAccountKey  *string `json:"storageAccountKey,omitempty"`
}

// Container is a container instance.
type Container struct {
	Name                 *string `json:"name,omitempty"`
	*ContainerProperties `json:"properties,omitempty"`
}

// ContainerEvent is a container instance event.
type ContainerEvent struct {
	Count          *int32     `json:"count,omitempty"`
	FirstTimestamp *date.Time `json:"firstTimestamp,omitempty"`
	LastTimestamp  *date.Time `json:"lastTimestamp,omitempty"`
	Message        *string    `json:"message,omitempty"`
	Type           *string    `json:"type,omitempty"`
}

// ContainerGroup is a container group.
type ContainerGroup struct {
	autorest.Response         `json:"-"`
	ID                        *string             `json:"id,omitempty"`
	Name                      *string             `json:"name,omitempty"`
	Type                      *string             `json:"type,omitempty"`
	Location                  *string             `json:"location,omitempty"`
	Tags                      *map[string]*string `json:"tags,omitempty"`
	*ContainerGroupProperties `json:"properties,omitempty"`
}

// ContainerGroupProperties is
type ContainerGroupProperties struct {
	ProvisioningState        *string                    `json:"provisioningState,omitempty"`
	Containers               *[]Container               `json:"containers,omitempty"`
	ImageRegistryCredentials *[]ImageRegistryCredential `json:"imageRegistryCredentials,omitempty"`
	RestartPolicy            ContainerRestartPolicy     `json:"restartPolicy,omitempty"`
	IPAddress                *IPAddress                 `json:"ipAddress,omitempty"`
	OsType                   OperatingSystemTypes       `json:"osType,omitempty"`
	State                    *string                    `json:"state,omitempty"`
	Volumes                  *[]Volume                  `json:"volumes,omitempty"`
}

// ContainerGroupListResult is the container group list response that contains the container group properties.
type ContainerGroupListResult struct {
	autorest.Response `json:"-"`
	Value             *[]ContainerGroup `json:"value,omitempty"`
	NextLink          *string           `json:"nextLink,omitempty"`
}

// ContainerGroupListResultPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client ContainerGroupListResult) ContainerGroupListResultPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// ContainerPort is the port exposed on the container instance.
type ContainerPort struct {
	Port *int32 `json:"port,omitempty"`
}

// ContainerProperties is the container instance properties.
type ContainerProperties struct {
	Image                *string                          `json:"image,omitempty"`
	Command              *[]string                        `json:"command,omitempty"`
	Ports                *[]ContainerPort                 `json:"ports,omitempty"`
	EnvironmentVariables *[]EnvironmentVariable           `json:"environmentVariables,omitempty"`
	InstanceView         *ContainerPropertiesInstanceView `json:"instanceView,omitempty"`
	Resources            *ResourceRequirements            `json:"resources,omitempty"`
	VolumeMounts         *[]VolumeMount                   `json:"volumeMounts,omitempty"`
}

// ContainerPropertiesInstanceView is the instance view of the container instance. Only valid in response.
type ContainerPropertiesInstanceView struct {
	RestartCount  *int32            `json:"restartCount,omitempty"`
	CurrentState  *ContainerState   `json:"currentState,omitempty"`
	PreviousState *ContainerState   `json:"previousState,omitempty"`
	Events        *[]ContainerEvent `json:"events,omitempty"`
}

// ContainerState is the container instance state.
type ContainerState struct {
	State        *string    `json:"state,omitempty"`
	StartTime    *date.Time `json:"startTime,omitempty"`
	ExitCode     *int32     `json:"exitCode,omitempty"`
	FinishTime   *date.Time `json:"finishTime,omitempty"`
	DetailStatus *string    `json:"detailStatus,omitempty"`
}

// EnvironmentVariable is the environment variable to set within the container instance.
type EnvironmentVariable struct {
	Name  *string `json:"name,omitempty"`
	Value *string `json:"value,omitempty"`
}

// ImageRegistryCredential is image registry credential.
type ImageRegistryCredential struct {
	Server   *string `json:"server,omitempty"`
	Username *string `json:"username,omitempty"`
	Password *string `json:"password,omitempty"`
}

// IPAddress is IP address for the container group.
type IPAddress struct {
	Ports *[]Port `json:"ports,omitempty"`
	Type  *string `json:"type,omitempty"`
	IP    *string `json:"ip,omitempty"`
}

// Logs is the logs.
type Logs struct {
	autorest.Response `json:"-"`
	Content           *string `json:"content,omitempty"`
}

// Port is the port exposed on the container group.
type Port struct {
	Protocol ContainerGroupNetworkProtocol `json:"protocol,omitempty"`
	Port     *int32                        `json:"port,omitempty"`
}

// Resource is the Resource model definition.
type Resource struct {
	ID       *string             `json:"id,omitempty"`
	Name     *string             `json:"name,omitempty"`
	Type     *string             `json:"type,omitempty"`
	Location *string             `json:"location,omitempty"`
	Tags     *map[string]*string `json:"tags,omitempty"`
}

// ResourceLimits is the resource limits.
type ResourceLimits struct {
	MemoryInGB *float64 `json:"memoryInGB,omitempty"`
	CPU        *float64 `json:"cpu,omitempty"`
}

// ResourceRequests is the resource requests.
type ResourceRequests struct {
	MemoryInGB *float64 `json:"memoryInGB,omitempty"`
	CPU        *float64 `json:"cpu,omitempty"`
}

// ResourceRequirements is the resource requirements.
type ResourceRequirements struct {
	Requests *ResourceRequests `json:"requests,omitempty"`
	Limits   *ResourceLimits   `json:"limits,omitempty"`
}

// Volume is the properties of the volume.
type Volume struct {
	Name      *string          `json:"name,omitempty"`
	AzureFile *AzureFileVolume `json:"azureFile,omitempty"`
}

// VolumeMount is the properties of the volume mount.
type VolumeMount struct {
	Name      *string `json:"name,omitempty"`
	MountPath *string `json:"mountPath,omitempty"`
	ReadOnly  *bool   `json:"readOnly,omitempty"`
}
