/*
	Package resource defines api to manipulate on resources provided by the test-infra.

	Resource:
		TiDBCluster	the tidbcluster, for example a basic tidb cluster, a tidb cluster with tiflash or cdc
		DMCluster	the dmcluster, including the master and worker nodes
		Lightning	the tidb-lightning node, it's a tool used for fast full import of large amounts of data into a TiDB cluster
		BR		is a command-line tool for distributed backup and restoration of the TiDB cluster data
		WorkloadNode	is the workload node which wrap external workloads(eg. sysbench, go-tpc etc)
		MySQL		is a single MySQL node
		KafkaCluster  is the kafka cluster

	ExperimentSpec:
		FailureExperimentSpec	injects the downtime error
		NetworkPartitionSpec	injects the network partition(or split brain) error
		NetworkLatencySpec	specifies the network latency. inject latency: Latency ± Jitter with Correlation% correlation
		NetworkLossSpec		specifies the network packets to drop randomly.
		IODelaySpec		specifies the IO delay.

	ChaosClient is the client to create an delete a chaos experiment.

	For example, to inject a failure error on the first tidb-server:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterTiDBSelectorSpec: &resource.TiDBClusterTiDBSelectorSpec{
				Peer: &[]int{0}[0],
			},
		})

		chaosId, err := tc.ChaosClient().Create(resource.InjectChaosOptions{
			Selector:       selector,
			ExperimentSpec: &resource.FailureExperimentSpec{},
		})

	Inject a failure error on pd leader:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterPDSelectorSpec: &resource.TiDBClusterPDSelectorSpec{
				IsLeader: &[]bool{true, false}[0],
			},
		})

		chaosId, err := tc.ChaosClient().Create(resource.InjectChaosOptions{
			Selector:       selector,
			ExperimentSpec: &resource.FailureExperimentSpec{},
		})

	Or the CDC owner:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterCDCSelectorSpec: &resource.TiDBClusterCDCSelectorSpec{
				IsOwner: &[]bool{true, false}[0],
			},
		})
		chaosId, err := tc.ChaosClient().Create(resource.InjectChaosOptions{
			Selector:       selector,
			ExperimentSpec: &resource.FailureExperimentSpec{},
		})

	Network partition between tidb/pd and tikv/tiflash servers:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterPDSelectorSpec: &resource.TiDBClusterPDSelectorSpec{
				All: true,
			},
			TiDBClusterTiDBSelectorSpec: &resource.TiDBClusterTiDBSelectorSpec{
				All: true,
			},
		})
		target, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterTiKVSelectorSpec: &resource.TiDBClusterTiKVSelectorSpec{
				// All: true,
				StoreLabelSelector: &metav1.LabelSelector{
					MatchLabels: map[string]string{},
				},
			},
			TiDBClusterTiFlashSelectorSpec: &resource.TiDBClusterTiFlashSelectorSpec{
				StoreLabelSelector: &metav1.LabelSelector{
					MatchLabels: map[string]string{},
				},
			},
		})

	Network delay on tikv-servers:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterTiKVSelectorSpec: &resource.TiDBClusterTiKVSelectorSpec{
				All: true,
			},
		})
		chaosId, err := tc.ChaosClient().Create(resource.InjectChaosOptions{
			Selector: selector,
			ExperimentSpec: &resource.NetworkLatencySpec{
				Latency:     "20ms",
				Jitter:      "5ms",
				Correlation: "25",
			},
		})

	Or network loss:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterTiKVSelectorSpec: &resource.TiDBClusterTiKVSelectorSpec{
				All: true,
			},
		})
		chaosId, err := tc.ChaosClient().Create(resource.InjectChaosOptions{
			Selector: selector,
			ExperimentSpec: &resource.NetworkLossSpec{
				Loss:        "25",
				Correlation: "25",
			},
		})
	Or IO delay:
		selector, err := tc.ChaosSelect(resource.TiDBClusterSelectorOpts{
			TiDBClusterTiKVSelectorSpec: &resource.TiDBClusterTiKVSelectorSpec{
				All: true,
			},
		})
		chaosId, err := tc.ChaosClient().Create(resource.InjectChaosOptions{
			Selector: selector,
			ExperimentSpec: &resource.IODelaySpec{
				VolumePath: "/var/lib/tikv",
				Path:       "/var/lib/tikv/data/**\/*",
				Delay:      "100ms",
				Percent:    100,
			},
		})
*/
package resource
