Coder Social home page Coder Social logo

fog-aliyun's Introduction

fog

fog is the Ruby cloud services library, top to bottom:

  • Collections provide a simplified interface, making clouds easier to work with and switch between.
  • Requests allow power users to get the most out of the features of each individual cloud.
  • Mocks make testing and integrating a breeze.

Build Status Code Climate Gem Version SemVer

Dependency Notice

Currently all fog providers are getting separated into metagems to lower the load time and dependency count.

If there's a metagem available for your cloud provider, e.g. fog-aws, you should be using it instead of requiring the full fog collection to avoid unnecessary dependencies.

'fog' should be required explicitly only if the provider you use doesn't yet have a metagem available.

Getting Started

The easiest way to learn fog is to install the gem and use the interactive console. Here is an example of wading through server creation for Amazon Elastic Compute Cloud:

$ sudo gem install fog
[...]

$ fog

  Welcome to fog interactive!
  :default provides [...]

>> server = Compute[:aws].servers.create
ArgumentError: image_id is required for this operation

>> server = Compute[:aws].servers.create(:image_id => 'ami-5ee70037')
<Fog::AWS::EC2::Server [...]>

>> server.destroy # cleanup after yourself or regret it, trust me
true

Ruby version

Fog requires Ruby 2.0.0 or later.

Ruby 1.8 and 1.9 support was dropped in fog-v2.0.0 as a backwards incompatible change. Please use the later fog 1.x versions if you require 1.8.7 or 1.9.x support.

Collections

A high level interface to each cloud is provided through collections, such as images and servers. You can see a list of available collections by calling collections on the connection object. You can try it out using the fog command:

>> Compute[:aws].collections
[:addresses, :directories, ..., :volumes, :zones]

Some collections are available across multiple providers:

  • compute providers have flavors, images and servers
  • dns providers have zones and records
  • storage providers have directories and files

Collections share basic CRUD type operations, such as:

  • all - fetch every object of that type from the provider.
  • create - initialize a new record locally and a remote resource with the provider.
  • get - fetch a single object by its identity from the provider.
  • new - initialize a new record locally, but do not create a remote resource with the provider.

As an example, we'll try initializing and persisting a Rackspace Cloud server:

require 'fog'

compute = Fog::Compute.new(
  :provider           => 'Rackspace',
  :rackspace_api_key  => key,
  :rackspace_username => username
)

# boot a gentoo server (flavor 1 = 256, image 3 = gentoo 2008.0)
server = compute.servers.create(:flavor_id => 1, :image_id => 3, :name => 'my_server')
server.wait_for { ready? } # give server time to boot

# DO STUFF

server.destroy # cleanup after yourself or regret it, trust me

Models

Many of the collection methods return individual objects, which also provide common methods:

  • destroy - will destroy the persisted object from the provider
  • save - persist the object to the provider
  • wait_for - takes a block and waits for either the block to return true for the object or for a timeout (defaults to 10 minutes)

Mocks

As you might imagine, testing code using Fog can be slow and expensive, constantly turning on and shutting down instances. Mocking allows skipping this overhead by providing an in memory representation of resources as you make requests. Enabling mocking is easy to use: before you run other commands, simply run:

Fog.mock!

Then proceed as usual, if you run into unimplemented mocks, fog will raise an error and as always contributions are welcome!

Requests

Requests allow you to dive deeper when the models just can't cut it. You can see a list of available requests by calling #requests on the connection object.

For instance, ec2 provides methods related to reserved instances that don't have any models (yet). Here is how you can lookup your reserved instances:

$ fog
>> Compute[:aws].describe_reserved_instances
#<Excon::Response [...]>

It will return an excon response, which has body, headers and status. Both return nice hashes.

Go forth and conquer

Play around and use the console to explore or check out fog.io and the provider documentation for more details and examples. Once you are ready to start scripting fog, here is a quick hint on how to make connections without the command line thing to help you.

# create a compute connection
compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => ACCESS_KEY_ID, :aws_secret_access_key => SECRET_ACCESS_KEY)
# compute operations go here

# create a storage connection
storage = Fog::Storage.new(:provider => 'AWS', :aws_access_key_id => ACCESS_KEY_ID, :aws_secret_access_key => SECRET_ACCESS_KEY)
# storage operations go here

geemus says: "That should give you everything you need to get started, but let me know if there is anything I can do to help!"

Versioning

