当前位置: 首页 > 编程语言 > C#

Openstack.NetSDK无法访问区域服务分享

时间:2023-04-10 20:37:36 C#

Openstack.NetSDK无法访问区域服务使用我们自己的硬件,我们已经安装了vanillaopenstack所有组件,但由于区域问题,我是accessingIdentity使用以外的服务时遇到问题。使用的管理员帐号和我们创建的管理员最终调使用的代码如下所示……publicstaticvoidTestAccess(stringuserName,stringpassword,stringprojectName,stringprojectId){CloudIdentityWithProjectprojectCloudId=newCloudIdentityWithProject();projectCloudId.Username=userName;projectCloudId.Password=密码;projectCloudId.ProjectName=projectName;projectCloudId.ProjectId=newProjectId(projectId);OpenStackIdentityProvideridProvider=newOpenStackIdentityProvider(baseUrl,projectCloudId);UserAccessuserAccess=idProvider.Authenticate(projectCloudId);IEnumerableeps=idProvider.ListEndpoints(userAccess.Token.Id);字符串reg=idProvider.DefaultRegion;//这是空的ServiceCatalog[]scs=userAccess.ServiceCatalog;//获取区域列表regionList=newList();foreach(ServiceCatalogscinscs){foreach(Endpointepinsc.Endpoints){regionList.Add(ep.Region);//在每种情况下都是'regionOne'}}//尝试stuff...foreach(stringregioninregionList.Distinct()){//获取容器列表CloudFilesProvidercfp=newCloudFilesProvider(projectCloudId,idProvider);//此行失败IEnumerablelistOfContainers=cfp.ListContainers(region:region);foreach(listOfContainers中的容器ctnr){Console.WriteLine(“容器:{0}”,ctnr.Name);}CloudNetworksProvidercnp=newCloudNetworksProvider(identity:null,identityProvider:idProvider);IEnumerablenetworks=cnp.ListNetworks(identity:null,region:region);foreach(网络中的CloudNetwork网络){Console.WriteLine("Network[{0}]name:{1}",networkCount,network.Label);Console.WriteLine("网络[{0}]Id:{1}",networkCount,network.Id);++网络计数;}Console.WriteLine("列出{0}个网络。",networkCount);}}catch(Exceptionex){抛出;}}代码调用ListContainers(region:region)时失败并显示错误...“用户无权访问所请求的服务或区域”,就好像我没有指定区域一样,错误只是“无区域”如有提供,则不提供该服务,与地区无关,不为用户账号设置默认区域'我们目前只访问我们的内部网络,所以区域对我们来说并不重要......另外值得注意的是调用CloudNetworkdetail=cnp.ShowNetwork(networkGuid,"regionOne");我可以看到的网络返回错误“项目未找到或不存在帮助和建议非常感谢。我设法简单地扩展了Openstack.NetSDK的功能。下面的代码将其扩展为包括租户/项目操作的各种功能......首先,创建一个NewTenant容器,用于将数据传入和传出Web服务,我将它放在与其他服务器相同的命名空间中......使用Newtonsoft.json;namespacenet.openstack.Core.Domain{[JsonObject(MemberSerialization.OptIn)]publicclassNewTenant{//////获取新用户的ID。///此属性的值未定义。不使用。///[JsonProperty("id",DefaultValueHandling=DefaultValueHandling.Include)]publicstringId{get;私有集;}[JsonProperty("name")]publicstringName{get;私有集;}[JsonProperty("description")]publicstringDescription{get;私有集;}[JsonProperty("enabled")]publicboolEnabled{get;私有集;}publicNewTenant(stringname,stringdescription,boolenabled=true){Name=name;描述=描述;启用=启用;现在我们可以创建任何新的Request类来发布数据......使用System;使用Newtonsoft.Json;使用net.openstack.Core.Domain;命名空间net.openstack.Core.Request{[J}publicAddTenantRequest(NewTenanttenant){if(tenant==null)thrownewArgumentNullException("tenant");租客=租客;现在为请求创建一个Response对象以帮助使用net.openstack.Core.Domain检索数据;使用Newtonsoft.Json;命名空间net.openstack.Core.Response{[JsonObject(MemberSerialization.OptIn)]内部类NewTenantResponse{[JsonProperty("tenant")]publicNewTenantNewTenant{get;私有集;}}[JsonObject(MemberSerialization.OptIn)]internalclassTenantResponse{[JsonProperty("tenant")]publicTenantTenant{get;私有集;现在我们可以创建一个继承自OpenStackIdentityProvider的类,以及我们想要的租户/项目操作的附加功能......使用System;使用System.Net;使用JSIStudios.SimpleRESTServices.Client;使用net.openstack。核心域;使用net.openstack.Core.Request;使用net.openstack.Core.响应;namespacenet.openstack.Core.Providers{publicclassExtendedOpenStackIdentityProvider:OpenStackIdentityProvider{publicExtendedOpenStackIdentityProvider(UriurlBase):base(urlBase){}publicExtendedOpenStackIdentityProvider(UriurlBase,CloudIdentityidentity):base(urlBase,identity){}publicExtendedOpenStackIdentityProvider(UriurlBase,JSIStudios.SimpleRESTServices.Client.IRestServicerestService,net.openstack.Core.Caching.ICachetokenCache):base(urlBase,restService,tokenCache){}publicExtendedOpenStackIdentityProvider(UriurlBase,CloudIdentityidentity,JSIStudios.SimpleRESTServices.Client.IRestService休息服务,net.openstack.Core.Caching.ICachetokenCache):base(urlBase,identity,restService,tokenCache){}publicNewTenantAddTenant(NewTenanttenant,CloudIdentityidentity){if(tenant==null)抛出新的ArgumentNullException("租户");如果(string.IsNullOrEmpty(tenant.Name))抛出新的ArgumentException("tenant.Name不能为null或为空");if(tenant.Id!=null)thrownewInvalidOperationException("tenant.Idmustbenull");检查身份(身份);varresponse=ExecuteRESTRequest(identity,newUri(UrlBase,"/v2.0/tenants"),HttpMethod.POST,newAddTenantRequest(tenant));如果(响应==null||response.Data==null)返回null;返回响应.Data.NewTenant;}publicTenantGetTenant(stringtenantId,CloudIdentityidentity){if(tenantId==null)thrownewArgumentNullException("tenantId");检查身份(身份);varurlPath=string.Format("v2.0/tenants/{0}",tenantId);varresponse=ExecuteRESTRequest(identity,newUri(UrlBase,urlPath),HttpMethod.GET);如果(响应==null||response.Data==null)返回null;返回响应.Data.Tenant;}publicboolDeleteTenant(stringtenantId,CloudIdentityidentity){if(tenantId==null)thrownewArgumentNullException("tenantId");if(string.IsNullOrEmpty(tenantId))抛出新的参数tException("tenantId不能为空");检查身份(身份);varurlPath=string.Format("v2.0/tenants/{0}",tenantId);varresponse=ExecuteRESTRequest(identity,newUri(UrlBase,urlPath),HttpMethod.DELETE);如果(响应!=null&&response.StatusCode==HttpStatusCode.NoContent)返回真;返回假;}publicboolAddTenantUserRole(stringtenantId,stringuserId,stringroleId,CloudIdentityidentity){if(tenantId==null)thrownewArgumentNullException("tenantId");if(string.IsNullOrEmpty(tenantId))thrownewArgumentException("tenantId不能为空");如果(userId==null)抛出新的ArgumentNullException("userId");if(string.IsNullOrEmpty(userId))thrownewArgumentException("userIdcannotbeempty");如果(roleId==null)thrownewArgumentNullException("roleId");if(string.IsNullOrEmpty(roleId))thrownewArgumentException("roleId不能为空");检查身份(身份);varurlPath=string.Format("v2.0/tenants/{0}/users/{1}/roles/OS-KSADM/{2}",tenantId,userId,roleId);varresponse=ExecuteRESTRequest(identity,newUri(UrlBase,urlPath),HttpMethod.PUT);if(response!=null&&response.StatusCode==HttpStatusCode.NoContent)returntrue;returnfalse;}}}我认为这个特性很快就会在GitHub上发布,如果没有,我希望它有用以上是C#学习教程:Openstack.NetSDK无法访问区域服务分享的所有内容,如果对您有用,需要了解更多C#学习教程,希望您多加关注,本文收集自网络,不代表立场.如涉及侵权,请点击维权联系管理员删除.如需转载请注明出处:

最新推荐
猜你喜欢