MudTextField component always renders inputmode attribute in the generated HTML.

Bug type
Component
Component name
MudTextField
What happened?
MudTextField component always renders inputmode attribute in the generated HTML.
< input class="mud-input-slot mud-input-root mud-input-root-text" type="number" inputmode="text" maxlength="524288" aria-invalid="false" _bl_2="">
Expected behavior
<input class="mud-input-slot mud-input-root mud-input-root-text" type="number" inputmode="text" maxlength="524288" aria-invalid="false" _bl_2="">
The Problem:
To show the Number and Punctuation keyboard (https://cdn.hashnode.com/res/hashnode/image/upload/v1653170593942/bmDmsyJ8A.png) for iOS (iPhone), the inputmode parameter should not be rendered (it changes the keyboard type). If we make the inputmode parameter nullable, and when it is nullable not to be rendered in HTML, then it would solve the problem very easily.
Reproduction link
https://try.mudblazor.com/snippet/mYcxOpwIdqbEAPnR
Reproduction steps

Place a MudTextField element on a page
Observe the generated HTML

Relevant log output
No response
Version (bug)
6.10.0
Version (working)
6.10.0
What browsers are you seeing the problem on?
Firefox, Chrome, Microsoft Edge, Safari
On what operating system are you experiencing the issue?
Windows, Mac OSX, iOS, Android
Pull Request

[X] I would like to do a Pull Request

Code of Conduct

[X] I agree to follow this project's Code of Conduct

@henon, @ScarletKuro, Dear authors, is there any news on this topic, it's an easy thing to fix and we haven't had any updates for half a year. Could you please come back with some feedback?

Hi @GrigoreCojusneanu, thanks for tagging us, because we can't read every issue, there are just too many.
Do you propose to remove the attribute in general or only for IOS? Because I have no idea whether or not this has any unintended consequences on Android, Desktop, etc. Or can you test this? In any case, please go ahead and PR (and tag us). We can continue the discussion in the PR.


[bug]: Channel Issue After Resolving Pending Opening Transaction with CPFP (edge not found)

Background
I am currently operating a Lightning node using the Voltage service.
About 2-3 weeks ago, I sent a request to open a channel. However, I set the fee rate too low at 1 sat/vB, which left the channel opening transaction in a pending state for 2-3 weeks.
To resolve this, I used the BumpFee feature to create a CPFP transaction and managed to include the channel opening transaction in a block about two days ago.
The problem occurred after this step. In ThunderHub, the channel list shows a red light for the channel, and the funds are in a pending state. When I try to close the channel, I encounter a FullChannelDetailsNotFound error and cannot close it.
Additionally, I tried to force-close the channel using the CloseChannel API, but it still doesn't close.
The channel ID appears as 781086x1593x0 in ThunderHub, but it cannot be found on Amboss Space.
Moreover, the following error message appears in the node logs:

Unable to retrieve chan status for Channel(6416b777b6212f949d1b47655bcd441bbdf0a10a3425535d70d7b163540985b2:0): edge not found.

How can I close the channel and retrieve my funds?
Your environment

version of lnd: 0.15.5-beta
Voltage service

Steps to reproduce

Send a channel opening request with a low fee rate (1 sat/vB).
Wait for the transaction to be pending for 2-3 weeks.
Use the "bumpfee" feature to create a CPFP transaction.
Confirm the channel opening transaction in a block.
Check the channel status in ThunderHub and attempt to close it.

Expected behaviour
The channel should be opened, and funds should not be in a pending state. I should be able to close the channel without any issues, and the channel should be found on Amboss Space.
Actual behaviour
The channel is stuck with a red light in ThunderHub, funds are in a pending state, and I cannot close the channel due to a FullChannelDetailsNotFound error. The channel ID 781086x1593x0 cannot be found on Amboss Space. Force-closing the channel using the CloseChannel API is unsuccessful, and the node shows an Unable to retrieve chan status error message.

It looks like your node is not aware of this channel. Does it appear in lncli pendingchannels or lncli listchannels?

@positiveblue Hi, thank you for your response.
I have checked my channels with the lncli pendingchannels command and I couldn't find any channel information. However, when I tried the lncli listchannels command, I was able to see the channel information, but the "active" value was set to false.
Please let me know if you need any further information or if there is anything I should do to resolve this issue.
Thank you.

@positiveblue Hi, I just wanted to give you an update. I was able to close the channel by running the following command:
lncli closechannel --funding_txid 6416b777b6212f949d1b47655bcd441bbdf0a10a3425535d70d7b163540985b2 --output_index 0 --force
Previously, when I called the CloseChannel REST API, it didn't work, possibly due to some mistake I made. However, when I tried with lncli, I was able to forcibly close the channel.
Now my issue is resolved. Thank you so much for your help!


Onboarding is not very clear

as a new user, it's not super clear when i'm "on the network" (or what that really means in this case).
i read in other places that you manually approve users. does that mean that when someone first logs on, they are basically sitting in a fork of your database and they are submitting a pull request to the main database when they submit changes?
if that is the case, then the app doesn't really have a concept of being "online", right?
maybe some kind of status indicator on the screen could help to provide some context to the user in terms of "where they are" / "what their status is", if that makes sense

Actually, nothing happens when you first login. There is no server-side session; logging in just means you generated a login key (or added an existing one) locally. But when you make a post, it will initially end up in a separate db called "limbo" which i check regularly. Once i add you, all of your posts will be moved into the main db and all future posts will go there automatically.
You can see if you're in limbo by clicking on "my page". If you're in limbo, it will say so at the top. This will take a few seconds while it queries for your user. If you haven't made any posts at all, i believe it will not say that message because technically you don't exist anywhere yet. But yeah, it would be good to make this status more obvious, i'll try to think more about that. BTW i don't see anything in limbo right now, so i'm guessing you haven't made a post yet?

Ok that makes sense! I guess I was approved a long time ago. I think maybe the UI is just a little confusing for me (using the web client).

So these three boxes are "boards" like subreddits. And on My Page, I can create a "journal post" where my journal is a personal "board" / subreddit where only i post things.
Have you thought about making an SDK for this so other people can try their hand at making alternate front ends?

Yeah those are the subboards right now, and journal posts are like blog posts.
The technique i use for querying makes it very open for alternative frontends. Once things settle down i plan on extracting it so others can use it more easily. There isn't even technically a need for an API, because the raw SQLite database is public and can be queried directly. I'll write more about this later but anyway, it should make it really practical to write clients in any language you want.


fbit list fails when the data store is empty.

Closed with 0.4.1-prerelease-1

Closed wrong issue.

Beginning work on this issue.


pipenv run --help crashes

Issue description
Pipenv 2018.7.1
In any directory (either containing an existing Pipfile or not), running pipenv run --help crashes.
Expected result
The help text for the run command.
Actual result
https://gist.github.com/boustrophedon/c396bf9e6c287f818f9b2ddf23ecebc7
Steps to replicate
Provide the steps to replicate (which usually at least includes the commands and the Pipfile).
run the command pipenv run --help

pipenv --support:
https://gist.github.com/boustrophedon/b68b539241d0ac5fd4aa0974eaf39c89

Closed via #3844

Thank you!


Docs: Mention that the Rust client explicitly needs port 6334 in URL for Qdrant cloud

The cluster manager allows developers to copy a cluster's URL into the clipboard. That is convenient. If this URL is used with the Rust client, it does not work. It results in a 464 (incompatible protocol) error. As a developer, you have to add :6334 to the URL to make it work. It would be helpful to have a hint in the cluster manager and/or the Rust client docs that this is important.

Thank you for the suggestion :+1:
I have added a paragraph regarding connecting to Qdrant cloud in https://github.com/qdrant/rust-client/commit/e36af145ad0eeb2c4ad220a74ee5edf1d6ad5243


Half broken responsiveness intended?

Just out of curiosity: with the 4 column layout the widgets don't wrap onto a new line when the screen width is decreased and instead just get squashed. Is that really the wanted behaviour?

Not really, just a use case we never tested. I can have look or if you want, feel free to submit a pull request. :-)

Fixed on 82d52b30911b4aff531e2eb687edf8e505792208.


Channelz: track listen sockets in the server node