Fog library aims to adhere to Semantic Versioning 2.0.0, although it does not address challenges of multi-provider libraries. Semantic versioning is only guaranteed for the common API, not any provider-specific extensions. You may also need to update your configuration from time to time (even between Fog releases) as providers update or deprecate services.

However, we still aim for forwards compatibility within Fog major versions. As a result of this policy, you can (and should) specify a dependency on this gem using the Pessimistic Version Constraint with two digits of precision. For example:

spec.add_dependency 'fog', '~> 1.0'

This means your project is compatible with Fog 1.0 up until 2.0. You can also set a higher minimum version:

spec.add_dependency 'fog', '~> 1.16'

Getting Help

Contributing

Please refer to CONTRIBUTING.md.

License

Please refer to LICENSE.md.

fog-aliyun's People

Contributors

chushenmeshile avatar dengqinsi avatar digitallyborn avatar geemus avatar janehyt avatar joy-n-craft avatar kgaikwad avatar lijianxun avatar philippthun avatar plribeiro3000 avatar tokengeek avatar upadhyeammit avatar xiaozhu36 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fog-aliyun's Issues

fog-aliyun is not compatible with Ruby 3.X

With Ruby 3.x this gem cannot be used anymore due to the following error:

undefined method `encode' for URI:Module

The encode method was removed with Ruby 3: https://docs.knapsackpro.com/2020/uri-escape-is-obsolete-percent-encoding-your-query-string

To reproduce the issue run the unit/integration test with ruby 3.x. This can be done for example by changing the version in .ruby-version to e.g. 3.0.4.

Open questions:

  • Does aliyun-sdk needs to be updated and test as well? Looks like last commit is ~2 years old.

[aliyun_oss_endpoint] when the parameter points to the VPC internal network address, Ali Cloud ECS traffic will still go to the public network

Hi.
我在阿里云的ecs服务器上部署了gitlab,并设置了如下参数:

gitlab_rails['backup_upload_connection'] = {
'provider' => 'aliyun',
'aliyun_accesskey_id' => '******',
'aliyun_accesskey_secret' => ''******',',
'aliyun_oss_bucket' => ''******',',
'aliyun_region_id' => 'cn-zhangjiakou',
'aliyun_oss_endpoint' => 'http://oss-cn-zhangjiakou-internal.aliyuncs.com'
}

于此同时,我在 linux 的 crontab 设置了计划任务,它每天00:00执行备份计划
docker exec -t gitlab gitlab-backup create
此时,此时我发现每天执行备份计划的时候,备份文件上传到 oss 的时候走的是公网流量,而不是 endpoint 指定的内网。
我的ECS服务器和OSS均位于cn-zhangjiakou


Hi.
I deployed GitLab on the ECS server of Ali Cloud and set the following parameters:

gitlab_rails['backup_upload_connection'] = {
'provider' => 'aliyun',
'aliyun_accesskey_id' => '******',
'aliyun_accesskey_secret' => ''******',',
'aliyun_oss_bucket' => ''******',',
'aliyun_region_id' => 'cn-zhangjiakou',
'aliyun_oss_endpoint' => 'http://oss-cn-zhangjiakou-internal.aliyuncs.com'
}

At the same time, I set up the scheduling task in the Linux crontab, which executes the backup plan at 00:00 every day
docker exec -t gitlab gitlab-backup create
At this point, I noticed that when I was doing a daily backup plan, I was uploading the backup files to OSS using public network traffic instead of the endpoint specified Intranet.
My ECS server and OSS are both located at cn-zhangjiakou

Droplets in the blobstore are deleted on stop/restart of CF application, with fog-aliyun v0.3.8

We have evaluated fog-aliyun v0.3.8 on our AlibabaCloud CF landscape and encountered some problems with the blobstore.

Setup:
cf-deployment v12.39.0
capi-release 1.91.0-sap.2

The capi-release patched to use fog-aliyun in v0.3.8.

Deployment of Cloud Foundry is successful. A first push of an application also works. But after stopping and restarting and application, the droplets in the blobstore are deleted. Apps cannot be started any more.

We suspect that directory names are not correctly determined in this part of the coding:

def check_directory_key(directory_key)
.
It could be that the path to the "buildpack_cache" folder is incorrectly truncated and so parent folders are deleted as well.
The "buildpack_cache" content is cleaned up by the cc-worker jobs.

Document need more detail

Since the document in Aliyun didn't define the * aliyun_oss_endpoint* , * aliyun_oss_location* and * aliyun_oss_bucket* like this gem does.

It took me sometime to figure it out. Give an example might help more people like me.

aliyun:
    provider:                aliyun
    aliyun_accesskey_id:     <YOUR KEY>
    aliyun_accesskey_secret: <YOUR SECRET>
    aliyun_oss_endpoint:     http://oss-cn-beijing.aliyuncs.com
    aliyun_oss_location:     oss-cn-beijing
    aliyun_oss_bucket:       mybucket 

Especially:

  1. aliyun_oss_endpoint MUST contain "http://" and MUST NOT contain bucket name. Aliyun defines my endpoint as mybucket.oss-cn-beijing.aliyuncs.com instead of http://oss-cn-beijing.aliyuncs.com
  2. aliyun_oss_location can be found in the part from your endpoint.

Enhance tests

Motivation

This document proposes enhancements to be done for integration/unit tests to increase fog-aliyun library code coverage and improve stability as far as more integration tests will run on automatic/nightly basis.

Area to be covered

Currently, the primary targets of this document is to provide tests scenarios for storage and OSS buckets api area, as it's critical for CloudFoundry operations.

Test environments

General recommendation is to run this test on automatic (when a new PR or commit enter into the repository) and on nightly basis to catch issues if some changes be at AliCloud OSS api level.

As regions available in China and Worldwide may differ from each other, it recommended to run integration test in China region (Shanghai) and in Europe (Frankfurt) to verify that the library behave equally regardless of region.

Extra options for test environments:

  • Run tests with internal endpoint
Region Public Endpoint Private Endpoint
Shanghai
Frankfurt

Priority: HIGH

Test scenarios

Auth & Connectivity scenarios

  1. Test that API can be accessed using valid credentials:
    • The goal of this test is to verify that connection to api is possible using valid credentials.
    • Expected result: OSS API should be accessible
    • Priority: High
  2. (NEGATIVE TEST) Test that API cannot be accessed using incorrect credentials:
    • The goal of this test is to get error if connection to api is not possible due to invalid credentials.
    • Expected result: An error should be thrown with details.
    • Priority: Low
  3. Test that API can be accessed if time zone is correct (valid signature computation)
    • The goal of this test is to validate that signature generated for requests is valid and acceptable by API.
    • Expected result: OSS API should be accessible
    • Priority: Low
  4. (NEGATIVE TEST) Test that API can be accessed if time zone is NOT correct (invalid signature computation)
    • The goal of this test is to provide error details if signature wrongly generated (for example if timezone incorrect)
    • Expected result: An error should be throw with details.
    • Priority: Low
  5. Test region is selected according to provider configuration
    • The goal of this test is to ensure that region provided in configuration is really used for connection.
    • Expected results: The requests should point to the provided region
    • Extra scenario: check default region is used if no region provided explicitly.
    • Priority: High

Entity operations

  1. Add tests for each type of entity that validates the following operations:
Method Description Priority
create Accepts hash of attributes and creates object.Note: creation is a non-blocking call and you will be required to wait for a valid state before using resulting object. High
save Saves object.Note: not all objects support updating object. High
destroy Destroys object.Note: this is a non-blocking call and object deletion might not be instantaneous. High
reload Updates object with latest state from service. Medium
attributes Returns a hash containing the list of model attributes and values. Medium
identity Returns the identity of the object.Note: This might not always be equal to object.id. Low

Buckets scenarios

  1. Test that it is possible to get single bucket
    • Get listing of single bucket
    • Expected result: Bucket should be found
    • Priority: Low
  2. Test that it is possible to list all buckets
    • Get listing of all buckets
    • Expected result: Buckets should be found
    • Extra scenarios: List buckets using prefix, marker and maxKeys options.
    • Priority: Low
  3. Test that it is possible to create a new bucket.
    • Create new bucket using api
    • Expected result: Bucket should be created
    • Priority: Low
  4. Test that it is possible to destroy a bucket.
    • Destroy bucket using api
    • Expected result: Bucket should be deleted
    • Priority: Low
  5. (NEGATIVE TEST) Test that error is thrown when trying to create already existing bucket
    • Create a new bucket using the same name as the already existing one.
    • Expected result: On save it should throw exception.
    • Priority: Low
  6. (NEGATIVE TEST) Test that error is thrown when trying to access non-existing bucket
    • Ask for non-existing bucket should fail with error.
    • Expected result: Not found error
    • Priority: Low
  7. (NEGATIVE TEST) Test that error is thrown when trying to destroy non-existing bucket
    • Destroy for non-existing bucket should fail with error.
    • Expected result: Not found error
    • Priority: Low
  8. (NEGATIVE TEST) Test that error is thrown when trying to access protected bucket from other account.
    • Ask for protected bucket should fail with error.
    • Expected result: Not found error / Access error?
    • Priority: Low

Files & Directory scenarios

  1. Test get nested directories and files in nested directory
    • The goal of this test is to validate that files and directories can be queried if structure is nested.
    • Expected result: Nested list should be possible.
    • Priority: Medium
  2. Test that it is possible to upload (write) a file
    • The goal of this test is to validate that file is persisted correctly
    • Expected result: The file is created and the content equal to the uploaded file
    • Priority: High
  3. Test that it is possible to upload (write) large file (multi part upload)
    • The goal of this test is to validate that file is persisted correctly
    • Expected result: The file is created and the content equal to the uploaded file
    • Priority: High
  4. Test that it is possible to get file details like public_url
    • The goal of this test is to test attributes of files
    • Expected result: The attribute should match to the expected value
    • Priority: Low
  5. Test that it is possible to destroy a file/directory
    • The goal of this test is to check destroy functionality
    • Expected result: Should destroy the file/directory
    • Extra scenario: Destroy of non-empty directory should fail
    • Priority: High
  6. Test file/directory listing using parameters such as prefix, marker, delimeter and etc...
    • The goal of this test is to check that response returned according to the provided parameters.
    • Expected result: Response should meet expectations
    • Priority: High
  7. Test file copy operations
    • The goal of this test is to verify file copy operations.
    • Expected result: The copy of file should match to the original file
    • Priority: Low
  8. Test getting bucket when directory exists named with the same name as a bucket.
    • The goal of this test is to check that fog receives a reference to directory and not to the bucket if
      directory name matches to the bucket name.
    • Expected result: The api should provide reference to the bucket (like in AWS).
    • Priotity: Low

High CPU when fog-aliyun is used in CF Cloud Controller

When switching in a CF landscape with "some usage" the cloud controller from bits-service to fog, we observed a drastic increase in CPU usage of the ruby processes of the Cloud Controller (see attached monitoring screenshot).
Such an increase was not observed on AWS, Azure and GCP where we switched from bits to fog as well. The CF usage (# of cf-push operations) should be comparable between the different IaaS.

Connection within the same VPC

The Internal domain name is expected to be used when accessing OSS on the ECS server within the same VPC, but it looks like the "-internal" part is not included in the result of the get_bucket_location function query.

Timeouts if internal URLs needs to be used

Hi,

we are currently using the fog-aliyun gem to store/get data from OSS. Unfortunately, it seems like the gem only supports internal endpoint URLs for the multipart upload part, as it is possible to provide the endpoint as an argument there (

def initiate_multipart_upload(bucket, object, endpoint)
). For nearly all other calls the endpoint urls gets generated (e.g.:
endpoint = 'http://' + location + '.aliyuncs.com'
) which leads to the point that a non internal URL gets generated and used. This leads to timeouts if the VMs are not allowed to connect to the Internet.

Maybe the code could be adjusted to handle the endpoint generation like it is done in the multipart upload code.

Thanks for your help.

Failed to get server collection using Fog::Compute::Aliyun::Servers

I am using below gem versions:

fog-aliyun (0.3.2)
fog-core (2.1.2)
fog-json (1.2.0)

compute_instance.images returns Fog::Compute::Aliyun::Images which contains list of objects of type Fog::Compute::Aliyun::Image.

Similarly, if I try for compute_instance.servers, it is returning Fog::Compute::Aliyun::Servers with empty list no any server instance inside.

<Fog::Compute::Aliyun::Servers [ ] >

Note - I have created one instance.

When I call .all method on compute_instance.servers it returns list of hash which includes details of that created instance. In short .list_servers method gives a list of created instances.

Is this expected behavior?

Publish new version

Important fixes like #10 never make the way into a proper release at the moment. This is causing problems in downstream consumers, such as GitLab which recently added Aliyun support for backups.

As the library is basically untouched for over 1 yr, a 0.2.0 or even 1.0.0 release really should be done.

The create_disk method of compute model fails with IncompeteSignature

Here is the error, the same accesskey,secretkey works for other calls like list images, list servers even it works with OSS,

Excon::Error::BadRequest (Expected([200, 203]) <=> Actual(400 Bad Request))
excon.error.response
  :body          => "{\"Recommend\":\"https://error-center.aliyun.com/status/search?Keyword=IncompleteSignature&source=PopGw\",\"Message\":\"The request signature does not conform to Aliyun standards. server string to sign is: ****

,\"RequestId\":\"886024CB-30A3-4945-AC3D-D52F706B65A0\",\"HostId\":\"ecs.aliyuncs.com\",\"Code\":\"IncompleteSignature\"}"
  :cookies       => [
  ]
  :headers       => {
    "Access-Control-Allow-Headers" => "X-Requested-With, X-Sequence, _aop_secret, _aop_signature"
    "Access-Control-Allow-Methods" => "POST, GET, OPTIONS"
    "Access-Control-Allow-Origin"  => "*"
    "Access-Control-Max-Age"       => "172800"
    "Connection"                   => "close"
    "Content-Length"               => "647"
    "Content-Type"                 => "application/json; charset=UTF-8"
    "Date"                         => "Mon, 11 Feb 2019 10:17:04 GMT"
    "Server"                       => "Jetty(7.2.2.v20101205)"
  }
  :host          => "ecs.aliyuncs.com"
  :local_address => "****"
  :local_port    => 56738
  :path          => "****"
  :port          => 443
  :reason_phrase => "Bad Request"
  :remote_ip     => "****"
  :status        => 400
  :status_line   => "HTTP/1.1 400 Bad Request\r\n"

Not support aliyun oss internal model

rake aborted!
Excon::Error::Forbidden: Expected(200) <=> Actual(403 Forbidden)
excon.error.response
  :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error>\n  <Code>AccessDenied</Code>\n  <Message>The bucket you access does not belong to you.</Message>\n  <RequestId>5D008E974B39ED0046A010FE</RequestId>\n  <HostId>xxxgitbackup.oss-cn-hangzhou.aliyuncs.com:80</HostId>\n</Error>\n"
  :cookies       => [
  ]
  :headers       => {
    "Connection"        => "keep-alive"
    "Content-Length"    => "265"
    "Content-Type"      => "application/xml"
    "Date"              => "Wed, 12 Jun 2019 05:33:11 GMT"
    "Server"            => "AliyunOSS"
    "x-oss-request-id"  => "5D008E974B39ED0046A010XX"
    "x-oss-server-time" => "33"
  }
  :host          => "xxxgitbackup.oss-cn-hangzhou.aliyuncs.com"
  :local_address => "172.18.2.xx"
  :local_port    => 36126
  :path          => "/?uploads"
  :port          => 80
  :reason_phrase => "Forbidden"
  :remote_ip     => "47.110.178.xx"
  :status        => 403
  :status_line   => "HTTP/1.1 403 Forbidden\r\n"
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/excon-0.62.0/lib/excon/middlewares/expects.rb:7:in `response_call'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/excon-0.62.0/lib/excon/middlewares/response_parser.rb:9:in `response_call'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/excon-0.62.0/lib/excon/connection.rb:414:in `response'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/excon-0.62.0/lib/excon/connection.rb:263:in `request'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-core-2.1.0/lib/fog/core/connection.rb:81:in `request'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-aliyun-0.3.3/lib/fog/aliyun/storage.rb:150:in `request'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-aliyun-0.3.3/lib/fog/aliyun/requests/storage/list_objects.rb:54:in `list_multipart_uploads'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-aliyun-0.3.3/lib/fog/aliyun/requests/storage/put_object.rb:76:in `put_multipart_object'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-aliyun-0.3.3/lib/fog/aliyun/requests/storage/put_object.rb:20:in `put_object'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-aliyun-0.3.3/lib/fog/aliyun/models/storage/file.rb:119:in `save'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fog-core-2.1.0/lib/fog/core/collection.rb:50:in `create'

