pulumi-spotinst 3.121.0a1750482125__py3-none-any.whl → 3.122.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pulumi-spotinst might be problematic. Click here for more details.
- pulumi_spotinst/__init__.py +9 -0
- pulumi_spotinst/_inputs.py +257 -4
- pulumi_spotinst/aws/_inputs.py +54 -0
- pulumi_spotinst/aws/outputs.py +49 -0
- pulumi_spotinst/gcp/_inputs.py +80 -6
- pulumi_spotinst/gcp/elastigroup.py +8 -0
- pulumi_spotinst/gcp/outputs.py +69 -4
- pulumi_spotinst/gke/_inputs.py +51 -0
- pulumi_spotinst/gke/outputs.py +51 -0
- pulumi_spotinst/notification_center.py +345 -0
- pulumi_spotinst/outputs.py +240 -2
- pulumi_spotinst/pulumi-plugin.json +1 -1
- pulumi_spotinst/stateful_node_azure.py +3 -37
- {pulumi_spotinst-3.121.0a1750482125.dist-info → pulumi_spotinst-3.122.0.dist-info}/METADATA +1 -1
- {pulumi_spotinst-3.121.0a1750482125.dist-info → pulumi_spotinst-3.122.0.dist-info}/RECORD +17 -16
- {pulumi_spotinst-3.121.0a1750482125.dist-info → pulumi_spotinst-3.122.0.dist-info}/WHEEL +0 -0
- {pulumi_spotinst-3.121.0a1750482125.dist-info → pulumi_spotinst-3.122.0.dist-info}/top_level.txt +0 -0
pulumi_spotinst/__init__.py
CHANGED
|
@@ -12,6 +12,7 @@ from .credentials_gcp import *
|
|
|
12
12
|
from .data_integration import *
|
|
13
13
|
from .elastigroup_azure_v3 import *
|
|
14
14
|
from .health_check import *
|
|
15
|
+
from .notification_center import *
|
|
15
16
|
from .ocean_right_sizing_rule import *
|
|
16
17
|
from .provider import *
|
|
17
18
|
from .stateful_node_azure import *
|
|
@@ -253,6 +254,14 @@ _utilities.register(
|
|
|
253
254
|
"spotinst:index/healthCheck:HealthCheck": "HealthCheck"
|
|
254
255
|
}
|
|
255
256
|
},
|
|
257
|
+
{
|
|
258
|
+
"pkg": "spotinst",
|
|
259
|
+
"mod": "index/notificationCenter",
|
|
260
|
+
"fqn": "pulumi_spotinst",
|
|
261
|
+
"classes": {
|
|
262
|
+
"spotinst:index/notificationCenter:NotificationCenter": "NotificationCenter"
|
|
263
|
+
}
|
|
264
|
+
},
|
|
256
265
|
{
|
|
257
266
|
"pkg": "spotinst",
|
|
258
267
|
"mod": "index/oceanRightSizingRule",
|
pulumi_spotinst/_inputs.py
CHANGED
|
@@ -94,6 +94,18 @@ __all__ = [
|
|
|
94
94
|
'ElastigroupAzureV3VmSizesSpotSizeAttributesArgsDict',
|
|
95
95
|
'HealthCheckCheckArgs',
|
|
96
96
|
'HealthCheckCheckArgsDict',
|
|
97
|
+
'NotificationCenterComputePolicyConfigArgs',
|
|
98
|
+
'NotificationCenterComputePolicyConfigArgsDict',
|
|
99
|
+
'NotificationCenterComputePolicyConfigDynamicRuleArgs',
|
|
100
|
+
'NotificationCenterComputePolicyConfigDynamicRuleArgsDict',
|
|
101
|
+
'NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgs',
|
|
102
|
+
'NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgsDict',
|
|
103
|
+
'NotificationCenterComputePolicyConfigEventArgs',
|
|
104
|
+
'NotificationCenterComputePolicyConfigEventArgsDict',
|
|
105
|
+
'NotificationCenterRegisteredUserArgs',
|
|
106
|
+
'NotificationCenterRegisteredUserArgsDict',
|
|
107
|
+
'NotificationCenterSubscriptionArgs',
|
|
108
|
+
'NotificationCenterSubscriptionArgsDict',
|
|
97
109
|
'OceanRightSizingRuleAttachWorkloadArgs',
|
|
98
110
|
'OceanRightSizingRuleAttachWorkloadArgsDict',
|
|
99
111
|
'OceanRightSizingRuleAttachWorkloadNamespaceArgs',
|
|
@@ -2688,6 +2700,247 @@ class HealthCheckCheckArgs:
|
|
|
2688
2700
|
pulumi.set(self, "timeout", value)
|
|
2689
2701
|
|
|
2690
2702
|
|
|
2703
|
+
if not MYPY:
|
|
2704
|
+
class NotificationCenterComputePolicyConfigArgsDict(TypedDict):
|
|
2705
|
+
events: pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigEventArgsDict']]]
|
|
2706
|
+
dynamic_rules: NotRequired[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleArgsDict']]]]
|
|
2707
|
+
resource_ids: NotRequired[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]]
|
|
2708
|
+
should_include_all_resources: NotRequired[pulumi.Input[builtins.bool]]
|
|
2709
|
+
elif False:
|
|
2710
|
+
NotificationCenterComputePolicyConfigArgsDict: TypeAlias = Mapping[str, Any]
|
|
2711
|
+
|
|
2712
|
+
@pulumi.input_type
|
|
2713
|
+
class NotificationCenterComputePolicyConfigArgs:
|
|
2714
|
+
def __init__(__self__, *,
|
|
2715
|
+
events: pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigEventArgs']]],
|
|
2716
|
+
dynamic_rules: Optional[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleArgs']]]] = None,
|
|
2717
|
+
resource_ids: Optional[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]] = None,
|
|
2718
|
+
should_include_all_resources: Optional[pulumi.Input[builtins.bool]] = None):
|
|
2719
|
+
pulumi.set(__self__, "events", events)
|
|
2720
|
+
if dynamic_rules is not None:
|
|
2721
|
+
pulumi.set(__self__, "dynamic_rules", dynamic_rules)
|
|
2722
|
+
if resource_ids is not None:
|
|
2723
|
+
pulumi.set(__self__, "resource_ids", resource_ids)
|
|
2724
|
+
if should_include_all_resources is not None:
|
|
2725
|
+
pulumi.set(__self__, "should_include_all_resources", should_include_all_resources)
|
|
2726
|
+
|
|
2727
|
+
@property
|
|
2728
|
+
@pulumi.getter
|
|
2729
|
+
def events(self) -> pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigEventArgs']]]:
|
|
2730
|
+
return pulumi.get(self, "events")
|
|
2731
|
+
|
|
2732
|
+
@events.setter
|
|
2733
|
+
def events(self, value: pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigEventArgs']]]):
|
|
2734
|
+
pulumi.set(self, "events", value)
|
|
2735
|
+
|
|
2736
|
+
@property
|
|
2737
|
+
@pulumi.getter(name="dynamicRules")
|
|
2738
|
+
def dynamic_rules(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleArgs']]]]:
|
|
2739
|
+
return pulumi.get(self, "dynamic_rules")
|
|
2740
|
+
|
|
2741
|
+
@dynamic_rules.setter
|
|
2742
|
+
def dynamic_rules(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleArgs']]]]):
|
|
2743
|
+
pulumi.set(self, "dynamic_rules", value)
|
|
2744
|
+
|
|
2745
|
+
@property
|
|
2746
|
+
@pulumi.getter(name="resourceIds")
|
|
2747
|
+
def resource_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]]:
|
|
2748
|
+
return pulumi.get(self, "resource_ids")
|
|
2749
|
+
|
|
2750
|
+
@resource_ids.setter
|
|
2751
|
+
def resource_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]]):
|
|
2752
|
+
pulumi.set(self, "resource_ids", value)
|
|
2753
|
+
|
|
2754
|
+
@property
|
|
2755
|
+
@pulumi.getter(name="shouldIncludeAllResources")
|
|
2756
|
+
def should_include_all_resources(self) -> Optional[pulumi.Input[builtins.bool]]:
|
|
2757
|
+
return pulumi.get(self, "should_include_all_resources")
|
|
2758
|
+
|
|
2759
|
+
@should_include_all_resources.setter
|
|
2760
|
+
def should_include_all_resources(self, value: Optional[pulumi.Input[builtins.bool]]):
|
|
2761
|
+
pulumi.set(self, "should_include_all_resources", value)
|
|
2762
|
+
|
|
2763
|
+
|
|
2764
|
+
if not MYPY:
|
|
2765
|
+
class NotificationCenterComputePolicyConfigDynamicRuleArgsDict(TypedDict):
|
|
2766
|
+
filter_conditions: NotRequired[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgsDict']]]]
|
|
2767
|
+
elif False:
|
|
2768
|
+
NotificationCenterComputePolicyConfigDynamicRuleArgsDict: TypeAlias = Mapping[str, Any]
|
|
2769
|
+
|
|
2770
|
+
@pulumi.input_type
|
|
2771
|
+
class NotificationCenterComputePolicyConfigDynamicRuleArgs:
|
|
2772
|
+
def __init__(__self__, *,
|
|
2773
|
+
filter_conditions: Optional[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgs']]]] = None):
|
|
2774
|
+
if filter_conditions is not None:
|
|
2775
|
+
pulumi.set(__self__, "filter_conditions", filter_conditions)
|
|
2776
|
+
|
|
2777
|
+
@property
|
|
2778
|
+
@pulumi.getter(name="filterConditions")
|
|
2779
|
+
def filter_conditions(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgs']]]]:
|
|
2780
|
+
return pulumi.get(self, "filter_conditions")
|
|
2781
|
+
|
|
2782
|
+
@filter_conditions.setter
|
|
2783
|
+
def filter_conditions(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgs']]]]):
|
|
2784
|
+
pulumi.set(self, "filter_conditions", value)
|
|
2785
|
+
|
|
2786
|
+
|
|
2787
|
+
if not MYPY:
|
|
2788
|
+
class NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgsDict(TypedDict):
|
|
2789
|
+
expression: NotRequired[pulumi.Input[builtins.str]]
|
|
2790
|
+
identifier: NotRequired[pulumi.Input[builtins.str]]
|
|
2791
|
+
operator: NotRequired[pulumi.Input[builtins.str]]
|
|
2792
|
+
elif False:
|
|
2793
|
+
NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgsDict: TypeAlias = Mapping[str, Any]
|
|
2794
|
+
|
|
2795
|
+
@pulumi.input_type
|
|
2796
|
+
class NotificationCenterComputePolicyConfigDynamicRuleFilterConditionArgs:
|
|
2797
|
+
def __init__(__self__, *,
|
|
2798
|
+
expression: Optional[pulumi.Input[builtins.str]] = None,
|
|
2799
|
+
identifier: Optional[pulumi.Input[builtins.str]] = None,
|
|
2800
|
+
operator: Optional[pulumi.Input[builtins.str]] = None):
|
|
2801
|
+
if expression is not None:
|
|
2802
|
+
pulumi.set(__self__, "expression", expression)
|
|
2803
|
+
if identifier is not None:
|
|
2804
|
+
pulumi.set(__self__, "identifier", identifier)
|
|
2805
|
+
if operator is not None:
|
|
2806
|
+
pulumi.set(__self__, "operator", operator)
|
|
2807
|
+
|
|
2808
|
+
@property
|
|
2809
|
+
@pulumi.getter
|
|
2810
|
+
def expression(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2811
|
+
return pulumi.get(self, "expression")
|
|
2812
|
+
|
|
2813
|
+
@expression.setter
|
|
2814
|
+
def expression(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2815
|
+
pulumi.set(self, "expression", value)
|
|
2816
|
+
|
|
2817
|
+
@property
|
|
2818
|
+
@pulumi.getter
|
|
2819
|
+
def identifier(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2820
|
+
return pulumi.get(self, "identifier")
|
|
2821
|
+
|
|
2822
|
+
@identifier.setter
|
|
2823
|
+
def identifier(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2824
|
+
pulumi.set(self, "identifier", value)
|
|
2825
|
+
|
|
2826
|
+
@property
|
|
2827
|
+
@pulumi.getter
|
|
2828
|
+
def operator(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2829
|
+
return pulumi.get(self, "operator")
|
|
2830
|
+
|
|
2831
|
+
@operator.setter
|
|
2832
|
+
def operator(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2833
|
+
pulumi.set(self, "operator", value)
|
|
2834
|
+
|
|
2835
|
+
|
|
2836
|
+
if not MYPY:
|
|
2837
|
+
class NotificationCenterComputePolicyConfigEventArgsDict(TypedDict):
|
|
2838
|
+
event: NotRequired[pulumi.Input[builtins.str]]
|
|
2839
|
+
event_type: NotRequired[pulumi.Input[builtins.str]]
|
|
2840
|
+
elif False:
|
|
2841
|
+
NotificationCenterComputePolicyConfigEventArgsDict: TypeAlias = Mapping[str, Any]
|
|
2842
|
+
|
|
2843
|
+
@pulumi.input_type
|
|
2844
|
+
class NotificationCenterComputePolicyConfigEventArgs:
|
|
2845
|
+
def __init__(__self__, *,
|
|
2846
|
+
event: Optional[pulumi.Input[builtins.str]] = None,
|
|
2847
|
+
event_type: Optional[pulumi.Input[builtins.str]] = None):
|
|
2848
|
+
if event is not None:
|
|
2849
|
+
pulumi.set(__self__, "event", event)
|
|
2850
|
+
if event_type is not None:
|
|
2851
|
+
pulumi.set(__self__, "event_type", event_type)
|
|
2852
|
+
|
|
2853
|
+
@property
|
|
2854
|
+
@pulumi.getter
|
|
2855
|
+
def event(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2856
|
+
return pulumi.get(self, "event")
|
|
2857
|
+
|
|
2858
|
+
@event.setter
|
|
2859
|
+
def event(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2860
|
+
pulumi.set(self, "event", value)
|
|
2861
|
+
|
|
2862
|
+
@property
|
|
2863
|
+
@pulumi.getter(name="eventType")
|
|
2864
|
+
def event_type(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2865
|
+
return pulumi.get(self, "event_type")
|
|
2866
|
+
|
|
2867
|
+
@event_type.setter
|
|
2868
|
+
def event_type(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2869
|
+
pulumi.set(self, "event_type", value)
|
|
2870
|
+
|
|
2871
|
+
|
|
2872
|
+
if not MYPY:
|
|
2873
|
+
class NotificationCenterRegisteredUserArgsDict(TypedDict):
|
|
2874
|
+
subscription_types: NotRequired[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]]
|
|
2875
|
+
user_email: NotRequired[pulumi.Input[builtins.str]]
|
|
2876
|
+
elif False:
|
|
2877
|
+
NotificationCenterRegisteredUserArgsDict: TypeAlias = Mapping[str, Any]
|
|
2878
|
+
|
|
2879
|
+
@pulumi.input_type
|
|
2880
|
+
class NotificationCenterRegisteredUserArgs:
|
|
2881
|
+
def __init__(__self__, *,
|
|
2882
|
+
subscription_types: Optional[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]] = None,
|
|
2883
|
+
user_email: Optional[pulumi.Input[builtins.str]] = None):
|
|
2884
|
+
if subscription_types is not None:
|
|
2885
|
+
pulumi.set(__self__, "subscription_types", subscription_types)
|
|
2886
|
+
if user_email is not None:
|
|
2887
|
+
pulumi.set(__self__, "user_email", user_email)
|
|
2888
|
+
|
|
2889
|
+
@property
|
|
2890
|
+
@pulumi.getter(name="subscriptionTypes")
|
|
2891
|
+
def subscription_types(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]]:
|
|
2892
|
+
return pulumi.get(self, "subscription_types")
|
|
2893
|
+
|
|
2894
|
+
@subscription_types.setter
|
|
2895
|
+
def subscription_types(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[builtins.str]]]]):
|
|
2896
|
+
pulumi.set(self, "subscription_types", value)
|
|
2897
|
+
|
|
2898
|
+
@property
|
|
2899
|
+
@pulumi.getter(name="userEmail")
|
|
2900
|
+
def user_email(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2901
|
+
return pulumi.get(self, "user_email")
|
|
2902
|
+
|
|
2903
|
+
@user_email.setter
|
|
2904
|
+
def user_email(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2905
|
+
pulumi.set(self, "user_email", value)
|
|
2906
|
+
|
|
2907
|
+
|
|
2908
|
+
if not MYPY:
|
|
2909
|
+
class NotificationCenterSubscriptionArgsDict(TypedDict):
|
|
2910
|
+
endpoint: NotRequired[pulumi.Input[builtins.str]]
|
|
2911
|
+
subscription_type: NotRequired[pulumi.Input[builtins.str]]
|
|
2912
|
+
elif False:
|
|
2913
|
+
NotificationCenterSubscriptionArgsDict: TypeAlias = Mapping[str, Any]
|
|
2914
|
+
|
|
2915
|
+
@pulumi.input_type
|
|
2916
|
+
class NotificationCenterSubscriptionArgs:
|
|
2917
|
+
def __init__(__self__, *,
|
|
2918
|
+
endpoint: Optional[pulumi.Input[builtins.str]] = None,
|
|
2919
|
+
subscription_type: Optional[pulumi.Input[builtins.str]] = None):
|
|
2920
|
+
if endpoint is not None:
|
|
2921
|
+
pulumi.set(__self__, "endpoint", endpoint)
|
|
2922
|
+
if subscription_type is not None:
|
|
2923
|
+
pulumi.set(__self__, "subscription_type", subscription_type)
|
|
2924
|
+
|
|
2925
|
+
@property
|
|
2926
|
+
@pulumi.getter
|
|
2927
|
+
def endpoint(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2928
|
+
return pulumi.get(self, "endpoint")
|
|
2929
|
+
|
|
2930
|
+
@endpoint.setter
|
|
2931
|
+
def endpoint(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2932
|
+
pulumi.set(self, "endpoint", value)
|
|
2933
|
+
|
|
2934
|
+
@property
|
|
2935
|
+
@pulumi.getter(name="subscriptionType")
|
|
2936
|
+
def subscription_type(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
2937
|
+
return pulumi.get(self, "subscription_type")
|
|
2938
|
+
|
|
2939
|
+
@subscription_type.setter
|
|
2940
|
+
def subscription_type(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
2941
|
+
pulumi.set(self, "subscription_type", value)
|
|
2942
|
+
|
|
2943
|
+
|
|
2691
2944
|
if not MYPY:
|
|
2692
2945
|
class OceanRightSizingRuleAttachWorkloadArgsDict(TypedDict):
|
|
2693
2946
|
namespaces: pulumi.Input[Sequence[pulumi.Input['OceanRightSizingRuleAttachWorkloadNamespaceArgsDict']]]
|
|
@@ -4863,7 +5116,7 @@ class StatefulNodeAzureSecretVaultCertificateArgs:
|
|
|
4863
5116
|
|
|
4864
5117
|
if not MYPY:
|
|
4865
5118
|
class StatefulNodeAzureSecurityArgsDict(TypedDict):
|
|
4866
|
-
confidential_os_disk_encryption: NotRequired[pulumi.Input[builtins.
|
|
5119
|
+
confidential_os_disk_encryption: NotRequired[pulumi.Input[builtins.str]]
|
|
4867
5120
|
encryption_at_host: NotRequired[pulumi.Input[builtins.bool]]
|
|
4868
5121
|
secure_boot_enabled: NotRequired[pulumi.Input[builtins.bool]]
|
|
4869
5122
|
security_type: NotRequired[pulumi.Input[builtins.str]]
|
|
@@ -4874,7 +5127,7 @@ elif False:
|
|
|
4874
5127
|
@pulumi.input_type
|
|
4875
5128
|
class StatefulNodeAzureSecurityArgs:
|
|
4876
5129
|
def __init__(__self__, *,
|
|
4877
|
-
confidential_os_disk_encryption: Optional[pulumi.Input[builtins.
|
|
5130
|
+
confidential_os_disk_encryption: Optional[pulumi.Input[builtins.str]] = None,
|
|
4878
5131
|
encryption_at_host: Optional[pulumi.Input[builtins.bool]] = None,
|
|
4879
5132
|
secure_boot_enabled: Optional[pulumi.Input[builtins.bool]] = None,
|
|
4880
5133
|
security_type: Optional[pulumi.Input[builtins.str]] = None,
|
|
@@ -4892,11 +5145,11 @@ class StatefulNodeAzureSecurityArgs:
|
|
|
4892
5145
|
|
|
4893
5146
|
@property
|
|
4894
5147
|
@pulumi.getter(name="confidentialOsDiskEncryption")
|
|
4895
|
-
def confidential_os_disk_encryption(self) -> Optional[pulumi.Input[builtins.
|
|
5148
|
+
def confidential_os_disk_encryption(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
4896
5149
|
return pulumi.get(self, "confidential_os_disk_encryption")
|
|
4897
5150
|
|
|
4898
5151
|
@confidential_os_disk_encryption.setter
|
|
4899
|
-
def confidential_os_disk_encryption(self, value: Optional[pulumi.Input[builtins.
|
|
5152
|
+
def confidential_os_disk_encryption(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
4900
5153
|
pulumi.set(self, "confidential_os_disk_encryption", value)
|
|
4901
5154
|
|
|
4902
5155
|
@property
|
pulumi_spotinst/aws/_inputs.py
CHANGED
|
@@ -318,6 +318,8 @@ __all__ = [
|
|
|
318
318
|
'OceanLaunchSpecStartupTaintArgsDict',
|
|
319
319
|
'OceanLaunchSpecStrategyArgs',
|
|
320
320
|
'OceanLaunchSpecStrategyArgsDict',
|
|
321
|
+
'OceanLaunchSpecStrategyOrientationArgs',
|
|
322
|
+
'OceanLaunchSpecStrategyOrientationArgsDict',
|
|
321
323
|
'OceanLaunchSpecTagArgs',
|
|
322
324
|
'OceanLaunchSpecTagArgsDict',
|
|
323
325
|
'OceanLaunchSpecTaintArgs',
|
|
@@ -13210,6 +13212,10 @@ if not MYPY:
|
|
|
13210
13212
|
"""
|
|
13211
13213
|
The configurable amount of time that Ocean will wait for the draining process to complete before terminating an instance. If you have not defined a draining timeout, the default of 300 seconds will be used.
|
|
13212
13214
|
"""
|
|
13215
|
+
orientation: NotRequired[pulumi.Input['OceanLaunchSpecStrategyOrientationArgsDict']]
|
|
13216
|
+
"""
|
|
13217
|
+
Vng orientation configuration.
|
|
13218
|
+
"""
|
|
13213
13219
|
spot_percentage: NotRequired[pulumi.Input[builtins.int]]
|
|
13214
13220
|
"""
|
|
13215
13221
|
The desired percentage of the Spot instances out of all running instances for this VNG. Only available when the field is not set in the cluster directly (cluster.strategy.spotPercentage).
|
|
@@ -13229,17 +13235,21 @@ elif False:
|
|
|
13229
13235
|
class OceanLaunchSpecStrategyArgs:
|
|
13230
13236
|
def __init__(__self__, *,
|
|
13231
13237
|
draining_timeout: Optional[pulumi.Input[builtins.int]] = None,
|
|
13238
|
+
orientation: Optional[pulumi.Input['OceanLaunchSpecStrategyOrientationArgs']] = None,
|
|
13232
13239
|
spot_percentage: Optional[pulumi.Input[builtins.int]] = None,
|
|
13233
13240
|
utilize_commitments: Optional[pulumi.Input[builtins.bool]] = None,
|
|
13234
13241
|
utilize_reserved_instances: Optional[pulumi.Input[builtins.bool]] = None):
|
|
13235
13242
|
"""
|
|
13236
13243
|
:param pulumi.Input[builtins.int] draining_timeout: The configurable amount of time that Ocean will wait for the draining process to complete before terminating an instance. If you have not defined a draining timeout, the default of 300 seconds will be used.
|
|
13244
|
+
:param pulumi.Input['OceanLaunchSpecStrategyOrientationArgs'] orientation: Vng orientation configuration.
|
|
13237
13245
|
:param pulumi.Input[builtins.int] spot_percentage: The desired percentage of the Spot instances out of all running instances for this VNG. Only available when the field is not set in the cluster directly (cluster.strategy.spotPercentage).
|
|
13238
13246
|
:param pulumi.Input[builtins.bool] utilize_commitments: When set as ‘true’, if savings plans commitments have available capacity, Ocean will utilize them alongside RIs (if exist) to maximize cost efficiency. If the value is set as 'null', it will automatically be inherited from the cluster level.
|
|
13239
13247
|
:param pulumi.Input[builtins.bool] utilize_reserved_instances: When set as ‘true’, if reserved instances exist, Ocean will utilize them before launching spot instances. If the value is set as 'null', it will automatically be inherited from the cluster level.
|
|
13240
13248
|
"""
|
|
13241
13249
|
if draining_timeout is not None:
|
|
13242
13250
|
pulumi.set(__self__, "draining_timeout", draining_timeout)
|
|
13251
|
+
if orientation is not None:
|
|
13252
|
+
pulumi.set(__self__, "orientation", orientation)
|
|
13243
13253
|
if spot_percentage is not None:
|
|
13244
13254
|
pulumi.set(__self__, "spot_percentage", spot_percentage)
|
|
13245
13255
|
if utilize_commitments is not None:
|
|
@@ -13259,6 +13269,18 @@ class OceanLaunchSpecStrategyArgs:
|
|
|
13259
13269
|
def draining_timeout(self, value: Optional[pulumi.Input[builtins.int]]):
|
|
13260
13270
|
pulumi.set(self, "draining_timeout", value)
|
|
13261
13271
|
|
|
13272
|
+
@property
|
|
13273
|
+
@pulumi.getter
|
|
13274
|
+
def orientation(self) -> Optional[pulumi.Input['OceanLaunchSpecStrategyOrientationArgs']]:
|
|
13275
|
+
"""
|
|
13276
|
+
Vng orientation configuration.
|
|
13277
|
+
"""
|
|
13278
|
+
return pulumi.get(self, "orientation")
|
|
13279
|
+
|
|
13280
|
+
@orientation.setter
|
|
13281
|
+
def orientation(self, value: Optional[pulumi.Input['OceanLaunchSpecStrategyOrientationArgs']]):
|
|
13282
|
+
pulumi.set(self, "orientation", value)
|
|
13283
|
+
|
|
13262
13284
|
@property
|
|
13263
13285
|
@pulumi.getter(name="spotPercentage")
|
|
13264
13286
|
def spot_percentage(self) -> Optional[pulumi.Input[builtins.int]]:
|
|
@@ -13296,6 +13318,38 @@ class OceanLaunchSpecStrategyArgs:
|
|
|
13296
13318
|
pulumi.set(self, "utilize_reserved_instances", value)
|
|
13297
13319
|
|
|
13298
13320
|
|
|
13321
|
+
if not MYPY:
|
|
13322
|
+
class OceanLaunchSpecStrategyOrientationArgsDict(TypedDict):
|
|
13323
|
+
availability_vs_cost: NotRequired[pulumi.Input[builtins.str]]
|
|
13324
|
+
"""
|
|
13325
|
+
Set this value to control the approach that Ocean takes while launching nodes. Valid values: `"costOriented"`, `"cheapest"`, `"balanced"`.
|
|
13326
|
+
"""
|
|
13327
|
+
elif False:
|
|
13328
|
+
OceanLaunchSpecStrategyOrientationArgsDict: TypeAlias = Mapping[str, Any]
|
|
13329
|
+
|
|
13330
|
+
@pulumi.input_type
|
|
13331
|
+
class OceanLaunchSpecStrategyOrientationArgs:
|
|
13332
|
+
def __init__(__self__, *,
|
|
13333
|
+
availability_vs_cost: Optional[pulumi.Input[builtins.str]] = None):
|
|
13334
|
+
"""
|
|
13335
|
+
:param pulumi.Input[builtins.str] availability_vs_cost: Set this value to control the approach that Ocean takes while launching nodes. Valid values: `"costOriented"`, `"cheapest"`, `"balanced"`.
|
|
13336
|
+
"""
|
|
13337
|
+
if availability_vs_cost is not None:
|
|
13338
|
+
pulumi.set(__self__, "availability_vs_cost", availability_vs_cost)
|
|
13339
|
+
|
|
13340
|
+
@property
|
|
13341
|
+
@pulumi.getter(name="availabilityVsCost")
|
|
13342
|
+
def availability_vs_cost(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
13343
|
+
"""
|
|
13344
|
+
Set this value to control the approach that Ocean takes while launching nodes. Valid values: `"costOriented"`, `"cheapest"`, `"balanced"`.
|
|
13345
|
+
"""
|
|
13346
|
+
return pulumi.get(self, "availability_vs_cost")
|
|
13347
|
+
|
|
13348
|
+
@availability_vs_cost.setter
|
|
13349
|
+
def availability_vs_cost(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
13350
|
+
pulumi.set(self, "availability_vs_cost", value)
|
|
13351
|
+
|
|
13352
|
+
|
|
13299
13353
|
if not MYPY:
|
|
13300
13354
|
class OceanLaunchSpecTagArgsDict(TypedDict):
|
|
13301
13355
|
key: pulumi.Input[builtins.str]
|
pulumi_spotinst/aws/outputs.py
CHANGED
|
@@ -168,6 +168,7 @@ __all__ = [
|
|
|
168
168
|
'OceanLaunchSpecSchedulingTaskTaskHeadroom',
|
|
169
169
|
'OceanLaunchSpecStartupTaint',
|
|
170
170
|
'OceanLaunchSpecStrategy',
|
|
171
|
+
'OceanLaunchSpecStrategyOrientation',
|
|
171
172
|
'OceanLaunchSpecTag',
|
|
172
173
|
'OceanLaunchSpecTaint',
|
|
173
174
|
'OceanLaunchSpecUpdatePolicy',
|
|
@@ -10384,17 +10385,21 @@ class OceanLaunchSpecStrategy(dict):
|
|
|
10384
10385
|
|
|
10385
10386
|
def __init__(__self__, *,
|
|
10386
10387
|
draining_timeout: Optional[builtins.int] = None,
|
|
10388
|
+
orientation: Optional['outputs.OceanLaunchSpecStrategyOrientation'] = None,
|
|
10387
10389
|
spot_percentage: Optional[builtins.int] = None,
|
|
10388
10390
|
utilize_commitments: Optional[builtins.bool] = None,
|
|
10389
10391
|
utilize_reserved_instances: Optional[builtins.bool] = None):
|
|
10390
10392
|
"""
|
|
10391
10393
|
:param builtins.int draining_timeout: The configurable amount of time that Ocean will wait for the draining process to complete before terminating an instance. If you have not defined a draining timeout, the default of 300 seconds will be used.
|
|
10394
|
+
:param 'OceanLaunchSpecStrategyOrientationArgs' orientation: Vng orientation configuration.
|
|
10392
10395
|
:param builtins.int spot_percentage: The desired percentage of the Spot instances out of all running instances for this VNG. Only available when the field is not set in the cluster directly (cluster.strategy.spotPercentage).
|
|
10393
10396
|
:param builtins.bool utilize_commitments: When set as ‘true’, if savings plans commitments have available capacity, Ocean will utilize them alongside RIs (if exist) to maximize cost efficiency. If the value is set as 'null', it will automatically be inherited from the cluster level.
|
|
10394
10397
|
:param builtins.bool utilize_reserved_instances: When set as ‘true’, if reserved instances exist, Ocean will utilize them before launching spot instances. If the value is set as 'null', it will automatically be inherited from the cluster level.
|
|
10395
10398
|
"""
|
|
10396
10399
|
if draining_timeout is not None:
|
|
10397
10400
|
pulumi.set(__self__, "draining_timeout", draining_timeout)
|
|
10401
|
+
if orientation is not None:
|
|
10402
|
+
pulumi.set(__self__, "orientation", orientation)
|
|
10398
10403
|
if spot_percentage is not None:
|
|
10399
10404
|
pulumi.set(__self__, "spot_percentage", spot_percentage)
|
|
10400
10405
|
if utilize_commitments is not None:
|
|
@@ -10410,6 +10415,14 @@ class OceanLaunchSpecStrategy(dict):
|
|
|
10410
10415
|
"""
|
|
10411
10416
|
return pulumi.get(self, "draining_timeout")
|
|
10412
10417
|
|
|
10418
|
+
@property
|
|
10419
|
+
@pulumi.getter
|
|
10420
|
+
def orientation(self) -> Optional['outputs.OceanLaunchSpecStrategyOrientation']:
|
|
10421
|
+
"""
|
|
10422
|
+
Vng orientation configuration.
|
|
10423
|
+
"""
|
|
10424
|
+
return pulumi.get(self, "orientation")
|
|
10425
|
+
|
|
10413
10426
|
@property
|
|
10414
10427
|
@pulumi.getter(name="spotPercentage")
|
|
10415
10428
|
def spot_percentage(self) -> Optional[builtins.int]:
|
|
@@ -10435,6 +10448,42 @@ class OceanLaunchSpecStrategy(dict):
|
|
|
10435
10448
|
return pulumi.get(self, "utilize_reserved_instances")
|
|
10436
10449
|
|
|
10437
10450
|
|
|
10451
|
+
@pulumi.output_type
|
|
10452
|
+
class OceanLaunchSpecStrategyOrientation(dict):
|
|
10453
|
+
@staticmethod
|
|
10454
|
+
def __key_warning(key: str):
|
|
10455
|
+
suggest = None
|
|
10456
|
+
if key == "availabilityVsCost":
|
|
10457
|
+
suggest = "availability_vs_cost"
|
|
10458
|
+
|
|
10459
|
+
if suggest:
|
|
10460
|
+
pulumi.log.warn(f"Key '{key}' not found in OceanLaunchSpecStrategyOrientation. Access the value via the '{suggest}' property getter instead.")
|
|
10461
|
+
|
|
10462
|
+
def __getitem__(self, key: str) -> Any:
|
|
10463
|
+
OceanLaunchSpecStrategyOrientation.__key_warning(key)
|
|
10464
|
+
return super().__getitem__(key)
|
|
10465
|
+
|
|
10466
|
+
def get(self, key: str, default = None) -> Any:
|
|
10467
|
+
OceanLaunchSpecStrategyOrientation.__key_warning(key)
|
|
10468
|
+
return super().get(key, default)
|
|
10469
|
+
|
|
10470
|
+
def __init__(__self__, *,
|
|
10471
|
+
availability_vs_cost: Optional[builtins.str] = None):
|
|
10472
|
+
"""
|
|
10473
|
+
:param builtins.str availability_vs_cost: Set this value to control the approach that Ocean takes while launching nodes. Valid values: `"costOriented"`, `"cheapest"`, `"balanced"`.
|
|
10474
|
+
"""
|
|
10475
|
+
if availability_vs_cost is not None:
|
|
10476
|
+
pulumi.set(__self__, "availability_vs_cost", availability_vs_cost)
|
|
10477
|
+
|
|
10478
|
+
@property
|
|
10479
|
+
@pulumi.getter(name="availabilityVsCost")
|
|
10480
|
+
def availability_vs_cost(self) -> Optional[builtins.str]:
|
|
10481
|
+
"""
|
|
10482
|
+
Set this value to control the approach that Ocean takes while launching nodes. Valid values: `"costOriented"`, `"cheapest"`, `"balanced"`.
|
|
10483
|
+
"""
|
|
10484
|
+
return pulumi.get(self, "availability_vs_cost")
|
|
10485
|
+
|
|
10486
|
+
|
|
10438
10487
|
@pulumi.output_type
|
|
10439
10488
|
class OceanLaunchSpecTag(dict):
|
|
10440
10489
|
def __init__(__self__, *,
|
pulumi_spotinst/gcp/_inputs.py
CHANGED
|
@@ -18,6 +18,8 @@ from .. import _utilities
|
|
|
18
18
|
__all__ = [
|
|
19
19
|
'ElastigroupBackendServiceArgs',
|
|
20
20
|
'ElastigroupBackendServiceArgsDict',
|
|
21
|
+
'ElastigroupBackendServiceBackendBalancingArgs',
|
|
22
|
+
'ElastigroupBackendServiceBackendBalancingArgsDict',
|
|
21
23
|
'ElastigroupBackendServiceNamedPortArgs',
|
|
22
24
|
'ElastigroupBackendServiceNamedPortArgsDict',
|
|
23
25
|
'ElastigroupDiskArgs',
|
|
@@ -74,6 +76,10 @@ if not MYPY:
|
|
|
74
76
|
"""
|
|
75
77
|
The name of the backend service.
|
|
76
78
|
"""
|
|
79
|
+
backend_balancing: NotRequired[pulumi.Input['ElastigroupBackendServiceBackendBalancingArgsDict']]
|
|
80
|
+
"""
|
|
81
|
+
Configure how traffic is distributed across instance groups.
|
|
82
|
+
"""
|
|
77
83
|
location_type: NotRequired[pulumi.Input[builtins.str]]
|
|
78
84
|
"""
|
|
79
85
|
Sets which location the backend services will be active. Valid values: `regional`, `global`.
|
|
@@ -93,16 +99,20 @@ elif False:
|
|
|
93
99
|
class ElastigroupBackendServiceArgs:
|
|
94
100
|
def __init__(__self__, *,
|
|
95
101
|
service_name: pulumi.Input[builtins.str],
|
|
102
|
+
backend_balancing: Optional[pulumi.Input['ElastigroupBackendServiceBackendBalancingArgs']] = None,
|
|
96
103
|
location_type: Optional[pulumi.Input[builtins.str]] = None,
|
|
97
104
|
named_ports: Optional[pulumi.Input[Sequence[pulumi.Input['ElastigroupBackendServiceNamedPortArgs']]]] = None,
|
|
98
105
|
scheme: Optional[pulumi.Input[builtins.str]] = None):
|
|
99
106
|
"""
|
|
100
107
|
:param pulumi.Input[builtins.str] service_name: The name of the backend service.
|
|
108
|
+
:param pulumi.Input['ElastigroupBackendServiceBackendBalancingArgs'] backend_balancing: Configure how traffic is distributed across instance groups.
|
|
101
109
|
:param pulumi.Input[builtins.str] location_type: Sets which location the backend services will be active. Valid values: `regional`, `global`.
|
|
102
110
|
:param pulumi.Input[Sequence[pulumi.Input['ElastigroupBackendServiceNamedPortArgs']]] named_ports: Describes a named port and a list of ports.
|
|
103
111
|
:param pulumi.Input[builtins.str] scheme: Use when `location_type` is "regional". Set the traffic for the backend service to either between the instances in the vpc or to traffic from the internet. Valid values: `INTERNAL`, `EXTERNAL`.
|
|
104
112
|
"""
|
|
105
113
|
pulumi.set(__self__, "service_name", service_name)
|
|
114
|
+
if backend_balancing is not None:
|
|
115
|
+
pulumi.set(__self__, "backend_balancing", backend_balancing)
|
|
106
116
|
if location_type is not None:
|
|
107
117
|
pulumi.set(__self__, "location_type", location_type)
|
|
108
118
|
if named_ports is not None:
|
|
@@ -122,6 +132,18 @@ class ElastigroupBackendServiceArgs:
|
|
|
122
132
|
def service_name(self, value: pulumi.Input[builtins.str]):
|
|
123
133
|
pulumi.set(self, "service_name", value)
|
|
124
134
|
|
|
135
|
+
@property
|
|
136
|
+
@pulumi.getter(name="backendBalancing")
|
|
137
|
+
def backend_balancing(self) -> Optional[pulumi.Input['ElastigroupBackendServiceBackendBalancingArgs']]:
|
|
138
|
+
"""
|
|
139
|
+
Configure how traffic is distributed across instance groups.
|
|
140
|
+
"""
|
|
141
|
+
return pulumi.get(self, "backend_balancing")
|
|
142
|
+
|
|
143
|
+
@backend_balancing.setter
|
|
144
|
+
def backend_balancing(self, value: Optional[pulumi.Input['ElastigroupBackendServiceBackendBalancingArgs']]):
|
|
145
|
+
pulumi.set(self, "backend_balancing", value)
|
|
146
|
+
|
|
125
147
|
@property
|
|
126
148
|
@pulumi.getter(name="locationType")
|
|
127
149
|
def location_type(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
@@ -159,6 +181,64 @@ class ElastigroupBackendServiceArgs:
|
|
|
159
181
|
pulumi.set(self, "scheme", value)
|
|
160
182
|
|
|
161
183
|
|
|
184
|
+
if not MYPY:
|
|
185
|
+
class ElastigroupBackendServiceBackendBalancingArgsDict(TypedDict):
|
|
186
|
+
backend_balancing_mode: NotRequired[pulumi.Input[builtins.str]]
|
|
187
|
+
"""
|
|
188
|
+
The backend balancing mode. Valid values: `RATE`, `UTILIZATION`.
|
|
189
|
+
"""
|
|
190
|
+
max_rate_per_instance: NotRequired[pulumi.Input[builtins.int]]
|
|
191
|
+
"""
|
|
192
|
+
If the backendBalancingMode is set to RATE, this field is required.
|
|
193
|
+
|
|
194
|
+
Usage:
|
|
195
|
+
"""
|
|
196
|
+
elif False:
|
|
197
|
+
ElastigroupBackendServiceBackendBalancingArgsDict: TypeAlias = Mapping[str, Any]
|
|
198
|
+
|
|
199
|
+
@pulumi.input_type
|
|
200
|
+
class ElastigroupBackendServiceBackendBalancingArgs:
|
|
201
|
+
def __init__(__self__, *,
|
|
202
|
+
backend_balancing_mode: Optional[pulumi.Input[builtins.str]] = None,
|
|
203
|
+
max_rate_per_instance: Optional[pulumi.Input[builtins.int]] = None):
|
|
204
|
+
"""
|
|
205
|
+
:param pulumi.Input[builtins.str] backend_balancing_mode: The backend balancing mode. Valid values: `RATE`, `UTILIZATION`.
|
|
206
|
+
:param pulumi.Input[builtins.int] max_rate_per_instance: If the backendBalancingMode is set to RATE, this field is required.
|
|
207
|
+
|
|
208
|
+
Usage:
|
|
209
|
+
"""
|
|
210
|
+
if backend_balancing_mode is not None:
|
|
211
|
+
pulumi.set(__self__, "backend_balancing_mode", backend_balancing_mode)
|
|
212
|
+
if max_rate_per_instance is not None:
|
|
213
|
+
pulumi.set(__self__, "max_rate_per_instance", max_rate_per_instance)
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
@pulumi.getter(name="backendBalancingMode")
|
|
217
|
+
def backend_balancing_mode(self) -> Optional[pulumi.Input[builtins.str]]:
|
|
218
|
+
"""
|
|
219
|
+
The backend balancing mode. Valid values: `RATE`, `UTILIZATION`.
|
|
220
|
+
"""
|
|
221
|
+
return pulumi.get(self, "backend_balancing_mode")
|
|
222
|
+
|
|
223
|
+
@backend_balancing_mode.setter
|
|
224
|
+
def backend_balancing_mode(self, value: Optional[pulumi.Input[builtins.str]]):
|
|
225
|
+
pulumi.set(self, "backend_balancing_mode", value)
|
|
226
|
+
|
|
227
|
+
@property
|
|
228
|
+
@pulumi.getter(name="maxRatePerInstance")
|
|
229
|
+
def max_rate_per_instance(self) -> Optional[pulumi.Input[builtins.int]]:
|
|
230
|
+
"""
|
|
231
|
+
If the backendBalancingMode is set to RATE, this field is required.
|
|
232
|
+
|
|
233
|
+
Usage:
|
|
234
|
+
"""
|
|
235
|
+
return pulumi.get(self, "max_rate_per_instance")
|
|
236
|
+
|
|
237
|
+
@max_rate_per_instance.setter
|
|
238
|
+
def max_rate_per_instance(self, value: Optional[pulumi.Input[builtins.int]]):
|
|
239
|
+
pulumi.set(self, "max_rate_per_instance", value)
|
|
240
|
+
|
|
241
|
+
|
|
162
242
|
if not MYPY:
|
|
163
243
|
class ElastigroupBackendServiceNamedPortArgsDict(TypedDict):
|
|
164
244
|
name: pulumi.Input[builtins.str]
|
|
@@ -168,8 +248,6 @@ if not MYPY:
|
|
|
168
248
|
ports: pulumi.Input[Sequence[pulumi.Input[builtins.str]]]
|
|
169
249
|
"""
|
|
170
250
|
A list of ports.
|
|
171
|
-
|
|
172
|
-
Usage:
|
|
173
251
|
"""
|
|
174
252
|
elif False:
|
|
175
253
|
ElastigroupBackendServiceNamedPortArgsDict: TypeAlias = Mapping[str, Any]
|
|
@@ -182,8 +260,6 @@ class ElastigroupBackendServiceNamedPortArgs:
|
|
|
182
260
|
"""
|
|
183
261
|
:param pulumi.Input[builtins.str] name: The name of the port.
|
|
184
262
|
:param pulumi.Input[Sequence[pulumi.Input[builtins.str]]] ports: A list of ports.
|
|
185
|
-
|
|
186
|
-
Usage:
|
|
187
263
|
"""
|
|
188
264
|
pulumi.set(__self__, "name", name)
|
|
189
265
|
pulumi.set(__self__, "ports", ports)
|
|
@@ -205,8 +281,6 @@ class ElastigroupBackendServiceNamedPortArgs:
|
|
|
205
281
|
def ports(self) -> pulumi.Input[Sequence[pulumi.Input[builtins.str]]]:
|
|
206
282
|
"""
|
|
207
283
|
A list of ports.
|
|
208
|
-
|
|
209
|
-
Usage:
|
|
210
284
|
"""
|
|
211
285
|
return pulumi.get(self, "ports")
|
|
212
286
|
|