Similar to https://github.com/grpc/grpc/pull/19624, this PR changes channelz to track listen sockets in the server node instead of in the grpc_server.

Test failures are existing / unrelated / infrastructural:
https://github.com/grpc/grpc/issues/19614
https://github.com/grpc/grpc/issues/19738


Fix PR handling

Fix the head search for PRs to use the org name, not the repo name.
Only check open PRs.
Tempalte ORG and REPO into vars to avoid typos.
Add github_api function to handle API calls.

Signed-off-by: SuperQ<EMAIL_ADDRESS>

While you are at it, can you make the branch a parameter? so we can change to main later on easily.

Done, made branch a param.


Remove: CleverFiles.DiskDrill5.2.817.0 version 5.4.842.0

Replaced by #133040

[X] Have you signed the Contributor License Agreement?
[X] Have you checked that there aren't other open pull requests for the same manifest update/change?
[X] This PR only modifies one (1) manifest
[ ] Have you validated your manifest locally with winget validate --manifest <path>?
[ ] Have you tested your manifest locally with winget install --manifest <path>?
[ ] Does your manifest conform to the 1.5 schema?

Microsoft Reviewers: Open in CodeFlow

@wingetbot run

@wingetbot run

Que?

Sequence contains no elements

Sequence contains no elements

https://github.com/microsoft/winget-pkgs/issues/133371


Question: Does v2 have HOSTED event in USERNOTICE?

I see that hosted is not specified in twitch docs https://dev.twitch.tv/docs/irc/tags#usernotice-twitch-tags how can I get hosted event as in v1?

Hosting information is provided by the HOSTTARGET command and NOTICE command tags.
Accordingly, v2 emits HOSTTARGET, NOTICE/HOST_ON and NOTICE/HOST_OFF (partially documented) events.

Oh you mean the host chat command . Try: chat.host(<channel>).
All chat commands are supported; however, what is still being developed is documentation and returning promises that resolve or reject on success or failure, respectively. For now, you will have to manually listen for the NOTICE/HOST_ON event to know if your host chat command was successful.
For example:
const host = channel => new Promise(resolve => {
  chat.once(`NOTICE/HOST_ON`, resolve)

  chat.host(channel)
})

It is planned to have the library handle this, including rejecting after timing out, command failure, or unrecognized command.

No, actually I mean https://github.com/twitch-apis/twitch-js/blob/22e1929e5522027e4de125f10c328b5d98d72f88/test/events.js#L111
I am not sure what event should I listen to have same feature in v2, but in test its PRIVMSG

Oh I understand now LOL. Yes we need this.

Reopening for auto hosted event support.

Resolved by #141.


Avoiding conditional directives that break statements

Thanks for your contribution @RomeroMalaquias. Please note that we are not actively maintaining the K20 port, but I'm happy to merge your contributions.
Thomas


Fixing some bugs...

Codecov Report

Merging #578 into master will decrease coverage by 0.1%.
The diff coverage is 23.68%.

@@            Coverage Diff             @@
##           master     #578      +/-   ##
==========================================
- Coverage   71.58%   71.48%   -0.11%
==========================================
  Files          48       48
  Lines       14731    14763      +32
==========================================
+ Hits        10545    10553       +8
- Misses       4186     4210      +24

Impacted Files
Coverage Δ

androguard/cli/__init__.py
100% <ø> (ø)
:arrow_up:

androguard/core/bytecodes/apk.py
64.1% <25%> (-0.27%)
:arrow_down:

androguard/cli/entry_points.py
87.05% <45.45%> (-3.58%)
:arrow_down:

androguard/cli/main.py
42.74% <6.66%> (-2.33%)
:arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update d93ed5d...6048e72. Read the comment docs.


programatically convert memray output into flamegraph

Is there an existing proposal for this?

[X] I have searched the existing proposals

Is your feature request related to a problem?
I want to use memray api to profile my function programatically.
I managed to write a decorator to profile a function. However, it's really inconvenient to save output in .bin format and then convert it to flamegraph or something else.
Describe the solution you'd like
I'd like there to be possibility to programmatically convert memray output (.bin file) into flamegraph and don't spit out .bin file at all.
Alternatives you considered
No response

I'd like there to be possibility to programmatically convert memray output (.bin file) into flamegraph and don't spit out .bin file at all.

Can you describe your use case in more detail? Why is having a .bin file inconvenient for you? Would using a temp file for the memray output and then removing it after you create the flamegraph be good enough for your use case?
I'm picturing something like:
import contextlib
import subprocess
import sys
import tempfile

import memray

@contextlib.contextmanager
def memory_flamegraph(destination_file):
    with tempfile.TemporaryDirectory() as tmpdir:
        capture_file = f"{tmpdir}/capture.bin"
        cmd = [
            sys.executable,
            "-m",
            "memray",
            "flamegraph",
            "-f",
            "-o",
            destination_file,
            capture_file,
        ]

        try:
            with memray.Tracker(capture_file):
                yield
        finally:
            subprocess.check_call(cmd)

And you'd then use that by doing something like:
with memory_flamegraph("./flamegraph.html"):
    do_thing1()
    do_thing2()

Ah, and you want that as a decorator. I don't think that really changes anything about the code I'm suggesting, though. You'd just update your decorator to call that memray_flamegraph context manager instead of the memray.Tracker one.

Thanks @godlygeek for providing example. That will help me a lot 🙏


The big one oh oh

The moment you've all been waiting for...

BTW -- I rebased this on master since there were two bug fixes since I issued this PR.  It's ready for re-review if anyone wants it.

Testing this now!

I found one more issue that I think requires a fix, but it's an easy fix.  So knocking this back into draft.

Alright.  This is a go!


Bug bounty?

Is there a bug bounty?
Please link to it.

We had a Code4Rena contest but that has concluded. For the active bug bounty program: https://hackerone.com/opensea


MobileApp : dashboard open : retrieve drugslist, triggerlist and symptomslist

Retrieve the information needed in the app and concat with the current items in the dataService.
Also, if a user logged in, retrieve the newest version of patient object from the database and store the information in the database. The patient object is returned when making the login call. Catch this and store the data.
Not needed when user just registered

get advice as well

Not bugging today? I remember it did bug yesterday??!! Anyway.. closed for now


[AppService] functionapp: Removed ability to create 2.x Functions in regions that don't support it

Description

This PR removed the ability to create V2 function apps in specific regions because those regions don't support it. This is a JEDI requirement.
Testing Guide

History Notes

[AppService] functionapp create: Removed ability to create 2.x Functions in regions that don't support it

This checklist is used to make sure that common guidelines for a pull request are followed.

[x] The PR title and description has followed the guideline in Submitting Pull Requests.

[x] I adhere to the Command Guidelines.

@qwordy this is a pretty small change and would love to get it into S174 if possible

@qwordy this is a pretty small change and would love to get it into S174 if possible

🆗


🚀 release: v0.1.0

Changelog
Added

Added bini-theme-aiah-color-theme variant.
Added documentation for color theme palette I used for the bini-theme-color-theme syntax.

Changed

Updated README.md file.
Bumped version to v0.1.0.
Updated the change log file to follow keep a changelog format.
Updated the readme file to include documentation which color I use for each color theme variant.

Fixed

Fixed suggestion color contrast.

Fixed #1


Add unit tests for FilterReads

the task is to enumerate test cases and implement them

Closed via #876.


Invalid argument(s): Failed to lookup symbol 'native_add': dlsym(RTLD_DEFAULT, native_add): symbol not found

help，the symbol not found，

What is your flutter version?
android or iOS?

啥系统？iOS还是Android？试过DartG711Codec吗？


Numbered wrong when migrating from jupyter-book to Sphinx

Describe the bug
context
I have built a site with jupyter-book successfully. Now I want to use the features of sphinx-book-theme so I migrate from jupyter-book to sphinx.
I use the generated conf.py with
extensions = ['sphinx_external_toc',]
external_toc_exclude_missing = True
external_toc_path = '_toc.yml'

and my _toc.yml remains the same like:
format: jb-book
root: index
parts:
  - caption: 引言
    numbered: true
    chapters:
    - file: ch-intro/index
      sections:
        - file: ch-intro/computer-architecture
        - file: ch-intro/thread-process

  - caption: Dask
    numbered: true
    chapters:
    - file: ch-dask/index
      sections:
        - file: ch-dask/dask-intro