Next fog release

Hi there,

When the next fog-aliyun is planned to be released? The master branch has some bug fixes that are not part of the latest release.

Thanks,
Dmitry

Deprecation warnings

Hi,

When I run integration test, I see the following message in the console:

[fog][DEPRECATION] Unable to load Fog::Aliyun::Storage
[fog][DEPRECATION] Falling back to deprecated constant Fog::Storage::Aliyun. The preferred format of service provider constants has changed from service::provider to provider::service. Please update this service provider to use the preferred format.

Please upgrade deprecated code.

Thanks

gem version 0.0.10 removed from repository

Hi,

is there a specific reason why the version 0.0.10 was completely deleted from repositories? I understand the need for security patches, but deleting the release is kind of inconvenient ...

Best

Incomplete error status code handling

Hi,

The 404 check in

return nil if data[:status] == 404
is not sufficient, as it doesn't handle any other error status (like 403 or 500).

This code should be updated to introduce better error status handling.
In addition, it makes sense to introduce status check guard logic also to other places where the interaction with OSS API is made.
For example, it can make sense to additionally handle the errors in these functions:
https://github.com/fog/fog-aliyun/blob/master/lib/fog/aliyun/models/storage/files.rb#L18
https://github.com/fog/fog-aliyun/blob/master/lib/fog/aliyun/models/storage/files.rb#L60

