178 lines
4.8 KiB
Python
178 lines
4.8 KiB
Python
"""
|
|
OVH API to order a dedicated server
|
|
"""
|
|
import os
|
|
import time
|
|
import ovh
|
|
|
|
APP_KEY = os.environ.get("OVH_APP_KEY")
|
|
APP_SECRET = os.environ.get("OVH_APP_SECRET")
|
|
CONSUMER_KEY = os.environ.get("OVH_CONSUMER_KEY")
|
|
AUTOPAY = os.environ.get("OVH_AUTOPAY", "1") == "1"
|
|
DEBUG = os.environ.get("OVH_DEBUG", "0") == "1"
|
|
DATACENTERS = os.environ.get("OVH_DATACENTERS", "lon,gra,rbx")
|
|
PLAN_CODE = os.environ.get("OVH_PLAN_CODE")
|
|
OPTIONS = os.environ.get("OVH_OPTIONS")
|
|
QUANTITY = int(os.environ.get("OVH_QUANTITY", "1"))
|
|
INTERVAL = int(os.environ.get("OVH_INTERVAL", "5"))
|
|
|
|
REGION = "ovh-eu"
|
|
ZONE = "IE"
|
|
PURCHASED = 0
|
|
|
|
# Create a client
|
|
client = ovh.Client(
|
|
application_key=APP_KEY,
|
|
application_secret=APP_SECRET,
|
|
consumer_key=CONSUMER_KEY,
|
|
endpoint="ovh-eu"
|
|
)
|
|
|
|
|
|
def get_availability():
|
|
"""
|
|
Get availability of the server in the datacenter
|
|
"""
|
|
response = client.get("/dedicated/server/datacenter/availabilities")
|
|
for dc in DATACENTERS.split(","):
|
|
for item in response:
|
|
if item.get("planCode") == PLAN_CODE:
|
|
for dc_info in item.get("datacenters", []):
|
|
if dc_info.get("datacenter") == dc and dc_info.get("availability") != "unavailable":
|
|
print(f"🔥 Available: {PLAN_CODE} in {dc_info['datacenter']}")
|
|
return {
|
|
"fqn": item.get("fqn"),
|
|
"planCode": item.get("planCode"),
|
|
"datacenter": dc_info["datacenter"],
|
|
}
|
|
print("No availability found.")
|
|
return None
|
|
|
|
|
|
def create_cart():
|
|
"""
|
|
Create a cart and return the cart ID
|
|
"""
|
|
response = client.post("/order/cart", ovhSubsidiary=ZONE)
|
|
cart_id = response.get("cartId")
|
|
print(f"Cart ID: {cart_id}")
|
|
|
|
# Assign cart
|
|
assign_url = f"/order/cart/{cart_id}/assign"
|
|
client.post(assign_url)
|
|
return cart_id
|
|
|
|
|
|
def add_item_to_cart(cart_id, plan_code):
|
|
"""
|
|
Add item to cart and return item ID
|
|
"""
|
|
response = client.post(
|
|
f"/order/cart/{cart_id}/eco",
|
|
planCode=plan_code,
|
|
pricingMode="default",
|
|
duration="P1M",
|
|
quantity=1
|
|
)
|
|
item_id = response.get("itemId")
|
|
print(f"Item ID: {item_id}")
|
|
return item_id
|
|
|
|
|
|
def configure_item(cart_id, item_id, datacenter):
|
|
"""
|
|
Configure the item in the cart
|
|
"""
|
|
client.post(f"/order/cart/{cart_id}/item/{item_id}/configuration", label="dedicated_datacenter", value=datacenter)
|
|
print("Configured dedicated_datacenter")
|
|
|
|
client.post(f"/order/cart/{cart_id}/item/{item_id}/configuration", label="dedicated_os", value="none_64.en")
|
|
print("Configured dedicated_os")
|
|
|
|
client.post(f"/order/cart/{cart_id}/item/{item_id}/configuration", label="region", value=REGION)
|
|
print("Configured region")
|
|
|
|
|
|
def add_options(cart_id, item_id):
|
|
"""
|
|
Add options to the item in the cart
|
|
Get options plan codes using GET /order/cart/{cartId}/eco/options
|
|
"""
|
|
for option in OPTIONS.split(","):
|
|
url = f"/order/cart/{cart_id}/eco/options"
|
|
data = {
|
|
"duration": "P1M",
|
|
"itemId": int(item_id),
|
|
"planCode": option,
|
|
"pricingMode": "default",
|
|
"quantity": 1,
|
|
}
|
|
client.post(
|
|
url,
|
|
**data
|
|
)
|
|
print(f"Added option: {option}")
|
|
|
|
|
|
def checkout_cart(cart_id):
|
|
"""
|
|
Checkout the cart
|
|
"""
|
|
url = f"/order/cart/{cart_id}/checkout"
|
|
if DEBUG:
|
|
client.get(url)
|
|
else:
|
|
data = {
|
|
"autoPayWithPreferredPaymentMethod": AUTOPAY,
|
|
"waiveRetractationPeriod": True,
|
|
}
|
|
client.post(url, **data)
|
|
print("🎉 Order placed")
|
|
|
|
|
|
def run_task():
|
|
"""
|
|
Run the task to order the server
|
|
"""
|
|
if not PLAN_CODE:
|
|
print("PLAN_CODE is required")
|
|
return
|
|
|
|
if not OPTIONS:
|
|
print("OPTIONS is required")
|
|
return
|
|
|
|
if not APP_KEY or not APP_SECRET or not CONSUMER_KEY:
|
|
print("OVH credentials are required")
|
|
return
|
|
|
|
try:
|
|
availability = get_availability()
|
|
if not availability:
|
|
return
|
|
|
|
plan_code = availability["planCode"]
|
|
datacenter = availability["datacenter"]
|
|
|
|
cart_id = create_cart()
|
|
item_id = add_item_to_cart(cart_id, plan_code)
|
|
configure_item(cart_id, item_id, datacenter)
|
|
add_options(cart_id, item_id)
|
|
checkout_cart(cart_id)
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"An error occurred: {e}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
while True:
|
|
purchased = run_task()
|
|
if purchased:
|
|
PURCHASED += 1
|
|
print(f"🎉 Purchased: {PURCHASED}")
|
|
if PURCHASED == QUANTITY:
|
|
print("🎉 Complete")
|
|
break
|
|
time.sleep(INTERVAL)
|