But it turns out that it cannot continue numbers between different chapters.

Reproduce the bug
What do I need to do to fix this issue?
List your environment
sphinx_external_toc           0.3.1
sphinx-multitoc-numbering     0.1.3

I use a workaround to fix this issue:
root: index
subtrees:
- numbered: true
  entries:
  - file: ch-intro/index
    entries:
    - file: ch-intro/computer-architecture
    - file: ch-intro/thread-process
  - file: ch-dask/index
    entries:
    - file: ch-dask/dask-intro

The UI is slightly different now:

Nice workaround @luweizheng. Sorry for the delay in commenting on this.
I suspect the main issue with the first configuration is you would need to add numbered: true to the top level configuration (rather than add it to each part as the numbering resets).
https://sphinx-multitoc-numbering.readthedocs.io/en/latest/#jupyter-book-example

Nice workaround @luweizheng. Sorry for the delay in commenting on this.
I suspect the main issue with the first configuration is you would need to add numbered: true to the top level configuration (rather than add it to each part as the numbering resets).
https://sphinx-multitoc-numbering.readthedocs.io/en/latest/#jupyter-book-example

Thanks for you reply!
The conf in sphinx-multitoc-numbering is a little bit different from sphinx-external-toc. sphinx-external-toc's doc does not have part keyword.

Hi @mmcky
Are there any solutions?  sphinx-external-toc's doc does not have part keyword.


Unable to deploy latest diego release onto bosh-lite

I've been trying to install the latest release 0.1335.0 on my bosh-lite with cf release 212. Each time I run a bosh -n deploy for diego, I get the following error:
  Started binding instance vms
  Started binding instance vms > database_z1/0
  Started binding instance vms > brain_z1/0
  Started binding instance vms > cell_z1/0
  Started binding instance vms > cc_bridge_z1/0
  Started binding instance vms > route_emitter_z1/0
  Started binding instance vms > access_z1/0. Done (00:00:00)
     Done binding instance vms > cc_bridge_z1/0 (00:00:00)
     Done binding instance vms > database_z1/0 (00:00:00)
     Done binding instance vms > cell_z1/0 (00:00:00)
     Done binding instance vms > brain_z1/0 (00:00:00)
     Done binding instance vms > route_emitter_z1/0 (00:00:00)
     Done binding instance vms (00:00:00)

  Started preparing configuration > Binding configuration. Failed: Error filling in template `agent_ctl.sh.erb' for `database_z1/0' (line 31: undefined method `tr' for ["bbs", {}]:Array) (00:00:00)

Error 100: Error filling in template `agent_ctl.sh.erb' for `database_z1/0' (line 31: undefined method `tr' for ["bbs", {}]:Array)

Task 23 error

I'm not sure what should go in for the bbs configuration?
I get similar issues with cc_bridge_z1 and access_z1
bosh vms results with the following output
bosh vms
Acting as user 'admin' on 'Bosh Lite Director'
Deployment `cf-warden'

Director task 28

Task 28 done

+------------------------------------+---------+---------------+--------------+
| Job/index                          | State   | Resource Pool | IPs          |
+------------------------------------+---------+---------------+--------------+
| api_z1/0                           | running | large_z1      | <IP_ADDRESS> |
| consul_z1/0                        | running | medium_z1     | <IP_ADDRESS>  |
| doppler_z1/0                       | running | medium_z1     | <IP_ADDRESS> |
| etcd_z1/0                          | running | medium_z1     | <IP_ADDRESS>  |
| ha_proxy_z1/0                      | running | router_z1     | <IP_ADDRESS>  |
| hm9000_z1/0                        | running | medium_z1     | <IP_ADDRESS> |
| loggregator_trafficcontroller_z1/0 | running | small_z1      | <IP_ADDRESS> |
| nats_z1/0                          | running | medium_z1     | <IP_ADDRESS>   |
| postgres_z1/0                      | running | medium_z1     | <IP_ADDRESS>  |
| router_z1/0                        | running | router_z1     | <IP_ADDRESS>  |
| runner_z1/0                        | running | runner_z1     | <IP_ADDRESS>  |
| uaa_z1/0                           | running | medium_z1     | <IP_ADDRESS> |
+------------------------------------+---------+---------------+--------------+

VMs total: 12
Deployment `cf-warden-diego'

Director task 29

Task 29 done

+--------------------+---------+------------------+---------------+
| Job/index          | State   | Resource Pool    | IPs           |
+--------------------+---------+------------------+---------------+
| access_z1/0        | running | access_z1        | <IP_ADDRESS>   |
| brain_z1/0         | running | brain_z1         | <IP_ADDRESS> |
| cc_bridge_z1/0     | running | cc_bridge_z1     | <IP_ADDRESS> |
| cell_z1/0          | running | cell_z1          | <IP_ADDRESS> |
| database_z1/0      | running | database_z1      | <IP_ADDRESS> |
| route_emitter_z1/0 | running | route_emitter_z1 | <IP_ADDRESS> |

Hi, @rahulkj,
Since CF v212, there's been a change to the manifest data that cf-release's consul_agent job consumes: it used to take a list of strings, and now it takes a map of strings to sets of tags. The diego-release manifest generation templates as of v0.1317.0 now produces this updated set of consul data, but v212 of cf-release still uses the old-style list data. This means that v0.1317.0 and later of diego-release will generate manifests incompatible with CF v212.
Based on the release notes for CF v212, Diego final version v0.1304.0 is compatible, so you may consider deploying that version instead. In general, Diego creates final releases much more frequently than CF does, so there's no guarantee that the master branch of diego-release will be compatible with the master branch of cf-release. The Diego-CF compatibility record tracks which combinations of cf-release and diego-release have passed our automated testing pipeline.
Thanks,
Eric, CF Runtime Diego PM

Ah makes complete sense.
Also thanks for the compatibility record link. That would be one helpful link.
Cheers!


move service catalog to community

Connected to SixSq/tasklist#888.

After this is merged, two trivial merge conflicts will need to resolved by hand in the community to enterprise merge in the files ssclj/pom.xml and ssclj/service-catalog/build.boot.


Graceful shutdown for KVStore (cache) and analyzers

Copying old, closed issue, no action necessary
This is a follow-up to #854.
Provide a way for analyzers (and their dependencies) to receive a shutdown signal and clean up resources after themselves.
Motivated by https://github.com/oasisprotocol/oasis-indexer/pull/360#issuecomment-1522592329 and https://github.com/oasisprotocol/oasis-indexer/blob/766164fe7faea38ca2032e17a8967ecc6441f014/analyzer/aggregate_stats.go#L83-L84

Closed by https://github.com/oasisprotocol/nexus/pull/392


box: multipart upload problems

