"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3177],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});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 s(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 i(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 l=a.createContext({}),c=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={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,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),m=o,d=p["".concat(l,".").concat(m)]||p[m]||h[m]||n;return r?a.createElement(d,s(s({ref:t},u),{},{components:r})):a.createElement(d,s({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,s=new Array(n);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:o,s[1]=i;for(var c=2;c<n;c++)s[c]=r[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7654:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var a=r(87462),o=(r(67294),r(3905));const n={layout:"post",title:"4.1.0 VOTE in Progress: Testers Welcome!",slug:"4_1_0_vote_in"},s=void 0,i={permalink:"/blog/4_1_0_vote_in",editUrl:"https://github.com/apache/cloudstack-www/tree/main/blog/2013-05-28-4_1_0_vote_in.md",source:"@site/blog/2013-05-28-4_1_0_vote_in.md",title:"4.1.0 VOTE in Progress: Testers Welcome!",description:"The Apache CloudStack is very near to the 4.1.0 release, and as a result we&#8217;re conducting a vote on artifacts for the 4.1.0 release right now. Because we want to make sure we have the best possible release, we&#8217;d like to invite anyone who&#8217;s interested in CloudStack to take the current release candidate for a test drive.",date:"2013-05-28T00:00:00.000Z",formattedDate:"May 28, 2013",tags:[],hasTruncateMarker:!1,authors:[],frontMatter:{layout:"post",title:"4.1.0 VOTE in Progress: Testers Welcome!",slug:"4_1_0_vote_in"},prevItem:{title:"Apache CloudStack 4.1.0 Released",permalink:"/blog/apache_cloudstack_4_1_0"},nextItem:{title:"Apache CloudStack Weekly News - 13 May 2013",permalink:"/blog/apache_cloudstack_weekly_news_13"}},l={authorsImageUrls:[]},c=[],u={toc:c},p="wrapper";function h(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,(0,o.kt)("a",{href:"/img/imported/ab378739-3c34-48ea-9495-2c49e23e58d6"},(0,o.kt)("img",{src:"/img/imported/ab378739-3c34-48ea-9495-2c49e23e58d6?t=true",alt:"square-cloudmonkey.png",align:"left",vspace:"4",hspace:"5"})),"The Apache CloudStack is very near to the 4.1.0 release, and as a result we\u2019re conducting a vote on artifacts for the 4.1.0 release right now. Because we want to make sure we have the best possible release, we\u2019d like to invite anyone who\u2019s interested in CloudStack to take the current release candidate for a test drive. "),(0,o.kt)("p",null,"Chip Childers ",(0,o.kt)("a",{href:"http://markmail.org/message/me3q3zjskhcwmfn5"},"started the vote on May 28th")," and it will run for a minimum of 72 hours, barring any blockers. Note that a VOTE requires at least three +1 votes from PMC members to pass, but ",(0,o.kt)("em",null,"anyone")," can vote, and we welcome input from ",(0,o.kt)("em",null,"all")," members of the community - positive votes mean that a wider community has taken a look at the release and helped vet it before we make it official. And if there are technical issues that might be a \u20131 on the release, we\u2019ll take a look at those regardless of whether a person is a PMC member or a member of the community speaking up for the first time."),(0,o.kt)("p",null,"The source release is available on dist.apache.org: ",(0,o.kt)("a",{href:"https://dist.apache.org/repos/dist/dev/cloudstack/4.1.0/"},"https://dist.apache.org/repos/dist/dev/cloudstack/4.1.0/"),", and the list of CHANGES is ",(0,o.kt)("a",{href:"https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blob_plain;f=CHANGES;hb=4.1"},"available via our git repository"),". "),(0,o.kt)("p",null,"Full ",(0,o.kt)("a",{href:"https://cwiki.apache.org/CLOUDSTACK/release-test-procedure.html"},"testing instructions are available on the CloudStack wiki"),". "),(0,o.kt)("p",null,"Please be sure to send any feedback via the ",(0,o.kt)("a",{href:"http://markmail.org/message/me3q3zjskhcwmfn5"},"VOTE thread")," on dev@cloudstack.apache.org. We\u2019re looking forward to getting the 4.1.0 release out the door, come and give us a hand!"))}h.isMDXComponent=!0}}]);