Skip to main content

Equinix Metal

A Python client for the Equinix Metal API.

Build Status Stability: Maintained

This repository is Maintained meaning that this software is supported by Equinix Metal and its community - available to use in production environments.

Table of Contents

Installation

The Equinix Metal python api library can be installed using pip:

pip install packet-python

Package information available here:

https://pypi.python.org/pypi/packet-python

Documentation

Full Equinix Metal API documenation is available here: https://metal.equinix.com/developers/api/

Authentication

Provide your credentials when instantiating client:

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

Examples

List Projects

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

projects = manager.list_projects()
for project in projects:
    print(project)

List Plans

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

plans = manager.list_plans()
for plan in plans:
    print(plan)
    if 'cpus' in plan.specs:
        print(plan.specs['cpus'][0]['count'])

Creating a Device

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

device = manager.create_device(project_id='project-id',
                               hostname='node-name-of-your-choice',
                               plan='baremetal_1', metro='sv',
                               operating_system='ubuntu_18_04')
print(device)

Checking the Status and Rebooting a Device

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

device = manager.get_device('device-id')
print(device.state)
device.reboot()

Listing all Devices Limiting to 50 per Page

Equinix Metal API defaults to a limit of 10 per page

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")
params = {
    'per_page': 50
}
devices = manager.list_devices(project_id='project_id', params = params)
print(devices)

Updating a Device

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

device = manager.get_device('device-id')
device.hostname = "test02"
device.description = "new description"

device.update()

Deleting a Device

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

device = manager.get_device('device-id')
device.delete()

Creating a Device Batch

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

batch01 = packet.DeviceBatch({
            "hostname": "batch01",
            "quantity": 2,
            "facility": "ams1",
            "operating_system": "centos_7",
            "plan": "baremetal_0",
        })

device_batch = manager.create_batch(project_id="project_id", params=[batch01])
print(device_batch)

Creating a Volume

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

volume = manager.create_volume(project_id="project-id",
                                description="volume description",
                                plan="storage_1",
                                size="100",
                                facility="ewr1",
                                snapshot_count=7,
                                snapshot_frequency="1day")
print(volume)

Attaching and Detaching a Volume

import packet
import time

manager = packet.Manager(auth_token="yourapiauthtoken")
volume = manager.get_volume("volume_id")

volume.attach("device_id")

while True:
    if manager.get_device("device_id").state == "active":
        break
    time.sleep(2)

volume.detach()

Creating and Restoring a Volume Snapshot

import packet
import time

manager = packet.Manager(auth_token="yourapiauthtoken")

volume = manager.get_volume("volume_id")
volume.create_snapshot()

while True:
    if manager.get_volume(volume.id).state == "active":
        break
    time.sleep(2)

snapshots = manager.get_snapshots(volume.id)
volume.restore(snapshots[0].timestamp)

Listing Project IP Addresses

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

ips = manager.list_project_ips("project_id")
for ip in ips:
    print(ip.address)

Creating a Project for an Organization

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

project = manager.create_organization_project(
    org_id="organization_id",
    name="Integration Tests",
    customdata={"tag": "QA"}
)
print(project)

Creating a VLAN

import packet
manager = packet.Manager(auth_token="yourapiauthtoken")

vlan = manager.create_vlan(project_id="project_id", facility="ewr1")
print(vlan)

Contributing

  • Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
  • Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
  • Fork the project.
  • Start a feature/bugfix branch.
  • Commit and push until you are happy with your contribution.
  • You can test your changes with the tox, which is what GitHub Actions use to check builds.

Credits

CargoCulted with much gratitude from: https://github.com/koalalorenzo/python-digitalocean

Changes

See the Changelog for further details.

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog. This project adheres to Semantic Versioning.

[1.45.0] - Unreleased

Added

Changed

Fixed

[1.44.3] - 2022-07-27

Fixed

  • Fix handling non-dict error data in ResponseError #128 #129

[1.44.2] - 2021-11-18

Fixed

  • Fix logic behind validate_metro_capacity #125

[1.44.1] - 2021-09-20

Fixed

  • Fix metros URL used in Metro API lists #122
  • Catch TypeError when HardwareReservations do not have a device assignment #120

[1.44.0] - 2021-05-19

