Home > Storage > PowerScale (Isilon) > Product Documentation > Cloud > APEX File Storage for Microsoft Azure: Deployment Guide > Appendix B: Cluster raw capacity and usable capacity
The following tables show the cluster usable capacity when using different OneFS protection levels.
Azure managed disk type | Disk size (TiB) | Min cluster capacity (TiB) | Max cluster capacity (TiB) | ||
raw capacity | usable capacity (+2n) | raw capacity | usable capacity (+2n) | ||
P20 | 0.5 | 10 | 5 | 270 | 240 |
P30 | 1 | 20 | 10 | 540 | 480 |
P40 | 2 | 40 | 20 | 1080 | 960 |
P50 | 4 | 80 | 40 | 2160 | 1920 |
P60 | 8 | 160 | 80 | 4320 | 3840 |
P70 | 16 | 320 | 160 | 5760 | 4992 |
E20 | 0.5 | 10 | 5 | 270 | 240 |
E30 | 1 | 20 | 10 | 540 | 480 |
E40 | 2 | 40 | 20 | 1080 | 960 |
E50 | 4 | 80 | 40 | 2160 | 1920 |
E60 | 8 | 160 | 80 | 4320 | 3840 |
E70 | 16 | 320 | 160 | 5760 | 4992 |
S40 | 2 | 40 | 20 | 1080 | 960 |
S50 | 4 | 80 | 40 | 2160 | 1920 |
S60 | 8 | 160 | 80 | 4320 | 3840 |
S70 | 16 | 320 | 160 | 5760 | 4992 |
Azure managed disk type | Disk size (TiB) | Min cluster capacity (TiB) | Max cluster capacity (TiB) | ||
raw capacity | usable capacity (+2d:1n) | raw capacity | usable capacity (+2d:1n) | ||
P20 | 0.5 | 10 | 8 | 270 | 240 |
P30 | 1 | 20 | 15 | 540 | 480 |
P40 | 2 | 40 | 30 | 840 | 747 |
P50 | 4 | 80 | 60 | 840 | 747 |
P60 | 8 | 160 | 120 | 1440 | 1280 |
P70 | 16 | 320 | 240 | 1440 | 1280 |
E20 | 0.5 | 10 | 8 | 240 | 213 |
E30 | 1 | 20 | 15 | 240 | 213 |
E40 | 2 | 40 | 30 | 240 | 213 |
E50 | 4 | 80 | 60 | 240 | 213 |
E60 | 8 | 160 | 120 | 800 | 711 |
E70 | 16 | 320 | 240 | 1600 | 1422 |
S40 | 2 | 40 | 30 | 280 | 249 |
S50 | 4 | 80 | 60 | 280 | 249 |
S60 | 8 | 160 | 120 | 800 | 711 |
S70 | 16 | 320 | 240 | 1120 | 996 |
"""
Tiny script to create an image from a VM. Not based on the Python Azure SDK or the click CLI lib, in order to use only base Python, and thereby prevent additional installs and assumption of internet access. Assumes your Azure CLI is present, on the shell path, and logged in.
"""
import argparse
import json
import os
import subprocess
import sys
DEFAULT_IMAGE_NAME = "onefs"
DEFAULT_HYPERV_VERSION = "V2"
# Prints the CLI commands as they are being run
DEBUG = True
DAY_SECONDS = 60 * 60 * 24
def run(cmd, *args, **kwargs):
"""
Run a shell command.
If DEBUG, echo the command back, and print it's output if possible.
Raise an Exception if the command's retureturncode is not 0.
"""
if DEBUG:
print("\n" + cmd)
if "capture_output" not in kwargs:
kwargs["capture_output"] = False
elif "capture_output" not in kwargs:
kwargs["capture_output"] = True
p = subprocess.run(cmd, *args, **kwargs, shell=True)
if p.returncode != 0:
raise RuntimeError(
"Failed running (errno=%d):\n%s\nOutput:\n%s\n%s"
% (p.returncode, cmd, p.stdout, p.stderr)
)
return p
def make(
vhd_path,
resource_group_name,
image_name=DEFAULT_IMAGE_NAME,
location=None,
hyperv_version=DEFAULT_HYPERV_VERSION,
):
"""
Push the given vhd to Azure and make an image. Returns the URI of the resulting image.
Args:
vhd_path(str): fqp to the .vhd
resource_group_name (str): name of the resource group we will push to
image_name (str): name the image will take in Azure
location (str): the Azure location we will push to (e.g. westus2)
"""
managed_disk_name = "upload-" + image_name
vhd_img_sz = os.stat(vhd_path).st_size
cmd = (
'az disk create --name "%s" --for-upload --upload-size-bytes %s --sku standard_lrs --resource-group "%s" '
'--hyper-v-generation="%s"'
% (managed_disk_name, vhd_img_sz, resource_group_name, hyperv_version)
)
if location:
cmd += ' --location="%s"' % location
run(cmd)
p = run(
'az disk grant-access --name "%s" --resource-group "%s" --access-level Write --duration-in-seconds %d'
% (managed_disk_name, resource_group_name, DAY_SECONDS),
capture_output=True,
)
sas_token = json.loads(p.stdout.decode(sys.stdout.encoding).strip())
sas_token = sas_token["accessSas"]
run(
'az storage copy --source-local-path %s --destination "%s" --blob-type PageBlob'
% (vhd_path, sas_token)
)
run(
'az disk revoke-access --name "%s" --resource-group "%s"'
% (managed_disk_name, resource_group_name),
)
cmd = (
'az image create --name "%s" --resource-group "%s" --source "%s" --os-type Linux --storage-sku Standard_LRS --os-disk-caching ReadOnly --hyper-v-generation "%s"'
% (image_name, resource_group_name, managed_disk_name, hyperv_version)
)
if location:
cmd += ' --location="%s"' % location
p = run(cmd, capture_output=True)
image_json = json.loads(p.stdout.decode(sys.stdout.encoding).strip())
print(image_json)
return image_json
if __name__ == "__main__":
argparser = argparse.ArgumentParser()
argparser.add_argument(
"--image_name",
help="Name of the image in Azure",
type=str,
default=DEFAULT_IMAGE_NAME,
)
argparser.add_argument(
"--location", help="Azure location, e.g. centralus", type=str, default=None
)
argparser.add_argument(
"--hyperv_version",
help="Azure hyperV version, i.e. V1 vs V2 vs other",
type=str,
default=DEFAULT_HYPERV_VERSION,
)
argparser.add_argument(
"vhd_path",
help="Path to image VHD",
type=str,
)
argparser.add_argument(
"resource_group_name",
help="Name of resource group where we will deposit the image",
type=str,
)
args = argparser.parse_args()
make(
args.vhd_path,
args.resource_group_name,
image_name=args.image_name,
location=args.location,
hyperv_version=args.hyperv_version,