rclone fails to upload some of the larger files to Box. My observation is that it typically happens for the exact same files (1-13GB in size), but seems to succeed eventually when restarted over and over. I am unsure if it is because a certain amount of time (days/weeks) passed.
I ran four synchronisations in debugging mode today and attached all log files.
The errors slightly differ, but all mention "refresh token" or "multipart upload" errors:
after many
commit multipart upload failed
the following errors occur
ERROR : box root 'Jos/0.85': Token refresh failed: couldn't list files: Get https://api.box.com/2.0/folders/450***84/items?fields=type%2Cid%2Csequence_id%2Cetag%2Csha1%2Cname%2Csize%2Ccreated_at%2Cmodified_at%2Ccontent_created_at%2Ccontent_modified_at%2Citem_status&limit=1000&offset=0: oauth2: cannot fetch token: 400 Bad Request
Response: {“error":“invalid_grant”,“error_description”:“Refresh token has expired”}
I used to encounter the “range_overlaps_existing_part” error, but I didn't manage reproduce it today in debugging mode.
ERROR : ******.trr: Failed to copy: multipart upload failed to upload part: Error “range_overlaps_existing_part” (416): Part overlaps with previously uploaded part: {id: “15AE83DA”, “offset”:<PHONE_NUMBER>, “size”: 8388608}
rclone.log.1.txt
rclone.log.2.txt
rclone.log.3.txt
rclone.log.4.beta.txt
My details:

rclone v1.39     os/arch: linux/amd64    go version: go1.9.2 (used the beta version for the fourth attempt, see logs)
x86_64 GNU/Linux
Box.com
./rclone-v1.39-linux-amd64/rclone sync -v --max-size 15G --stats 1m /data/ box:data --exclude ".*/**"

I think there is more than one thing going on here...
In rclone.log.1.txt we see
2018/02/06 08:39:04 DEBUG : traj.trr: Cancelling multipart upload: multipart upload failed to finalize: too many tries to commit multipart upload - increase --low-level-retries
2018/02/06 08:39:04 ERROR : traj.trr: Failed to copy: multipart upload failed to finalize: too many tries to commit multipart upload - increase --low-level-retries

Which means that rclone didn't wait long enough for the file to be finalised.  It is likely that if clone had waited longer it would have worked.
On the retry we see
2018/02/06 08:44:48 DEBUG : traj.trr: Cancelling multipart upload: multipart upload failed to upload part: Put https://upload.box.com/api/2.0/files/upload_sessions/978436C11B373F25048523C8EA6E0C93: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Refresh token has expired"}

Which I think must be the token expired but multiple threads refreshed it.  The box refresh token is only valid once though so the remaining threads got this error.  That is my guess as to what is going on.
This explanation doesn't quite add up as we don't see a Saved new token in config file DEBUG message so we didn't have a success.
In rclone.log.2.txt we see the same thing with rclone not waiting long enough.
In rclone.log.3.txt we see the token expiring and the refresh not working, again withouth a Saved new token in config file message
2018/02/06 12:06:45 ERROR : box root 'Jos/hamilton/MD-AB-surface/octacube/1.0/400K/0.85': Token refresh failed: couldn't list files: Get https://api.box.com/2.0/folders/45065466784/items?fields=type%2Cid%2Csequence_id%2Cetag%2Csha1%2Cname%2Csize%2Ccreated_at%2Cmodified_at%2Ccontent_created_at%2Ccontent_modified_at%2Citem_status&limit=1000&offset=0: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Refresh token has expired"}
2018/02/06 12:06:48 DEBUG : combined.trr: Cancelling multipart upload: multipart upload failed to upload part: Put https://upload.box.com/api/2.0/files/upload_sessions/C1093086DA25A1101D0F81ABF4A1377C: oauth2: cannot fetch token: 400 Bad Request

rclone.log.4.beta.txt is the not waiting long enough problem...
Conclusion
So, I think for big files transferred to box increasing --low-level-retries is necessary.  Can you try increasing it from 10 to 100 (say) and then send a log.  Hopefully it will succeed.  I can then use that to tune the time rclone waits for a file to be re-assembled.

I used to encounter the “range_overlaps_existing_part” error, but I didn't manage reproduce it today in debugging mode.

It might be that rclone needs to retry if that happens as it does if it gets a parts_mismatch error.  Interestingly that error isn't in the docs!
If you can send a log with that happening that would be very helpful :-)

Can you have an experiment with different values of --low-level-retries?  I can't progress on this without some experimental data!

Just an FYI, I've seen the same issue. It happens more often when Box is either busy or perhaps they're scaling down for the night - generally some time in the evening, around 8pm I've had retries go up to 15.
I have ~6TB in Box right now, streaming at ~400Mbps, night time slows it down to ~160Mbps (we have 10Gbps to Box.com). I'm uploading 50TB in the next couple of days, I'll try to log what I can but upping retries does work thus far.
2018/05/10 19:57:37 DEBUG : Backup/RCBI/RCBI/auto-20180508.0300-4w/1525992712.591292: commit multipart upload failed 15/100 - trying again in 3 seconds (not ready yet)
2018/05/10 19:57:38 INFO  :
Transferred:    12 GBytes (19.481 MBytes/s)
Errors:                 0
Checks:                 0
Transferred:            0
Elapsed time:    10m30.7s
Transferring:
 *   .../auto-20180508.0300-4w/1525992712.591292: 100% /12G, 0/s, 0s

2018/05/10 19:57:41 INFO  : Backup/RCBI/RCBI/auto-20180508.0300-4w/1525992712.591292: Copied (new)
2018/05/10 19:57:42 INFO  : Backup/RCBI/RCBI/auto-20180508.0300-4w/1525992712.591292: Deleted
2018/05/10 19:57:42 INFO  :
Transferred:    12 GBytes (19.376 MBytes/s)
Errors:                 0
Checks:                 1
Transferred:            1
Elapsed time:    10m34.1s

2018/05/10 19:57:42 DEBUG : 6 go routines active
2018/05/10 19:57:42 DEBUG : rclone: Version "v1.41" finishing with parameters ["rclone" "-vvvv" "--stats=30s" "--transfers=16" "--low-level-retries=100" "--exclude=tapedev" "--exclude=lastsnap" "--buffer-size=64M" "move" "/mnt/Backup/tapes" "URBox:/ZFS-SEND/"]
root@zombie:/mnt/Backup/ZFS2rclone #

Hi Nick, my name is Johannes, I work for Box. I found this entry via Google after not being able to find any errors on the Box side, although the downloads still failed for certain larger files. I followed your recommendation and increased the low level retries to 100 and that seems to have fixed the issue.
I also wrote you a message on Linkedin, maybe you have time to read it.

Nice to hear from you Johannes @jmfrank63 .
The default for --low-level-retries is 10, which isn't quite enough time to be sure box has re-assembled the parts.
I'd like to find the minimum value of --low-level-retries which produces a reliable result - could you help with that?
Then I can tune rclone's retries accordingly.

Hi Nick, no problem, I'll find it, I guess the perfect example for a binary
tree approach ;-)
On Wed, Jul 4, 2018 at 5:31 PM Nick Craig-Wood<EMAIL_ADDRESS>wrote:

Nice to hear from you Johannes @jmfrank63 https://github.com/jmfrank63 .
The default for --low-level-retries is 10, which isn't quite enough time
to be sure box has re-assembled the parts.
I'd like to find the minimum value of --low-level-retries which produces
a reliable result - could you help with that?
Then I can tune rclone's retries accordingly.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/ncw/rclone/issues/2054#issuecomment-402522592, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AC8oHvgDJIHsbdH_Kdrg-SbtDhatI52Pks5uDO3jgaJpZM4R7RV7
.

Here is a spreadsheet with the number of retries for each file and time intervals it says it will retry it at:
https://rochester.box.com/s/83xba8qt303uezjj846fkh46sgwf87vt
You can try making some histograms and predictions.
The maximum number I got was 13, no failures. This was a 5.85 TB transfer for 456 items.

@guruevi that is really useful thank you.
I at the moment the number of retries is --low-level-retries which is 10 by default.  I was thinking I'd multiply that by 2 so the default number of retries is 20, but the user still has some control over it by adjusting --low-level-retries.
20 seems like a safe margin over 14.
What does everybody think about this approach?  I don't really want to make yet another parameter for rclone if I don't have to!

OK, what I've decided to do is make the minimum value 20, but if you set --low-level-retries larger than that, then it will use that value instead.
I've done this in
https://beta.rclone.org/branch/v1.42-029-g74ab37f7-fix-2054-box-upload/ (uploaded in 15-30 mins)
Can you give it a quick test and if it looks good I'll merge it.

Hi Nick,
just bumped in a file with little over 4GB that did not upload with 20 retries. To make sure it is 20 that is failing I added the parameter and set the value explicitly to 20, and it still failed.
I tried to upload with 30 retries and it still failed, but it succeeded with 100. I did not take the time in seconds however. Do you know what a retry is worth in time?
Additionally I noticed the help text still identifies 10 as the default as well as rclone browser does (might not be your problem though).
With 100 I would like to do a little more investigation why this is taking so long and what the possible problem might be. As I work in User Services I would like to open a ticket on your behalf. May I use your support email address given for rclone?
Thanks Johannes

@jmfrank63 Thanks for testing.

just bumped in a file with little over 4GB that did not upload with 20 retries. To make sure it is 20 that is failing I added the parameter and set the value explicitly to 20, and it still failed.

Hmm...