Added

  • User-Agent header added to client requests #113
  • Metro class added (https://feedback.equinixmetal.com/changelog/new-metros-feature-live) #110
  • Adds metro property to DeviceBatch, Device, IPAddress, VLan #110
  • Adds metro to create_device, reserve_ip_address, create_vlan, create_connection #110
  • Adds list_metros, validate_metro_capacity to Manager #110
  • Adds CODE_OF_CONDUCT.md, SUPPORT.md, OWNERS.md #102, #101, #100
  • Adds package metadata for author, author_email, copyright #114

Changed

  • facility is now optional in create_device, reserve_ip_address, create_vlan, create_connection #110
  • CI is using GH Actions instead of Drone #115

Fixed

  • Handles when IPAddress Facility is null in API responses #117

[1.43.1] - 2020-09-04

Fixed

  • ResponseError fixed for Python2.7 compatibility

[1.43.0] - 2020-07-14

Added

  • Support for reinstalling the operating system to a device, including changing the operating system.
  • Manager.create_vlan now includes a description argument

Changed

  • ResponseError will now be raised when an API call results in an error

Fixed

  • Manager.validate_capacity now considers availability
  • Manager.create_project_ssh_key will retry when it encounters 404 responses following a successful creation.
  • API responses with {"error":""} keys were not handled well, and will now be handled just like {"errors":[""]} keys.

[1.42.0] - 2020-02-14

Added

  • Capturing of available_in to Plan
  • Capturing of hardware_reservation, spot_price_max, termination_time, and provisioning_percentage to Device
  • Support for creating project ssh keys
  • Support for passing custom_data when creating a device

Fixed

  • Black not building for CI and thus failing

[1.41.0] - 2019-10-16

Added

  • Support for retrieval of hardware reservations
  • CPR support at device creation

[1.40.0] - 2019-10-14

Added

  • Integration tests are only run if PACKET_PYTHON_TEST_ACTUAL_API envvar is set
  • Rescue action and along with test
  • Missing SPDX and source encoding meta comments

Removed

  • Use of Travis CI

[1.39.1] - 2019-09-17

Added

  • Support for hardware_reservation_id

[1.39.0] - 2019-08-26

Added

  • Support for Organizations, Events, Emails, VLAN, Snapshot Policies, Batches, Ports, VPN and IPs.
  • Live tests

[1.38.2] - 2019-05-30

Added

  • Test fixtures to sdist

[1.38.1] - 2019-05-30

Fixed

  • Changelog

[1.38.0] - 2019-05-30

Added

  • Support for python3.7
  • legacy param to get_capacity function

Removed

  • Support for python3.3

Changed

  • setup.py no longer converts markdown to reST because pypi now supports markdown, woop.

[1.37.1] - 2018-01-08

Fixed

  • Version number in setup.py

[1.37.0] - 2018-01-08

Added

  • Spot Market Support
  • Ability to specify ssh keys on device creation

[1.36.0] - 2017-10-16

Added

  • Better tests using PacketMockManager
  • Test on 2.7 and 3.[3-6]
  • Changelog

Changed

  • Use tox for testing

[1.35] - 2017-08-04

Fixed

  • Some tests were broken

[1.35]

Added

  • public_ipv4_subnet_size

[1.34] - 2017-08-04

Added

  • Custom iPXE and always_pxe setting
  • Volume coloning
  • Device Tags

Fixed

  • Handling of error messages from api response

[1.33] - 2017-03-15

Fixed

  • Default payment method

Release files for packet-python 1.44.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for packet-python 1.44.3
File Size Uploaded
packet-python-1.44.3.tar.gz 41.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for packet-python 1.44.3
File Interpreter ABI Platform
packet_python-1.44.3-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 67.7 kB

Release files / packet-python-1.44.3.tar.gz

Download URL packet-python-1.44.3.tar.gz
Size 41.3 kB
Tags Source
SHA-256 checksum
How to use checksums
5957cc10b3a89a5ec7c7bf23cba4c0c251512ee490bbd76db1be8a86cebf7202
BLAKE2b-256 checksum
How to use checksums
36a5ce1dbc68f65d3be09afe3702687fad82b03d590906429a4b5533cb0a23cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.2.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.13

Release files / packet_python-1.44.3-py2.py3-none-any.whl

Download URL packet_python-1.44.3-py2.py3-none-any.whl
Size 26.4 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
ea1f1eed38e017dbb486572823272ccfac8aad95a4709c0e67f69f6eba72b527
BLAKE2b-256 checksum
How to use checksums
a52a59778fc963f6a987296a1641aa48aedd8afc2faf053a0947dc412592f721
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.2.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.13

Release history Release notifications | RSS feed

This release

1.44.3 This release

2 release files

1.44.2

2 release files

1.44.1

2 release files

1.44.0

2 release files

1.43.0

2 release files

1.42.0

2 release files

1.41.0

2 release files

1.40.0

2 release files

1.38.2

2 release files

1.38.1

2 release files

1.36.0

2 release files

1.35

1 release file

1.33

1 release file

1.32

1 release file

1.31

1 release file

1.30

1 release file

1.025

1 release file

1.024

1 release file

1.023

1 release file

1.022

1 release file

1.02

1.01

1 release file

1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page