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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

packet-python-1.44.3.tar.gz (41.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

packet_python-1.44.3-py2.py3-none-any.whl (26.4 kB view details)

Uploaded Python 2Python 3

File details

Details for the file packet-python-1.44.3.tar.gz.

File metadata

  • Download URL: packet-python-1.44.3.tar.gz
  • Upload date:
  • Size: 41.3 kB
  • Tags: Source
  • Uploaded using 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

File hashes

Hashes for packet-python-1.44.3.tar.gz
Algorithm Hash digest
SHA256 5957cc10b3a89a5ec7c7bf23cba4c0c251512ee490bbd76db1be8a86cebf7202
MD5 2a82b54eec69110c40f9dcb0f212e199
BLAKE2b-256 36a5ce1dbc68f65d3be09afe3702687fad82b03d590906429a4b5533cb0a23cb

See more details on using hashes here.

File details

Details for the file packet_python-1.44.3-py2.py3-none-any.whl.

File metadata

  • Download URL: packet_python-1.44.3-py2.py3-none-any.whl
  • Upload date:
  • Size: 26.4 kB
  • Tags: Python 2, Python 3
  • Uploaded using 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

File hashes

Hashes for packet_python-1.44.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 ea1f1eed38e017dbb486572823272ccfac8aad95a4709c0e67f69f6eba72b527
MD5 08f16e27f149a3c67aadbe4993e22bd1
BLAKE2b-256 a52a59778fc963f6a987296a1641aa48aedd8afc2faf053a0947dc412592f721

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.44.3 This release

2 files

1.44.2

2 files

1.44.1

2 files

1.44.0

2 files

1.43.1

3 files

1.43.0

2 files

1.42.0

2 files

1.41.0

2 files

1.40.0

2 files

1.38.2

2 files

1.38.1

2 files

1.37.1

2 files

1.36.0

2 files

1.35

1 file

1.33

1 file

1.32

1 file

1.31

1 file

1.30

1 file

1.025

1 file

1.024

1 file

1.023

1 file

1.022

1 file

1.02

1.01

1 file

1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page