/*
Copyright 2020 The Kubernetes Authors.

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.
*/

package framework

import "time"

const (
	// Default timeouts to be used in TimeoutContext
	podStartTimeout                  = 5 * time.Minute
	podStartShortTimeout             = 2 * time.Minute
	podStartSlowTimeout              = 15 * time.Minute
	podDeleteTimeout                 = 5 * time.Minute
	claimProvisionTimeout            = 5 * time.Minute
	claimProvisionShortTimeout       = 1 * time.Minute
	dataSourceProvisionTimeout       = 5 * time.Minute
	claimBoundTimeout                = 3 * time.Minute
	pvReclaimTimeout                 = 3 * time.Minute
	pvBoundTimeout                   = 3 * time.Minute
	pvCreateTimeout                  = 3 * time.Minute
	pvDeleteTimeout                  = 5 * time.Minute
	pvDeleteSlowTimeout              = 20 * time.Minute
	snapshotCreateTimeout            = 5 * time.Minute
	snapshotDeleteTimeout            = 5 * time.Minute
	snapshotControllerMetricsTimeout = 5 * time.Minute
)

// TimeoutContext contains timeout settings for several actions.
type TimeoutContext struct {
	// PodStart is how long to wait for the pod to be started.
	PodStart time.Duration

	// PodStartShort is same as `PodStart`, but shorter.
	// Use it in a case-by-case basis, mostly when you are sure pod start will not be delayed.
	PodStartShort time.Duration

	// PodStartSlow is same as `PodStart`, but longer.
	// Use it in a case-by-case basis, mostly when you are sure pod start will take longer than usual.
	PodStartSlow time.Duration

	// PodDelete is how long to wait for the pod to be deleted.
	PodDelete time.Duration

	// ClaimProvision is how long claims have to become dynamically provisioned.
	ClaimProvision time.Duration

	// DataSourceProvision is how long claims have to become dynamically provisioned from source claim.
	DataSourceProvision time.Duration

	// ClaimProvisionShort is the same as `ClaimProvision`, but shorter.
	ClaimProvisionShort time.Duration

	// ClaimBound is how long claims have to become bound.
	ClaimBound time.Duration

	// PVReclaim is how long PVs have to become reclaimed.
	PVReclaim time.Duration

	// PVBound is how long PVs have to become bound.
	PVBound time.Duration

	// PVCreate is how long PVs have to be created.
	PVCreate time.Duration

	// PVDelete is how long PVs have to become deleted.
	PVDelete time.Duration

	// PVDeleteSlow is the same as PVDelete, but slower.
	PVDeleteSlow time.Duration

	// SnapshotCreate is how long for snapshot to create snapshotContent.
	SnapshotCreate time.Duration

	// SnapshotDelete is how long for snapshot to delete snapshotContent.
	SnapshotDelete time.Duration

	// SnapshotControllerMetrics is how long to wait for snapshot controller metrics.
	SnapshotControllerMetrics time.Duration
}

// NewTimeoutContextWithDefaults returns a TimeoutContext with default values.
func NewTimeoutContextWithDefaults() *TimeoutContext {
	return &TimeoutContext{
		PodStart:                  podStartTimeout,
		PodStartShort:             podStartShortTimeout,
		PodStartSlow:              podStartSlowTimeout,
		PodDelete:                 podDeleteTimeout,
		ClaimProvision:            claimProvisionTimeout,
		ClaimProvisionShort:       claimProvisionShortTimeout,
		DataSourceProvision:       dataSourceProvisionTimeout,
		ClaimBound:                claimBoundTimeout,
		PVReclaim:                 pvReclaimTimeout,
		PVBound:                   pvBoundTimeout,
		PVCreate:                  pvCreateTimeout,
		PVDelete:                  pvDeleteTimeout,
		PVDeleteSlow:              pvDeleteSlowTimeout,
		SnapshotCreate:            snapshotCreateTimeout,
		SnapshotDelete:            snapshotDeleteTimeout,
		SnapshotControllerMetrics: snapshotControllerMetricsTimeout,
	}
}