Thanks

Exconn warnings

Hi, when I run integration tests with export EXCON_DEBUG=true I get the following warnings from excon library (responsible for requests):

[excon][WARNING] Invalid Excon request keys: :resource, :endpoint, :location, :bucket
/Library/Ruby/Gems/2.6.0/gems/excon-0.73.0/lib/excon/connection.rb:433:in `validate_params'
/Library/Ruby/Gems/2.6.0/gems/excon-0.73.0/lib/excon/connection.rb:235:in `request'
/Library/Ruby/Gems/2.6.0/gems/fog-core-2.2.0/lib/fog/core/connection.rb:79:in `request'
/Users/i068165/Work/fog/xjfog/lib/fog/aliyun/storage.rb:153:in `request'
/Users/i068165/Work/fog/xjfog/lib/fog/aliyun/requests/storage/get_containers.rb:50:in `get_containers'
/Users/i068165/Work/fog/xjfog/lib/fog/aliyun/models/storage/directories.rb:13:in `all'
/Users/i068165/Work/fog/xjfog/spec/fog/integration_spec.rb:23:in `block (2 levels) in <top (required)>'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:257:in `instance_exec'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:257:in `block in run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:503:in `block in with_around_and_singleton_context_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:460:in `block in with_around_example_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/hooks.rb:481:in `block in run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/hooks.rb:619:in `run_around_example_hooks_for'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/hooks.rb:481:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:460:in `with_around_example_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:503:in `with_around_and_singleton_context_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:254:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:644:in `block in run_examples'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:640:in `map'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:640:in `run_examples'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:606:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:121:in `map'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/configuration.rb:2058:in `with_suite_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:116:in `block in run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/reporter.rb:74:in `report'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:115:in `run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:89:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:71:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:45:in `invoke'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/exe/rspec:4:in `<main>'
[excon][WARNING] The following request keys are only valid with the associated middleware:
/Library/Ruby/Gems/2.6.0/gems/excon-0.73.0/lib/excon/connection.rb:440:in `validate_params'
/Library/Ruby/Gems/2.6.0/gems/excon-0.73.0/lib/excon/connection.rb:235:in `request'
/Library/Ruby/Gems/2.6.0/gems/fog-core-2.2.0/lib/fog/core/connection.rb:79:in `request'
/Users/i068165/Work/fog/xjfog/lib/fog/aliyun/storage.rb:153:in `request'
/Users/i068165/Work/fog/xjfog/lib/fog/aliyun/requests/storage/get_containers.rb:50:in `get_containers'
/Users/i068165/Work/fog/xjfog/lib/fog/aliyun/models/storage/directories.rb:13:in `all'
/Users/i068165/Work/fog/xjfog/spec/fog/integration_spec.rb:23:in `block (2 levels) in <top (required)>'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:257:in `instance_exec'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:257:in `block in run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:503:in `block in with_around_and_singleton_context_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:460:in `block in with_around_example_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/hooks.rb:481:in `block in run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/hooks.rb:619:in `run_around_example_hooks_for'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/hooks.rb:481:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:460:in `with_around_example_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:503:in `with_around_and_singleton_context_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example.rb:254:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:644:in `block in run_examples'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:640:in `map'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:640:in `run_examples'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/example_group.rb:606:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:121:in `map'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/configuration.rb:2058:in `with_suite_hooks'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:116:in `block in run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/reporter.rb:74:in `report'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:115:in `run_specs'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:89:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:71:in `run'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/lib/rspec/core/runner.rb:45:in `invoke'
/Library/Ruby/Gems/2.6.0/gems/rspec-core-3.9.2/exe/rspec:4:in `<main>'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.