"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1638],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var a=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,a,o=function(e,t){if(null==e)return{};var r,a,o={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=a.createContext({}),s=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=s(r),m=o,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||n;return r?a.createElement(f,l(l({ref:t},u),{},{components:r})):a.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,l=new Array(n);l[0]=m;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:o,l[1]=c;for(var s=2;s<n;s++)l[s]=r[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},59807:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>n,metadata:()=>c,toc:()=>s});var a=r(87462),o=(r(67294),r(3905));const n={layout:"post",title:"Apache CloudStack Terraform 0.5.0 Release",tags:["announcement"],authors:["rohit"],slug:"cloudstack-terraform-provider-0.5.0-release"},l=void 0,c={permalink:"/blog/cloudstack-terraform-provider-0.5.0-release",editUrl:"https://github.com/apache/cloudstack-www/tree/main/blog/2024-04-12-cloudstack-terraform-provider-0.5.0-release/index.md",source:"@site/blog/2024-04-12-cloudstack-terraform-provider-0.5.0-release/index.md",title:"Apache CloudStack Terraform 0.5.0 Release",description:"We are pleased to announce the release of Apache CloudStack Terraform",date:"2024-04-12T00:00:00.000Z",formattedDate:"April 12, 2024",tags:[{label:"announcement",permalink:"/blog/tags/announcement"}],hasTruncateMarker:!0,authors:[{name:"Rohit Yadav",title:"PMC Member",url:"https://github.com/rohityadavcloud",imageURL:"https://github.com/rohityadavcloud.png",key:"rohit"}],frontMatter:{layout:"post",title:"Apache CloudStack Terraform 0.5.0 Release",tags:["announcement"],authors:["rohit"],slug:"cloudstack-terraform-provider-0.5.0-release"},nextItem:{title:"CloudStack Collaboration Conference 2024 \u2013 Prepare to pack for Madrid, Spain in November",permalink:"/blog/ccc-2024"}},i={authorsImageUrls:[void 0]},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"/blog/cloudstack-terraform-provider-0.5.0-release"},(0,o.kt)("img",{src:r(94517).Z,title:"CloudStack Terraform Provider",width:"1200",height:"628"}))),(0,o.kt)("p",null,"We are pleased to announce the release of Apache CloudStack Terraform\nprovider v0.5.0. Terraform is an open-source infrastructure as code software\ntool that provides a consistent CLI workflow to manage resources in many\npublic/private clouds."),(0,o.kt)("p",null,"Terraform v0.5.0 comes packed with several new features, enhancements,\nand bug fixes to make it even more robust and reliable."),(0,o.kt)("p",null,"Some of the key highlights of this release include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Added support for Kubernetes Cluster creation"),(0,o.kt)("li",{parentName:"ul"},"Added support for Kubernetes iso registration"),(0,o.kt)("li",{parentName:"ul"},"Added support for new data sources in Cloudstack"),(0,o.kt)("li",{parentName:"ul"},"Added UEFI Support to the Cloudstack instance resource"),(0,o.kt)("li",{parentName:"ul"},"Added vApp properties support to the Cloudstack Instance resource"),(0,o.kt)("li",{parentName:"ul"},"Added parameters (host_id , cluster_id support to the Cloudstack instance resource"),(0,o.kt)("li",{parentName:"ul"},"Added source_nat_ip_address support to the Cloudstack network"),(0,o.kt)("li",{parentName:"ul"},"Added  new resource attach_volume"),(0,o.kt)("li",{parentName:"ul"},"Improved service offering creation by adding more parameters"),(0,o.kt)("li",{parentName:"ul"},"Added documentation for new resources"),(0,o.kt)("li",{parentName:"ul"},"Various Bug fixes"),(0,o.kt)("li",{parentName:"ul"},"Validated and fixed all existing resource creations to work as expected")),(0,o.kt)("p",null,"Apache CloudStack Terraform provider v0.5.0 is available for\ndownload now from the ",(0,o.kt)("a",{parentName:"p",href:"https://cloudstack.apache.org/downloads/#cloudstack-terraform-provider-release"},"Apache CloudStack\nwebsite"),"."),(0,o.kt)("h3",null,"Downloads and Documentation"),(0,o.kt)("p",null,"The official source code for Apache CloudStack Terraform provider can\nbe downloaded from:"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://cloudstack.apache.org/downloads"},"https://cloudstack.apache.org/downloads")),(0,o.kt)("p",null,"The installation and usage documentation for Apache CloudStack Terraform provider is available at:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/apache/cloudstack-terraform-provider/wiki"},"https://github.com/apache/cloudstack-terraform-provider/wiki")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/apache/cloudstack-terraform-provider/wiki#installing-from-github-release"},"https://github.com/apache/cloudstack-terraform-provider/wiki#installing-from-github-release"))),(0,o.kt)("p",null,"The documentation for the usage of resources to create and interact\nwith CloudStack is available at\n",(0,o.kt)("a",{parentName:"p",href:"https://registry.terraform.io/providers/cloudstack/cloudstack/0.5.0/docs"},"https://registry.terraform.io/providers/cloudstack/cloudstack/0.5.0/docs")),(0,o.kt)("p",null,"Users can also get the provider from the Terraform registry published at:\n",(0,o.kt)("a",{parentName:"p",href:"https://registry.terraform.io/providers/cloudstack/cloudstack/0.5.0"},"https://registry.terraform.io/providers/cloudstack/cloudstack/0.5.0")))}d.isMDXComponent=!0},94517:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/banner-876119598f926b6667d73cd18625f33d.jpg"}}]);