I tried to upload with 30 retries and it still failed, but it succeeded with 100. I did not take the time in seconds however. Do you know what a retry is worth in time?

The server sends a time the client should retry so it depends...  If the server doesn't send a time then each retry takes 10s.
If you run with -vv you can see the retries happening.

Additionally I noticed the help text still identifies 10 as the default as well as rclone browser does (might not be your problem though).

I haven't changed the value for --low-level-retries is that what you mean?  That controls a whole lot of other retry things.  The retries value for the box upload finalization doesn't have its own parameter (though it could).

With 100 I would like to do a little more investigation why this is taking so long and what the possible problem might be. As I work in User Services I would like to open a ticket on your behalf. May I use your support email address given for rclone?

Yes by all means use<EMAIL_ADDRESS>to open a ticket.
I'm wondering whether we need something similar to the flag we put in for Amazon Drive:
  --acd-upload-wait-per-gb duration     Additional time per GB to wait after a failed complete upload to see if it appears. (default 3m0s)

I think this is the same problem - the assembly of all the parts of a big file takes some time, the bigger the file, the more time.
It might be that I should set the number of retries really large (say 100).  The max retries protects against things getting in a loop, but if box is still responding sensibly to the requests then there is an argument to say rclone should carry on trying.

I've made the new flag and defaulted it to 100 here
https://beta.rclone.org/v1.42-099-g751bfd45/ (uploaded in 15-30 mins)
This will be in the latest beta and in v1.43


MSID: 96496 Version: 1 DOI: 10.1101/2<IP_ADDRESS>9048

MSID: 96496
Version: 1
Preprint DOI: https://doi.org/10.1101/2<IP_ADDRESS>9048
Step 1. Awaiting reviews
Editorial to post reviews via hypothesis
Useful links:

DocMap: https://data-hub-api.elifesciences.org/enhanced-preprints/docmaps/v2/by-publisher/elife/get-by-manuscript-id?manuscript_id=96496
New model tracking: https://docs.google.com/spreadsheets/d/1_fHaoOy7hjyocptKtVJRijeNpUY4hBS7Ck_aVmx6ZJk/
Reviews on sciety: https://sciety.org/articles/activity/10.1101/2<IP_ADDRESS>9048

For trouble shooting (e.g. no Docmaps available):

DocMap issue addressing: https://miro.com/app/board/uXjVNCwK6EI=/
Explore DataHub DocMaps API: https://lookerstudio.google.com/reporting/4c2f0368-babb-4beb-b5b3-497e7e7b0f08/page/ejphD
Unmatched submissions and preprints: https://lookerstudio.google.com/u/0/reporting/9f86204f-3bf7-477c-9b18-5c5ef141bf69/page/p_gxi57ha93c
Unmatched manuscripts spreadsheet: https://docs.google.com/spreadsheets/d/15QcK8w-ssB7109RQEDtFpJPZ0J5HTGxoHa_2TtpMBbg/edit#gid=1336081641

Step 2. Preview reviewed preprint
Production QC content ahead of publication
Instructions:

QC preview: https://prod--epp.elifesciences.org/previews/96496v1
Update ticket with any problems (add blocked label)
When QC OK, add QC OK label to ticket and add publication date and time to https://docs.google.com/spreadsheets/d/1amAlKvdLcaDp5W8Z8g77NmkwbMF5n_u89ArSqPMO8jg
Move card to next column
(At end of the day post link in #enhanced-preprint and ask for PDF to be generated)

Useful links:

Preprint DOI :  https://doi.org/10.1101/2<IP_ADDRESS>9048
Confirm reviews returned by EPP: https://prod--epp.elifesciences.org/api/reviewed-preprints/96496/v1/reviews
To update the MECA path in the docmap: https://docs.google.com/spreadsheets/d/1mctCQuNFBjSn97Lihy7_vBO6z7-N-oqyLv4clyi6zHg

Step 3: Awaiting search reindex
This step adds the reviewed preprint to the homepage: https://elifesciences.org
The search reindex is triggered once an hour. We need the reviewed preprint to be indexed as the search application serves the journal homepage.
Useful links:

Jenkins pipeline to reindex search can be triggered sooner or monitored here: https://alfred.elifesciences.org/job/process/job/process-reindex-reviewed-preprints/

Step 4: Published! PDF requested
Waiting for PDF to be generated
Useful links:

PDF tracking: https://docs.google.com/spreadsheets/d/106_XeDjmuBae7gexOTNzg60lapeqjl2aRn9DzupGyS8/

Step 5: Introduce PDF to data folder and git repo
Upload PDF to relevent folder in git repo https://github.com/elifesciences/enhanced-preprints-data/
Step 6: Done!

[ ] Kettle is on!

Reloading to fix missing bracket in reference


Fallback to git describe output if no VERSION files provided

Signed-off-by: Sylvain Rabot<EMAIL_ADDRESS>

lgtm!

I don't see a linked issue, what's the use case for this?

No there is no issue, I made this quickly because on Thanos after a tagged version they append '-master' to the tag in the VERSION file and I thought removing this file completely and using git describe as input for the Version in the build would be more meaningful.

What do you think @SuperQ  ?

I'm not sure this makes sense for promu. I guess we haven't really specified the intended behavior here.

FWIW this is how I've done automation on all projects where I've used promu (although as part of the build steps rather than inside promu itself). For the workflows where I've been involved, checking in the VERSION file doesn't really fit in, and has resulted in wrong versions being written in due to forgetting to bump the file.

The consensus on prometheus-developers says yes.


[firebase_analytics]: Crashlytics doesn't track screen view breadcrumbs

Is there an existing issue for this?

[X] I have searched the existing issues.

Which plugins are affected?
Analytics, Crashlytics
Which platforms are affected?
Android, iOS (not sure about iOS since some reports containing breadcrumbs)
Description
It seems logScreenView method doesn't track navigation changes. In the crashlytics reports breadcrumbs tab is empty
Reproducing the issue
FirebaseAnalytics.instance.logScreenView(screenName: 'some_screen_name');
FirebaseCrashlytics.instance.recordError('Some message', null);

Firebase Core version
2.29.0
Flutter Version
3.19.6
Relevant Log Output
No response
Flutter dependencies

Expand Flutter dependencies snippet

Replace this line with the contents of your `flutter pub deps -- --style=compact`.

Additional context and comments
It seems Dart plugin uses following code to log screen views
_delegate.logEvent(
      name: 'screen_view',
      parameters: filterOutNulls(<String, Object?>{
        _SCREEN_CLASS: screenClass,
        _SCREEN_NAME: screenName,
        if (parameters != null) ...parameters,
      }),
      callOptions: callOptions,
    );

Where _SCREEN_CLASS is screen_class and _SCREEN_NAME is screen_name
While according to the documentation it should be
await FirebaseAnalytics.instance.logEvent(
  name: 'screen_view',
  parameters: {
    'firebase_screen': screenName,
    'firebase_screen_class': screenClass,
  },
);

Firebase doc - https://firebase.google.com/docs/analytics/screenviews?authuser=0&hl=en#manually_track_screens
GA4 doc - https://support.google.com/analytics/answer/9234069#screen_view
Which kind of strange, since native SDK docs say that the current code in logScreenView is accurate 🤔

@TarekkMA it seems it's not, I'm getting following message
E/FA      (31087): Name starts with reserved prefix. Type, name: event param, firebase_screen

I guess firebase_screen and firebase_screen_class is for web only. Since the value of the AnalyticsParameterScreenName in swift and  FirebaseAnalytics.Param.SCREEN_NAME for java/kotlin doesn't have the firebase prefix.

maybe, but it's quite confusing, since GA4 says it's for app, and Firebase docs having exact this codesnipet for Flutter

ok, so I think it seems the issue is with com.google.gms.google-services.
GA doesn't work when app uses google-services v4.4.x, I'm see message like Missing google_app_id. in console.
Downgrading it to 4.3.x seems fixes GA reports as well as breadcrumbs in Crashlytics
P.S still trying to confirm that breadcrumbs working on iOS though

so on iOS this code send screen view events, but doesn't record screen name
await FirebaseAnalytics.instance.logEvent(
  name: 'screen_view',
  parameters: {
    'firebase_screen': screenName,
    'firebase_screen_class': screenClass,
  },
);

but logScreenView seems works fine in my debug code 🤔 need more time to track our prod logs to understand if works stable enough, since for now I see that not all of our error events having breadcrumbs from some reason

Thank you for the update

small update. After downgrading google-services version android breadcrumbs it seems reported. Strange thing though that for iOS not every report contains breadcrumbs. The majority of them do, but not all of them. And for now I don't know the reason why

@TatsuUkraine Hello, can you try to update Flutter and FlutterFire, then try again to see if the issue still happens?

@TarekkMA hello, we did the release 2 weeks ago with most up to date versions at that time, and I still see that some reports from iOS devices don't have Breadscrumbs, not a lot, and I still haven't figure the reason

@TatsuUkraine
I don't think this issue is related to the Flutter side of FlutterFire. It might be related to the native iOS SDK (https://github.com/firebase/firebase-ios-sdk) or the server side. Could you try contacting Firebase support regarding this issue?


Add bump.sh to the tooling page

Hi there !
We have officially added AsyncAPI support to Bump (https://bump.sh), so maybe you could add it to https://www.asyncapi.com/docs/tooling/#docgens now?
Tell me if you need a description or more information.
Best,
Sébastien

Absolutely! Please feel free to add it here: https://github.com/asyncapi/asyncapi.github.io/blob/master/content/docs/tooling.md.
Maybe we have to create a new category for SaaS offerings?

Do you think it could be better to keep the actual categories, but rename the "Language/framework" column into "Language/Type" (or any better label than "type")? It's the way it's done on https://openapi.tools.
My point is that if you create a new category, you'll fill it with tools from all the others categories, and I'm not sure that's the best for readability/understandability.
@fmvilas, do you have any opinion on this?

Agree. It would be better for readability. What about "Kind" instead of "Type". I'm worried people might thing about "types" in programming languages 😄


Add github.autoAlias flag to now.json

This flag will stop aliasing automatically on the default branch.

Taking this in since this is crucial for the GitHub integration. (Local dev)

How is this different than https://github.com/zeit/schemas/pull/29?

@TooTallNate it's does the same thing. But aliasing was a bad name.


Add Filtering

Should be able to filter exceptions that are reported. Will only apply to ASP.NET Core Filtering

Basic blacklisting support was added in 0.4.0, more support should be added as individual issues.


[Feature] Add more functionality in Fraction Calculator

Description
Fraction Converter Calculator
A Fraction Converter Calculator is a specialized tool designed specifically for converting fractions into their various forms: mixed fractions, proper fractions, and improper fractions. This calculator simplifies the process of understanding and working with different types of fractions by allowing users to input a fraction and instantly see its equivalent in other forms.
Screenshots
No response
Checklist

[X] I have checked the existing issues.
[X] I follow Contributing Guidelines of this project.
[X] I am a GSSOC'24 contributor.
[ ] I am a IWOC'24 contributor.
[ ] I am a JWOC'24 contributor.
[ ] I am a SWOC'24 contributor.

Code of Conduct

[X] I agree to follow this project's "Code of Conduct".

This will one convert fraction to sine other kind of fraction?
Consider conversion to other formats as well and tell if it's real or not as well

@jessicachawla I don't think I fully understand what you were saying about… Could you tell me a bit more?

Instead of changing just to other kinds of fractions, consider converting to decimals and in the output telling if the input is a real number or not. Please lmk if you have any other doubts

ok @jessicachawla

We already have Fraction-Calculator, can you integrate your functionality to the existing calculator only @Dark-S8uL

@Rakesh9100 Yes, I will do it

@Rakesh9100 Assign this issue to me.

Okay, go ahead @Dark-S8uL

Pls provide your PR @Dark-S8uL


[BUG] Properties marked nullable in swagger file are not nullable in generated output

Describe the bug
I have a property on line 18748 of this swagger file like so:
"limit": {
    "type": "number",
    "format": "double",
    "description": "For `credit`-type accounts, this represents the credit limit.\n\nFor `depository`-type accounts, this represents the pre-arranged overdraft limit, which is common for current (checking) accounts in Europe.\n\nIn North America, this field is typically only available for `credit`-type accounts.",
    "nullable": true
},

The generated output for this property is:
limit: (json['limit'] as num).toDouble(),

For reference, this is part of the AccountBalance model:
AccountBalance _$AccountBalanceFromJson(Map<String, dynamic> json) =>
    AccountBalance(
      available: (json['available'] as num).toDouble(),
      current: (json['current'] as num).toDouble(),
      limit: (json['limit'] as num).toDouble(),
      isoCurrencyCode: json['iso_currency_code'] as String,
      unofficialCurrencyCode: json['unofficial_currency_code'] as String,
      lastUpdatedDatetime: json['last_updated_datetime'] == null
          ? null
          : DateTime.parse(json['last_updated_datetime'] as String),
    );

When I try to deserialize the server response, it fails because Null is not a subtype of num.
Expected behavior
The generated output should allow the limit property (and other properties marked null) to be null.
Swagger specification link
Link to swagger/OpenApi documentation
Library version used:
master branch on commit b9ecb611312ca83e8a4dc8310edb67ad4a7d2789 (v2.8.7)
Additional Info:
I suspect the issue might be on this line:
..isNullable = (json[kIsNullable] ?? json[kIsNullable] ?? false) as bool;
It appears to me like the intention was to handle both "x-nullable" and "nullable" cases but accidentally is checking "x-nullable" twice.
Patching this results in this output:
AccountBalance _$AccountBalanceFromJson(Map<String, dynamic> json) =>
    AccountBalance(
      available: (json['available'] as num?)?.toDouble(),
      current: (json['current'] as num?)?.toDouble(),
      limit: (json['limit'] as num?)?.toDouble(),
      isoCurrencyCode: json['iso_currency_code'] as String?,
      unofficialCurrencyCode: json['unofficial_currency_code'] as String?,
      lastUpdatedDatetime: json['last_updated_datetime'] == null
          ? null
          : DateTime.parse(json['last_updated_datetime'] as String),
    );

While this fixes the case that started this ticket, it did not fix a similar issue with the component on line 18570 as references from line 43202:
            "PlaidError": {
                "description": "We use standard HTTP response codes for success and failure notifications, and our errors are further classified by `error_type`. In general, 200 HTTP codes correspond to success, 40X codes are for developer- or user-related failures, and 50X codes are for Plaid-related issues. An Item with a non-`null` error object will only be part of an API response when calling `/item/get` to view Item status. Otherwise, error fields will be `null` if no error has occurred; if an error has occurred, an error code will be returned instead.",
                "type": "object",
                "additionalProperties": true,
                "title": "Error",
                "nullable": true,
                "properties": {
                    "error_type": {
                        "$ref": "#/components/schemas/PlaidErrorType"
                    },
...

Reference to the component:
                    "error": {
                        "$ref": "#/components/schemas/PlaidError"
                    },

Hi! I have the same problem starting from version 2.8.4... By the moment, i rollback to version 2.8.3

@point-source  Could you please share swagger of AccountBalance?

@Vovanella95 I did. It's right there where it says "Link to Swagger".
But here's another link just in case: https://raw.githubusercontent.com/plaid/plaid-openapi/master/2020-09-14.yml
I just converted it to json with a yaml to json converter online.

@point-source  cool, will take a look!

As best I can tell, the second example in my post is because referenced models which have a nullable flag are not marked nullable. Line 684 of swagger_models_generator.dart should be handling this but the prop.isNullable flag is not properly set at the time that line is executed.

@point-source will you be able to provide a pull request with a fix?

Sadly not. I was only able to fix the first issue but not the second. I don't understand this library well enough to close the entire ticket. I can still open a PR though if you want to pull in the bit that I did do. Perhaps with some guidance on where to look I can help with the rest?

Is there any other way I can help with this?

@point-source  sorry no updates for now. Will take a look into it this week. Thanks for patience!


"<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-integration-mirror/*",
                            "arn:aws:s3:::govuk-integration-mirror",
                        ]
                        Sid       = "S3PingdomReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/31",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/31",
                                    "<IP_ADDRESS>/25",
                                    "<IP_ADDRESS>/29",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-integration-mirror/*",
                            "arn:aws:s3:::govuk-integration-mirror",
                        ]
                        Sid       = "S3OfficeReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>",
                                    "<IP_ADDRESS>",
                                    "<IP_ADDRESS>",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-integration-mirror/*",
                            "arn:aws:s3:::govuk-integration-mirror",
                        ]
                        Sid       = "S3NATInternalReadBucket"
                    },
                  - {
                      - Action    = "s3:GetObject"
                      - Effect    = "Allow"
                      - Principal = {
                          - AWS = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ECYBUJ384DO2P"
                        }
                      - Resource  = "arn:aws:s3:::govuk-integration-mirror/*"
                      - Sid       = ""
                    },
                  - {
                      - Action    = "s3:ListBucket"
                      - Effect    = "Allow"
                      - Principal = {
                          - AWS = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ECYBUJ384DO2P"
                        }
                      - Resource  = "arn:aws:s3:::govuk-integration-mirror"
                      - Sid       = ""
                    },
                    {
                        Action    = [
                            "s3:ListBucket",
                            "s3:GetObject",
                        ]
                        Effect    = "Allow"
                        Principal = {
                            AWS = "arn:aws:iam::210287912431:root"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-integration-mirror/*",
                            "arn:aws:s3:::govuk-integration-mirror",
                        ]
                        Sid       = "CrossAccountAccess"
                    },
                ]
                Version   = "2012-10-17"
            }
        )
    }

Plan: 0 to add, 1 to change, 4 to destroy.

Staging
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place
  - destroy

Terraform will perform the following actions:

  # aws_cloudfront_origin_access_identity.mirror_access_identity will be destroyed
  - resource "aws_cloudfront_origin_access_identity" "mirror_access_identity" {
      - caller_reference                = "2019-07-23T16:42:23.499533+01:00" -> null
      - cloudfront_access_identity_path = "origin-access-identity/cloudfront/EAX60X9A9ZXTX" -> null
      - comment                         = "S3 WWW" -> null
      - etag                            = "EHO38OASLLBX" -> null
      - iam_arn                         = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAX60X9A9ZXTX" -> null
      - id                              = "EAX60X9A9ZXTX" -> null
      - s3_canonical_user_id            = "eee5683dcf46aa84f816b272b08bc79fcb221b1711c967a845ec1a6b4654014504ac3d02951f821d1e93cb81debfa035" -> null
    }

  # aws_iam_policy_attachment.basic_lambda_attach will be destroyed
  - resource "aws_iam_policy_attachment" "basic_lambda_attach" {
      - groups     = [] -> null
      - id         = "basic-lambda-attachment" -> null
      - name       = "basic-lambda-attachment" -> null
      - policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" -> null
      - roles      = [
          - "basic_lambda_role",
        ] -> null
      - users      = [] -> null
    }

  # aws_iam_role.basic_lambda_role will be destroyed
  - resource "aws_iam_role" "basic_lambda_role" {
      - arn                   = "arn:aws:iam::696911096973:role/basic_lambda_role" -> null
      - assume_role_policy    = jsonencode(
            {
              - Statement = [
                  - {
                      - Action    = "sts:AssumeRole"
                      - Effect    = "Allow"
                      - Principal = {
                          - Service = [
                              - "edgelambda.amazonaws.com",
                              - "lambda.amazonaws.com",
                            ]
                        }
                    },
                ]
              - Version   = "2012-10-17"
            }
        ) -> null
      - create_date           = "2019-07-23T15:40:43Z" -> null
      - force_detach_policies = false -> null
      - id                    = "basic_lambda_role" -> null
      - managed_policy_arns   = [
          - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
        ] -> null
      - max_session_duration  = 3600 -> null
      - name                  = "basic_lambda_role" -> null
      - path                  = "/" -> null
      - tags                  = {} -> null
      - tags_all              = {} -> null
      - unique_id             = "AROA2EQZDNSGXU375VIHX" -> null

      - inline_policy {}
    }

  # aws_lambda_function.url_rewrite will be destroyed
  - resource "aws_lambda_function" "url_rewrite" {
      - architectures                  = [
          - "x86_64",
        ] -> null
      - arn                            = "arn:aws:lambda:us-east-1:696911096973:function:url_rewrite" -> null
      - filename                       = "./../../lambda/CloudfrontUrlRewrite/CloudfrontUrlRewrite.zip" -> null
      - function_name                  = "url_rewrite" -> null
      - handler                        = "index.handler" -> null
      - id                             = "url_rewrite" -> null
      - invoke_arn                     = "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:696911096973:function:url_rewrite/invocations" -> null
      - last_modified                  = "2023-05-16T17:15:13.000+0000" -> null
      - layers                         = [] -> null
      - memory_size                    = 128 -> null
      - package_type                   = "Zip" -> null
      - publish                        = false -> null
      - qualified_arn                  = "arn:aws:lambda:us-east-1:696911096973:function:url_rewrite:2" -> null
      - reserved_concurrent_executions = -1 -> null
      - role                           = "arn:aws:iam::696911096973:role/basic_lambda_role" -> null
      - runtime                        = "nodejs18.x" -> null
      - source_code_hash               = "+vFI6qPE/YFxF3hcXc3ZdFvCCvwiamJhPZBaLBZA8bo=" -> null
      - source_code_size               = 675 -> null
      - tags                           = {} -> null
      - tags_all                       = {} -> null
      - timeout                        = 3 -> null
      - version                        = "2" -> null

      - timeouts {}

      - tracing_config {
          - mode = "PassThrough" -> null
        }
    }

  # aws_s3_bucket_policy.govuk_mirror_read_policy will be updated in-place
  ~ resource "aws_s3_bucket_policy" "govuk_mirror_read_policy" {
        bucket = "govuk-staging-mirror"
        id     = "govuk-staging-mirror"
      ~ policy = jsonencode(
          ~ {
              ~ Statement = [
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/24",
                                    "<IP_ADDRESS>/23",
                                    "<IP_ADDRESS>/24",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/17",
                                    "<IP_ADDRESS>/18",
                                    "<IP_ADDRESS>/17",
                                    "<IP_ADDRESS>/16",
                                    "<IP_ADDRESS>/18",
                                    "<IP_ADDRESS>/17",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/18",
                                    "<IP_ADDRESS>/22",
                                    "<IP_ADDRESS>/16",
                                    "<IP_ADDRESS>/21",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/22",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-staging-mirror/*",
                            "arn:aws:s3:::govuk-staging-mirror",
                        ]
                        Sid       = "S3FastlyReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-staging-mirror/*",
                            "arn:aws:s3:::govuk-staging-mirror",
                        ]
                        Sid       = "S3PingdomReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/31",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/31",
                                    "<IP_ADDRESS>/25",
                                    "<IP_ADDRESS>/29",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-staging-mirror/*",
                            "arn:aws:s3:::govuk-staging-mirror",
                        ]
                        Sid       = "S3OfficeReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>",
                                    "<IP_ADDRESS>",
                                    "<IP_ADDRESS>",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-staging-mirror/*",
                            "arn:aws:s3:::govuk-staging-mirror",
                        ]
                        Sid       = "S3NATInternalReadBucket"
                    },
                  - {
                      - Action    = "s3:GetObject"
                      - Effect    = "Allow"
                      - Principal = {
                          - AWS = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAX60X9A9ZXTX"
                        }
                      - Resource  = "arn:aws:s3:::govuk-staging-mirror/*"
                      - Sid       = ""
                    },
                  - {
                      - Action    = "s3:ListBucket"
                      - Effect    = "Allow"
                      - Principal = {
                          - AWS = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAX60X9A9ZXTX"
                        }
                      - Resource  = "arn:aws:s3:::govuk-staging-mirror"
                      - Sid       = ""
                    },
                    {
                        Action    = [
                            "s3:ListBucket",
                            "s3:GetObject",
                        ]
                        Effect    = "Allow"
                        Principal = {
                            AWS = "arn:aws:iam::210287912431:root"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-staging-mirror/*",
                            "arn:aws:s3:::govuk-staging-mirror",
                        ]
                        Sid       = "CrossAccountAccess"
                    },
                ]
                Version   = "2012-10-17"
            }
        )
    }

Plan: 0 to add, 1 to change, 4 to destroy.

Production
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place
  - destroy

Terraform will perform the following actions:

  # aws_cloudfront_origin_access_identity.mirror_access_identity will be destroyed
  - resource "aws_cloudfront_origin_access_identity" "mirror_access_identity" {
      - caller_reference                = "1561126049469" -> null
      - cloudfront_access_identity_path = "origin-access-identity/cloudfront/E3LJ8XG3FNTB59" -> null
      - comment                         = "S3 WWW" -> null
      - etag                            = "E1AQPDSA42Z9ZK" -> null
      - iam_arn                         = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3LJ8XG3FNTB59" -> null
      - id                              = "E3LJ8XG3FNTB59" -> null
      - s3_canonical_user_id            = "131c8d88ee064f1b95ca173c8cad5ff9034f5e9e9d0019de1a7c08d1c64077fe46aa8c9498505f2ca062219e54ddb163" -> null
    }

  # aws_iam_policy_attachment.basic_lambda_attach will be destroyed
  - resource "aws_iam_policy_attachment" "basic_lambda_attach" {
      - groups     = [] -> null
      - id         = "basic-lambda-attachment" -> null
      - name       = "basic-lambda-attachment" -> null
      - policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" -> null
      - roles      = [
          - "basic_lambda_role",
        ] -> null
      - users      = [] -> null
    }

  # aws_iam_role.basic_lambda_role will be destroyed
  - resource "aws_iam_role" "basic_lambda_role" {
      - arn                   = "arn:aws:iam::172025368201:role/basic_lambda_role" -> null
      - assume_role_policy    = jsonencode(
            {
              - Statement = [
                  - {
                      - Action    = "sts:AssumeRole"
                      - Effect    = "Allow"
                      - Principal = {
                          - Service = [
                              - "lambda.amazonaws.com",
                              - "edgelambda.amazonaws.com",
                            ]
                        }
                    },
                ]
              - Version   = "2012-10-17"
            }
        ) -> null
      - create_date           = "2019-07-12T16:27:00Z" -> null
      - force_detach_policies = false -> null
      - id                    = "basic_lambda_role" -> null
      - managed_policy_arns   = [
          - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
        ] -> null
      - max_session_duration  = 3600 -> null
      - name                  = "basic_lambda_role" -> null
      - path                  = "/" -> null
      - tags                  = {} -> null
      - tags_all              = {} -> null
      - unique_id             = "AROASQDMCZ2EWVU2Y3WNA" -> null

      - inline_policy {}
    }

  # aws_lambda_function.url_rewrite will be destroyed
  - resource "aws_lambda_function" "url_rewrite" {
      - architectures                  = [
          - "x86_64",
        ] -> null
      - arn                            = "arn:aws:lambda:us-east-1:172025368201:function:url_rewrite" -> null
      - filename                       = "./../../lambda/CloudfrontUrlRewrite/CloudfrontUrlRewrite.zip" -> null
      - function_name                  = "url_rewrite" -> null
      - handler                        = "index.handler" -> null
      - id                             = "url_rewrite" -> null
      - invoke_arn                     = "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:172025368201:function:url_rewrite/invocations" -> null
      - last_modified                  = "2023-05-16T16:51:58.000+0000" -> null
      - layers                         = [] -> null
      - memory_size                    = 128 -> null
      - package_type                   = "Zip" -> null
      - publish                        = false -> null
      - qualified_arn                  = "arn:aws:lambda:us-east-1:172025368201:function:url_rewrite:5" -> null
      - reserved_concurrent_executions = -1 -> null
      - role                           = "arn:aws:iam::172025368201:role/basic_lambda_role" -> null
      - runtime                        = "nodejs18.x" -> null
      - source_code_hash               = "+vFI6qPE/YFxF3hcXc3ZdFvCCvwiamJhPZBaLBZA8bo=" -> null
      - source_code_size               = 675 -> null
      - tags                           = {} -> null
      - tags_all                       = {} -> null
      - timeout                        = 3 -> null
      - version                        = "5" -> null

      - timeouts {}

      - tracing_config {
          - mode = "PassThrough" -> null
        }
    }

  # aws_s3_bucket_policy.govuk_mirror_read_policy will be updated in-place
  ~ resource "aws_s3_bucket_policy" "govuk_mirror_read_policy" {
        bucket = "govuk-production-mirror"
        id     = "govuk-production-mirror"
      ~ policy = jsonencode(
          ~ {
              ~ Statement = [
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/24",
                                    "<IP_ADDRESS>/23",
                                    "<IP_ADDRESS>/24",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/17",
                                    "<IP_ADDRESS>/18",
                                    "<IP_ADDRESS>/17",
                                    "<IP_ADDRESS>/16",
                                    "<IP_ADDRESS>/18",
                                    "<IP_ADDRESS>/17",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/18",
                                    "<IP_ADDRESS>/22",
                                    "<IP_ADDRESS>/16",
                                    "<IP_ADDRESS>/21",
                                    "<IP_ADDRESS>/20",
                                    "<IP_ADDRESS>/22",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-production-mirror/*",
                            "arn:aws:s3:::govuk-production-mirror",
                        ]
                        Sid       = "S3FastlyReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-production-mirror/*",
                            "arn:aws:s3:::govuk-production-mirror",
                        ]
                        Sid       = "S3PingdomReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/31",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/31",
                                    "<IP_ADDRESS>/25",
                                    "<IP_ADDRESS>/29",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-production-mirror/*",
                            "arn:aws:s3:::govuk-production-mirror",
                        ]
                        Sid       = "S3OfficeReadBucket"
                    },
                    {
                        Action    = "s3:GetObject"
                        Condition = {
                            IpAddress = {
                                aws:SourceIp = [
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>/32",
                                    "<IP_ADDRESS>",
                                    "<IP_ADDRESS>",
                                    "<IP_ADDRESS>",
                                ]
                            }
                        }
                        Effect    = "Allow"
                        Principal = {
                            AWS = "*"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-production-mirror/*",
                            "arn:aws:s3:::govuk-production-mirror",
                        ]
                        Sid       = "S3NATInternalReadBucket"
                    },
                  - {
                      - Action    = "s3:GetObject"
                      - Effect    = "Allow"
                      - Principal = {
                          - AWS = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3LJ8XG3FNTB59"
                        }
                      - Resource  = "arn:aws:s3:::govuk-production-mirror/*"
                      - Sid       = ""
                    },
                  - {
                      - Action    = "s3:ListBucket"
                      - Effect    = "Allow"
                      - Principal = {
                          - AWS = "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3LJ8XG3FNTB59"
                        }
                      - Resource  = "arn:aws:s3:::govuk-production-mirror"
                      - Sid       = ""
                    },
                    {
                        Action    = [
                            "s3:ListBucket",
                            "s3:GetObject",
                        ]
                        Effect    = "Allow"
                        Principal = {
                            AWS = "arn:aws:iam::210287912431:root"
                        }
                        Resource  = [
                            "arn:aws:s3:::govuk-production-mirror/*",
                            "arn:aws:s3:::govuk-production-mirror",
                        ]
                        Sid       = "CrossAccountAccess"
                    },
                ]
                Version   = "2012-10-17"
            }
        )
    }

Plan: 0 to add, 1 to change, 4 to destroy.


Add getSupervisorState device method

HQ: balena-io/balena#1663
Change-type: minor
Signed-off-by: Matthew McGinn<EMAIL_ADDRESS>

Looks great and only requesting coding style & docs changes to keep it consistent with the rest of the code +1
Please also add:
* some typing for this method in `typings/balena-sdk.d.ts`

* a test case in the `tests/integration/models/device.spec.coffee` under the `'given a single application with a single offline device'` section, so that we can document somewhat how a response from that endpoint looks like, even if in this case the request gets rejected since the device isn't actually real.

Done. I also decided to treat the inaccessible device as a BalenaDeviceNotFound to be consistent with other sdk methods.

@resin-ci retest

@xginn8 instead of retest isn't going to help here.
You need to open the appveyor check and click restart.

Let me try this once.

The requires tests have passed @xginn8 . Feel free to merge this :+1: