Skip to content

Conversation

krishna-birla
Copy link

Side effects:

  • Minor clean-up
  • Update .gitignore
  • Add dependency go.uber.org/multierr v1.1.0

Issue, if available:

#71

Description of changes:

To show Spot and On Demand prices in table wide output irrespective of the price filters being set; if the filters are set, do filtration normally depending on usage class. For other output modes, do filtration normally depending on usage class.

Testing:

Table wide output - us-east-1 (both cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table-wide --region us-east-1 --max-results 10
Instance Type  VCPUs   Mem (GiB)  Hypervisor  Current Gen  Hibernation Support  CPU Arch      Network Performance  ENIs    GPUs    GPU Mem (GiB)  GPU Info  On-Demand Price/Hr  Spot Price/Hr (30d avg)
-------------  -----   ---------  ----------  -----------  -------------------  --------      -------------------  ----    ----    -------------  --------  ------------------  -----------------------
a1.2xlarge     8       16         nitro       false        false                arm64         Up to 10 Gigabit     4       0       0                        $0.204              $0.06769
a1.4xlarge     16      32         nitro       false        false                arm64         Up to 10 Gigabit     8       0       0                        $0.408              $0.1343
a1.large       2       4          nitro       false        false                arm64         Up to 10 Gigabit     3       0       0                        $0.051              $0.01694
a1.medium      1       2          nitro       false        false                arm64         Up to 10 Gigabit     2       0       0                        $0.0255             $0.0084
a1.metal       16      32         none        false        false                arm64         Up to 10 Gigabit     8       0       0                        $0.408              $0.1343
a1.xlarge      4       8          nitro       false        false                arm64         Up to 10 Gigabit     4       0       0                        $0.102              $0.0336
c1.medium      2       1.69922    xen         false        false                i386, x86_64  Moderate             2       0       0                        $0.13               $0.01402
c1.xlarge      8       7          xen         false        false                x86_64        High                 4       0       0                        $0.52               $0.11083
c3.2xlarge     8       15         xen         false        true                 x86_64        High                 4       0       0                        $0.42               $0.13062
c3.4xlarge     16      30         xen         false        true                 x86_64        High                 8       0       0                        $0.84               $0.31342
NOTE: 373 entries were truncated, increase --max-results to see more

Table wide output - ap-south-1 (both cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table-wide --region ap-south-1 --max-results 10
Instance Type  VCPUs   Mem (GiB)  Hypervisor  Current Gen  Hibernation Support  CPU Arch  Network Performance  ENIs    GPUs    GPU Mem (GiB)  GPU Info  On-Demand Price/Hr  Spot Price/Hr (30d avg)
-------------  -----   ---------  ----------  -----------  -------------------  --------  -------------------  ----    ----    -------------  --------  ------------------  -----------------------
a1.2xlarge     8       16         nitro       false        false                arm64     Up to 10 Gigabit     4       0       0                        $0.204              $0.0547
a1.4xlarge     16      32         nitro       false        false                arm64     Up to 10 Gigabit     8       0       0                        $0.408              $0.1095
a1.large       2       4          nitro       false        false                arm64     Up to 10 Gigabit     3       0       0                        $0.051              $0.0137
a1.medium      1       2          nitro       false        false                arm64     Up to 10 Gigabit     2       0       0                        $0.0255             $0.0068
a1.metal       16      32         none        false        false                arm64     Up to 10 Gigabit     8       0       0                        $0.408              $0.1095
a1.xlarge      4       8          nitro       false        false                arm64     Up to 10 Gigabit     4       0       0                        $0.102              $0.0274
c4.2xlarge     8       15         xen         true         true                 x86_64    High                 4       0       0                        $0.4                $0.12467
c4.4xlarge     16      30         xen         true         true                 x86_64    High                 8       0       0                        $0.8                $0.20867
c4.8xlarge     36      60         xen         true         true                 x86_64    10 Gigabit           8       0       0                        $1.6                $0.42315
c4.large       2       3.75       xen         true         true                 x86_64    Moderate             3       0       0                        $0.1                $0.02553
NOTE: 226 entries were truncated, increase --max-results to see more

Table output - ap-south-1 (both cache was NOT hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table --region ap-south-1 --max-results 10
Instance Type        VCPUs        Mem (GiB)
-------------        -----        ---------
a1.2xlarge           8            16
a1.4xlarge           16           32
a1.large             2            4
a1.medium            1            2
a1.metal             16           32
a1.xlarge            4            8
c4.2xlarge           8            15
c4.4xlarge           16           30
c4.8xlarge           36           60
c4.large             2            3.75
NOTE: 226 entries were truncated, increase --max-results to see more

Table wide output with price filter - ap-south-1 (both cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table-wide --region ap-south-1 --max-results 10 --price-per-hour 0.0255
Instance Type  VCPUs   Mem (GiB)  Hypervisor  Current Gen  Hibernation Support  CPU Arch  Network Performance  ENIs    GPUs    GPU Mem (GiB)  GPU Info  On-Demand Price/Hr  Spot Price/Hr (30d avg)
-------------  -----   ---------  ----------  -----------  -------------------  --------  -------------------  ----    ----    -------------  --------  ------------------  -----------------------
a1.medium      1       2          nitro       false        false                arm64     Up to 10 Gigabit     2       0       0                        $0.0255             $0.0068

Table wide output with price filter and usage class - ap-south-1 (both cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table-wide --region ap-south-1 --max-results 10 --price-per-hour 0.0068 --usage-class spot
Instance Type  VCPUs   Mem (GiB)  Hypervisor  Current Gen  Hibernation Support  CPU Arch  Network Performance  ENIs    GPUs    GPU Mem (GiB)  GPU Info  On-Demand Price/Hr  Spot Price/Hr (30d avg)
-------------  -----   ---------  ----------  -----------  -------------------  --------  -------------------  ----    ----    -------------  --------  ------------------  -----------------------
a1.medium      1       2          nitro       false        false                arm64     Up to 10 Gigabit     2       0       0                        $0.0255             $0.0068

Table wide output with price range filter - ap-south-1 (both cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table-wide --region ap-south-1 --max-results 10 --price-per-hour-min 0.19 --price-per-hour-max 0.26
Instance Type  VCPUs   Mem (GiB)  Hypervisor  Current Gen  Hibernation Support  CPU Arch  Network Performance  ENIs    GPUs    GPU Mem (GiB)  GPU Info  On-Demand Price/Hr  Spot Price/Hr (30d avg)
-------------  -----   ---------  ----------  -----------  -------------------  --------  -------------------  ----    ----    -------------  --------  ------------------  -----------------------
a1.2xlarge     8       16         nitro       false        false                arm64     Up to 10 Gigabit     4       0       0                        $0.204              $0.0547
c4.xlarge      4       7.5        xen         true         true                 x86_64    High                 4       0       0                        $0.2                $0.05675
c5d.xlarge     4       8          nitro       true         false                x86_64    Up to 10 Gigabit     4       0       0                        $0.198              $0.05407
c5n.xlarge     4       10.5       nitro       true         false                x86_64    Up to 25 Gigabit     4       0       0                        $0.216              $0.0541
i3en.large     2       16         nitro       true         false                x86_64    Up to 25 Gigabit     3       0       0                        $0.257              $0.0771
m4.xlarge      4       16         xen         true         true                 x86_64    High                 4       0       0                        $0.21               $0.05484
m5.xlarge      4       16         nitro       true         true                 x86_64    Up to 10 Gigabit     4       0       0                        $0.202              $0.05727
m5a.2xlarge    8       32         nitro       true         true                 x86_64    Up to 10 Gigabit     4       0       0                        $0.222              $0.13125
m5d.xlarge     4       16         nitro       true         false                x86_64    Up to 10 Gigabit     4       0       0                        $0.244              $0.05576
m6g.2xlarge    8       32         nitro       true         false                arm64     Up to 10 Gigabit     4       0       0                        $0.2024             $0.11782
NOTE: 6 entries were truncated, increase --max-results to see more

Table output with price range filter - ap-south-1 (only on-demand cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table --region ap-south-1 --max-results 10 --price-per-hour-min 0.19 --price-per-hour-max 0.26
Instance Type        VCPUs        Mem (GiB)
-------------        -----        ---------
a1.2xlarge           8            16
c4.xlarge            4            7.5
c5d.xlarge           4            8
c5n.xlarge           4            10.5
i3en.large           2            16
m4.xlarge            4            16
m5.xlarge            4            16
m5a.2xlarge          8            32
m5d.xlarge           4            16
m6g.2xlarge          8            32
NOTE: 6 entries were truncated, increase --max-results to see more

Table wide output with price range filter and usage class - ap-south-1 (both cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table-wide --region ap-south-1 --max-results 10 --price-per-hour-min 0.03 --price-per-hour-max 0.16 --usage-class spot
Instance Type  VCPUs   Mem (GiB)  Hypervisor  Current Gen  Hibernation Support  CPU Arch  Network Performance  ENIs    GPUs    GPU Mem (GiB)  GPU Info  On-Demand Price/Hr  Spot Price/Hr (30d avg)
-------------  -----   ---------  ----------  -----------  -------------------  --------  -------------------  ----    ----    -------------  --------  ------------------  -----------------------
a1.2xlarge     8       16         nitro       false        false                arm64     Up to 10 Gigabit     4       0       0                        $0.204              $0.0547
a1.4xlarge     16      32         nitro       false        false                arm64     Up to 10 Gigabit     8       0       0                        $0.408              $0.1095
a1.metal       16      32         none        false        false                arm64     Up to 10 Gigabit     8       0       0                        $0.408              $0.1095
c4.2xlarge     8       15         xen         true         true                 x86_64    High                 4       0       0                        $0.4                $0.12467
c4.xlarge      4       7.5        xen         true         true                 x86_64    High                 4       0       0                        $0.2                $0.05677
c5.2xlarge     8       16         nitro       true         true                 x86_64    Up to 10 Gigabit     4       0       0                        $0.34               $0.12554
c5.large       2       4          nitro       true         true                 x86_64    Up to 10 Gigabit     3       0       0                        $0.085              $0.03303
c5.xlarge      4       8          nitro       true         true                 x86_64    Up to 10 Gigabit     4       0       0                        $0.17               $0.0553
c5a.2xlarge    8       16         nitro       true         false                x86_64    Up to 10 Gigabit     4       0       0                        $0.188              $0.11058
c5a.xlarge     4       8          nitro       true         false                x86_64    Up to 10 Gigabit     4       0       0                        $0.094              $0.05307
NOTE: 48 entries were truncated, increase --max-results to see more

Table output with price range filter and usage class - ap-south-1 (only spot cache was hydrated)

Krishna-Birla:amazon-ec2-instance-selector krishna.birla$ ./build/ec2-instance-selector -o table --region ap-south-1 --max-results 10 --price-per-hour-min 0.03 --price-per-hour-max 0.16 --usage-class spot
Instance Type        VCPUs        Mem (GiB)
-------------        -----        ---------
a1.2xlarge           8            16
a1.4xlarge           16           32
a1.metal             16           32
c4.2xlarge           8            15
c4.xlarge            4            7.5
c5.2xlarge           8            16
c5.large             2            4
c5.xlarge            4            8
c5a.2xlarge          8            16
c5a.xlarge           4            8
NOTE: 48 entries were truncated, increase --max-results to see more
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@krishna-birla krishna-birla changed the title Add Spot/On-demand price to table-wide output irrespective of the price filters [WIP] Add Spot/On-demand price to table-wide output irrespective of the price filters Mar 6, 2021
Copy link
Contributor

@bwagner5 bwagner5 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall very nice refactor and thanks for contributing to this project!! I've left a few minor comments in-line.

It looks like the unit-tests are also failing. There's some test coverage missing on the output, selector, and ec2-pricing pkgs too. Would you mind upping the coverage for those packages for this enhancement?

I commented about how to fix the pricing endpoint, no obligation for you fix it, but if you'd like to include that fix or open a new PR, feel free. If not, I'll fix that sometime this week.

Thanks again!

import (
"fmt"
"github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/service/lightsail"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is lightsail brought in here? I see it added to the main struct as well, but no use for it as far as I can tell.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My bad.


import (
"fmt"
"github.com/aws/aws-sdk-go/aws/endpoints"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you move these non-standard lib imports to the next stanza?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. Will add that to my fmt rules for this project.

spotCache map[string]map[string][]spotPricingEntry
PricingClient pricingiface.PricingAPI
EC2Client ec2iface.EC2API
LightsailClient lightsailiface.LightsailAPI
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove lightsail client

// In simple words, make sure they don't write the same variable/file/row etc. which they don't (they have different cache maps)
HydrateOndemandCache() error
HydrateSpotCache(days int) error
LastOnDemandCachedUTC() *time.Time
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you change to LastOnDemandCacheUTC removing the d. Same for the spot timestamp

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okie.

AWSSession *session.Session
cache map[string]float64
spotCache map[string]map[string][]spotPricingEntry
PricingClient pricingiface.PricingAPI
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To fix https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/using-pelong.html#pe-endpoint , I believe we can just copy the session and change the region to always use us-east-1 just for the PricingClient. The filters already include the location. I didn't realize pricing was a global endpoint :) I can do this fix if you'd like.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I realized this. Will make the change and other changes.

return nil, err
}
var locations []string
var locations, aZones []string
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we call aZones one of these instead: zones, availabilityZones, azs?

@bwagner5
Copy link
Contributor

Hey @krishna-birla , just wanted to check in and see if there's anything I can help with to get this merged? No worries if you've just been busy!

@krishna-birla
Copy link
Author

Hey @krishna-birla , just wanted to check in and see if there's anything I can help with to get this merged? No worries if you've just been busy!

Unfortunately it is the later, typical end of quarter. Anyway, will dedicate this week to it.

When do you plan to release?

@bwagner5
Copy link
Contributor

I'm in no rush, take your time and let me know if you need any help! :)

@bwagner5
Copy link
Contributor

Hey, just checking in. If you won't have the time to work on this soon, I could merge this PR and then I could work on a follow up to address some of the comments in this PR. Would that be okay with you?

@krishna-birla
Copy link
Author

The UTs need changes. I hit a roadblock with just one thing: internal function to get price does not know when it was called by CLI (i.e. via main function) and when it was called directly by SDK. Because for SDK callers, we don't cache but want to report prices all the same. And so I was trying to make internal function aware of this, which is what I was trying with "LastCachedUTC()" function. This is what I was working on last around 3 weeks ago, but I was tested covid +ve and had to halt with it 😅.

I don't know if we can merge this as is, as tests are failing and some finishing is required.

If you want you can close this (and I will re-open it when I am able to) and mean while submit the much smaller fix for To fix https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/using-pelong.html#pe-endpoint , I believe we can just copy the session and change the region to always use us-east-1 just for the PricingClient. The filters already include the location. I didn't realize pricing was a global endpoint :) I can do this fix if you'd like. this issue.

@krishna-birla
Copy link
Author

I may get some time this weekend, or next week to find a good solution for "LastCachedUTC()" stuff. 🤞🏽

@krishna-birla
Copy link
Author

I just saw this: #84 (comment). I'll try to prioritise.

@bwagner5
Copy link
Contributor

bwagner5 commented May 5, 2021

Made the pricing client endpoint change here: #85

mdb added a commit to mdb/amazon-ec2-instance-selector that referenced this pull request Nov 4, 2021
* remove the importing of un-used Lightsail packages, as [requested by @bwagner](aws#78 (comment))
* move non-standard lib imports to their own stanza, as [requested by @bwagner](aws#78 (comment))

Signed-off-by: Mike Ball <[email protected]>
mdb added a commit to mdb/amazon-ec2-instance-selector that referenced this pull request Nov 4, 2021
This was requested by @bwagner here:
aws#78 (comment)

Signed-off-by: Mike Ball <[email protected]>
mdb added a commit to mdb/amazon-ec2-instance-selector that referenced this pull request Nov 4, 2021
Per code review from @bwagner, this renames various
methods and fields to be `*CacheUTC` rather than `*CachedUTC`:
aws#78 (comment)
mdb added a commit to mdb/amazon-ec2-instance-selector that referenced this pull request Nov 6, 2021
By populating the `lastOnDemandCacheUTC` and `lastSpotCacheUTC`
fields with non-`nil` values, the `Filter` tests exercise relevant
code paths.

Note that this doesn't change @krishna-birla's original implementation
(see PR aws#78) or vision; it only ensures the tests pass.

Signed-off-by: Mike Ball <[email protected]>
bwagner5 pushed a commit that referenced this pull request Nov 15, 2021
…ce filters (#106)

* Add Spot/On-demand price to table-wide output irrespective of the price filters

* Minor clean-up

* adjust ec2pricing imports

* remove the importing of un-used Lightsail packages, as [requested by @bwagner](#78 (comment))
* move non-standard lib imports to their own stanza, as [requested by @bwagner](#78 (comment))

Signed-off-by: Mike Ball <[email protected]>

* rename aZones var to 'availabilityZones'

This was requested by @bwagner here:
#78 (comment)

Signed-off-by: Mike Ball <[email protected]>

* rename fields/methods `*CacheUTC`

Per code review from @bwagner, this renames various
methods and fields to be `*CacheUTC` rather than `*CachedUTC`:
#78 (comment)

* update selector to use `LastSpotCacheUTC()`

Previously, `selector` was incorrectly using the old
`LastSpotCachedUTC` method name.

* make `ec2PricingMock` proper `EC2PricingIface`

* remove invalid 'FIXME' comment

This is now fixed, as the Pricing client is always initialized to us-east-1.

Signed-off-by: Mike Ball <[email protected]>

* move error check inside loop

Per [code review feedback](#106 (comment)), the error checking
should appear within the `range pricingOutput.PriceList`.

Signed-off-by: Mike Ball <[email protected]>

* remove invalid 'FIXME' code comment

This issue is now resolved.

Signed-off-by: Mike Ball <[email protected]>

* commit `go mod tidy` results

Signed-off-by: Mike Ball <[email protected]>

* protect against panics during unit tests

This protects against panics like the following, for example:

```
--- FAIL: TestFilter_X8664_AMD64 (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
        panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x153ec41]

goroutine 153 [running]:
testing.tRunner.func1.2({0x1613ee0, 0x1cdfe70})
        /usr/local/Cellar/go/1.17.2/libexec/src/testing/testing.go:1209 +0x24e
testing.tRunner.func1()
        /usr/local/Cellar/go/1.17.2/libexec/src/testing/testing.go:1212 +0x218
panic({0x1613ee0, 0x1cdfe70})
        /usr/local/Cellar/go/1.17.2/libexec/src/runtime/panic.go:1038 +0x215
github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector.Selector.rawFilter.func1(0x100e6e7, 0x68)
        /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector/pkg/selector/selector.go:192 +0x241
github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector_test.mockedEC2.DescribeInstanceTypesPages(...)
        /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector/pkg/selector/selector_test.go:70
github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector.Selector.rawFilter({{_, _}, {_, _}, {_}}, {0x0, 0x0, 0x0, 0xc0003854a0, 0x0, ...})
        /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector/pkg/selector/selector.go:184 +0x5c2
github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector.Selector.FilterWithOutput({{_, _}, {_, _}, {_}}, {0x0, 0x0, 0x0, 0xc0003854a0, 0x0, ...}, ...)
        /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector/pkg/selector/selector.go:116 +0xc5
github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector.Selector.Filter({{_, _}, {_, _}, {_}}, {0x0, 0x0, 0x0, 0xc0003854a0, 0x0, ...})
        /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector/pkg/selector/selector.go:98 +0xcc
github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector_test.TestFilter_X8664_AMD64(0xc0002de820)
        /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector/pkg/selector/selector_test.go:583 +0x14e
testing.tRunner(0xc00059b520, 0x177e1b0)
        /usr/local/Cellar/go/1.17.2/libexec/src/testing/testing.go:1259 +0x102
created by testing.(*T).Run
        /usr/local/Cellar/go/1.17.2/libexec/src/testing/testing.go:1306 +0x35a
exit status 2
```

Signed-off-by: Mike Ball <[email protected]>

* report received value in test output

This seeks to make the specifics of test failures a bit more clear.

Signed-off-by: Mike Ball <[email protected]>

* run `go mod tidy`

This addresses the following:

```
$ make unit-test
go test -bench=. /Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector//...  -v -coverprofile=coverage.out -covermode=atomic -outputdir=/Users/mball/dev/go/src/github.com/aws/amazon-ec2-instance-selector//build
go: updates to go.mod needed; to update it:
        go mod tidy
make: *** [unit-test] Error 1
```

Signed-off-by: Mike Ball <[email protected]>

* fix failing selector.Filter unit tests

By populating the `lastOnDemandCacheUTC` and `lastSpotCacheUTC`
fields with non-`nil` values, the `Filter` tests exercise relevant
code paths.

Note that this doesn't change @krishna-birla's original implementation
(see PR #78) or vision; it only ensures the tests pass.

Signed-off-by: Mike Ball <[email protected]>

Co-authored-by: Krishna Birla <[email protected]>
@bwagner5
Copy link
Contributor

Finished in #106

Thanks for the collab on this @krishna-birla !

@bwagner5 bwagner5 closed this Nov 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants