{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Jetstream cost calculator\n", "\n", "Focused on a Kubernetes cluster, cost data are available on [the XSEDE portal](https://portal.xsede.org/jetstream#vmsizes) and are equivalent to the virtual CPUs made available to each instance." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!openstack flavor list -f csv > openstack_flavor.csv" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%file openstack_flavor.csv\n", "\"ID\",\"Name\",\"RAM\",\"Disk\",\"Ephemeral\",\"VCPUs\",\"Is Public\"\n", "\"1\",\"m1.tiny\",2048,8,0,1,True\n", "\"10\",\"m1.quad\",10240,20,0,4,True\n", "\"14\",\"s1.large\",30720,120,120,10,True\n", "\"15\",\"s1.xlarge\",61440,240,240,24,True\n", "\"16\",\"s1.xxlarge\",122880,480,480,44,True\n", "\"2\",\"m1.small\",4096,20,0,2,True\n", "\"3\",\"m1.medium\",16384,60,0,6,True\n", "\"4\",\"m1.large\",30720,60,0,10,True\n", "\"5\",\"m1.xlarge\",61440,60,0,24,True\n", "\"6\",\"m1.xxlarge\",122880,60,0,44,True" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "flavor = pd.read_csv(\"openstack_flavor.csv\").set_index(\"Name\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "flavor" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "num_masters = 1\n", "num_workers = {\"minimum\":0, \"average\":2, \"maximum\":5}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "flavor_master = \"m1.xlarge\"\n", "flavor_workers = \"m1.xlarge\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for scenario in num_workers:\n", " print(15*\"-\" + f\" SU usage for the {scenario} scenario\")\n", " print(f\"{num_masters} {flavor_master} master - {num_workers[scenario]} {flavor_workers} workers\")\n", " su_cost = num_masters * flavor.loc[flavor_master].VCPUs + num_workers[scenario] * flavor.loc[flavor_workers].VCPUs\n", " print(f\"{su_cost} SU/hour\")\n", " print(f\"{su_cost*24:,} SU/day\")\n", " print(f\"{su_cost*24*30:,} SU/month\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 2 }