-
Notifications
You must be signed in to change notification settings - Fork 1
PSMDB-1776: Adding Kerberos Docker Role #449
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
217 commits
Select commit
Hold shift + click to select a range
8703edd
Adding docker role for Debian and RedHat
keithquinnpercona 119dc16
Removing uneeded runc installation and cleanup
keithquinnpercona 1b38a98
Readding accidently deleted tasks
keithquinnpercona 9e20695
Cleanup
keithquinnpercona c98afd4
Adding blank lines to the bottom of the file
keithquinnpercona 7edf5d6
Adding blank lines to the bottom of the file
keithquinnpercona 0ea9fe5
Merge branch 'PSMDB-1771' of github.com:Percona-QA/psmdb-testing into…
keithquinnpercona 6149a16
Adding Easyrsa role
keithquinnpercona d52fdcc
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona 80a6a9f
Cleanup
keithquinnpercona a90b853
Adding Easy-rsa ansible tasks
keithquinnpercona e16ebba
Cleanup
keithquinnpercona baa79a5
Cleanup
keithquinnpercona 28aa855
Updating roles for psmdb tests
keithquinnpercona 42f87e7
Removing task to move binary
keithquinnpercona 9d4671b
Updating the docker APT repo to accomodate Ubuntu
keithquinnpercona 636c4b8
Updating Docker to work with Ubuntu
keithquinnpercona 3924afa
Cleanup and testing a fix for broken RHEL9
keithquinnpercona 2916f2f
Cleanup
keithquinnpercona 7018426
Adding initial openldap changes
keithquinnpercona a119632
Testing
keithquinnpercona 1c58a37
Adding change to test openldap
keithquinnpercona a938b5b
Adding change to test openldap
keithquinnpercona d0f91af
Adding change to test openldap
keithquinnpercona bad4c75
Adding change to test openldap
keithquinnpercona eb1a788
Changing python3 dependencies to be installed by apt instead of pip
keithquinnpercona d35262c
Running tests
keithquinnpercona 6d38055
Running tests
keithquinnpercona fdc0f6d
Fixing port
keithquinnpercona 1e99842
Adding the rest of the openldap steps
keithquinnpercona 204ea45
Changing port
keithquinnpercona b651637
Fixing port issue
keithquinnpercona 0132b39
Cleanup
keithquinnpercona 33e5e10
Fixing encrypted password task
keithquinnpercona c0d837f
Updating psmdb playbook to use new openldap role
keithquinnpercona 11b2635
adding python installs for RedHat
keithquinnpercona c28ee43
Fixing package install issues on RedHat and Amazon Linux
keithquinnpercona 379a415
Testing RedHat package install
keithquinnpercona 0a7977c
Test
keithquinnpercona 22572db
Testing changes
keithquinnpercona 85f8865
Fixing task
keithquinnpercona 7c866bf
Fixing auth issue
keithquinnpercona 59aaa04
Fixing port
keithquinnpercona d041a09
Test
keithquinnpercona 9f53c6a
TEst
keithquinnpercona fa60c75
TEst
keithquinnpercona 2b54b00
Test
keithquinnpercona 1f31676
Test
keithquinnpercona 7712547
Test
keithquinnpercona e076285
Test
keithquinnpercona d31d8ad
Updating branch for test
keithquinnpercona 6d0c409
Updating branch for test
keithquinnpercona 212c95c
Removing SSH debugging
keithquinnpercona 74d4816
Removing uneeded task files
keithquinnpercona 8c929f1
Removing uneeded task files
keithquinnpercona 79b4f2a
Updating file
keithquinnpercona eb86e6f
Cleanup
keithquinnpercona 53db2c8
Pull from main
keithquinnpercona 8c25139
Cleanup
keithquinnpercona 223d52f
Cleanup
keithquinnpercona 429a67d
Updating ldap query user
keithquinnpercona 50b808b
Changing for test
keithquinnpercona b8c0b56
Changing for test
keithquinnpercona 0cb113a
Adding task to install Readelf command on RHEL8
keithquinnpercona fd299a4
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona fcbebe5
Minor changes and README
keithquinnpercona ab2f722
Tidying up ansible role variables
keithquinnpercona 85385e3
Deleting original ldap folder and renaming openldap-docker folder to …
keithquinnpercona d8ea263
Updating playbooks
keithquinnpercona 2b9c7f0
Changing cloning task to use env var
keithquinnpercona 8e47305
Cleanup
keithquinnpercona b92895d
Fixing broken variable
keithquinnpercona 0261637
Fixing broke variable
keithquinnpercona 99b6332
Fixing env var
keithquinnpercona 31be51f
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona 56c8236
Adding retry to Docker download task
keithquinnpercona 1c6eae7
Updating failing task for retries
keithquinnpercona e0527f0
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona c73a743
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona 4108c5d
Cleanup
keithquinnpercona 40e4546
Initial commit
keithquinnpercona cc1a95b
Updating playbooks
keithquinnpercona 77bedb9
Fixing task
keithquinnpercona 43ede4a
Test
keithquinnpercona 37eb0af
Changing how to install dependencies
keithquinnpercona b8679e3
Test
keithquinnpercona e7c70ff
Test
keithquinnpercona ce4b594
Test
keithquinnpercona 9ed16ed
Test
keithquinnpercona 555ebf2
Test
keithquinnpercona 6f39bff
Fixing file name
keithquinnpercona 670d962
Fixing file name
keithquinnpercona bfe8b82
Fixing task
keithquinnpercona 80a1b4d
Updating test
keithquinnpercona 03f8281
Fixing test
keithquinnpercona 0f67a8a
Fixing test
keithquinnpercona d84a6c5
Fixing test
keithquinnpercona 9c81905
Fixing cert locations
keithquinnpercona eeeedcd
Updating test
keithquinnpercona 2e7a15b
Updating server name
keithquinnpercona df20879
Undoing change
keithquinnpercona 7b70c7a
Updating to use docker container directly
keithquinnpercona 621c6c0
Changing logging level of pykmip
keithquinnpercona ec99789
Updating server config for kmip
keithquinnpercona ee640b4
Testing playbook order
keithquinnpercona e6c9cd9
Testing change
keithquinnpercona 6839cf1
Test
keithquinnpercona 908415f
Test
keithquinnpercona 70fcea0
Test
keithquinnpercona 078a19a
Test
keithquinnpercona e0016b9
test
keithquinnpercona 66dce5d
Test
keithquinnpercona 7e5d966
Cleanup
keithquinnpercona e023108
Pulling from main
keithquinnpercona 95941cf
updating /etc/hosts to try container ID
keithquinnpercona d47d373
updating /etc/hosts to try container ID
keithquinnpercona c8f0f9f
Test
keithquinnpercona 04ae60d
Test
keithquinnpercona 8ea3475
Updating latest kmip/vault changes
keithquinnpercona 77413ee
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona db66e46
Updating role name and files using it
keithquinnpercona fc2a123
updating test with correct config
keithquinnpercona 4c41ce8
Updating test
keithquinnpercona 36cb365
Updating moving variable declaration to vars folder
keithquinnpercona e0d0ad5
Adding vault license variabel
keithquinnpercona 8ccc030
Updating file permissions
keithquinnpercona b3a0c64
Updating playbooks for debugging
keithquinnpercona 7a7061b
Fixing task without quotes
keithquinnpercona 6dba4bd
Updating tests with new filepaths
keithquinnpercona 1fd3388
Fixing intermittent connection issue to vault container
keithquinnpercona dbf5845
Adding a wait for the vault container
keithquinnpercona 9943b41
Updating test server name
keithquinnpercona 0d9e828
Testing test change
keithquinnpercona 97c5d45
Testing test change
keithquinnpercona 24653b7
Testing test change
keithquinnpercona f6a063a
Udpating telemetry test
keithquinnpercona e40bca5
Updating test server name
keithquinnpercona 2bd4bad
Pre-creating mongod user
keithquinnpercona c19416d
Adding tests back in for psmdb functional
keithquinnpercona 120bcf0
Updating Vault test
keithquinnpercona cd48d7a
Updating file permissions on vault token
keithquinnpercona 0dba81f
Cleanup
keithquinnpercona adae318
Cleanup
keithquinnpercona efa3ae6
Updating install dependencies for different OS's
keithquinnpercona 256d0ee
Updating install dependencies for different OS's
keithquinnpercona 420b24c
Updating tasks to handle RedHat OS
keithquinnpercona f9bbce3
Test
keithquinnpercona 84ab048
Testing fix
keithquinnpercona c3d7d54
Testing
keithquinnpercona d267563
Testing
keithquinnpercona f0eea0a
Testing
keithquinnpercona 0f4b1d0
Testing
keithquinnpercona 8d0ee4d
Testing
keithquinnpercona 2c78077
Updating package installation for Redhat
keithquinnpercona 281e3da
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona c2a0ebc
Adding initial files
keithquinnpercona 5ca14fa
Updating scripts
keithquinnpercona f8c525f
Update from master
keithquinnpercona 0dd3b21
Adding kerberos-docker role scripts
keithquinnpercona 06cf9e1
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona da3a80a
Adding kerberos-docker role scripts
keithquinnpercona d002c71
Fixing script
keithquinnpercona 39016f1
Updating for testing
keithquinnpercona 298a6c1
testing
keithquinnpercona ecaae0a
testing
keithquinnpercona 48e9729
test
keithquinnpercona 10027e8
Upping the time limit for the kmip container
keithquinnpercona 1ce66fa
Updating task to suit the package install vs tarball
keithquinnpercona a087827
Debugging
keithquinnpercona 6003a49
Debugging
keithquinnpercona 71029c3
Updating scripts for test
keithquinnpercona 0873e36
Updating test
keithquinnpercona d5dcad7
Readding removed task
keithquinnpercona 7d44463
Updating where KRB5_KTNAME lives
keithquinnpercona cbd534a
Removing psmdb breaking task
keithquinnpercona 479f370
Debugging
keithquinnpercona d189546
Fixing hostname in tasks
keithquinnpercona 3ff027f
Debugging tests
keithquinnpercona 04ff681
Fixing vault breaking task
keithquinnpercona 99afef7
Running all tests
keithquinnpercona f200c6a
Adding changes to work with redhat based
keithquinnpercona 8299b08
Debugging
keithquinnpercona 7ed66e7
Test debugging
keithquinnpercona 5f48f74
Fixing hostname issue
keithquinnpercona c12e6c7
Adding back tests
keithquinnpercona d5c4ea8
Fixing task for Debian
keithquinnpercona c009235
Debugging tests
keithquinnpercona 48583c1
Debugging ubuntu test failure
keithquinnpercona 7d64569
Updating variable
keithquinnpercona 4637ab4
Fixing hostname task
keithquinnpercona 2e3ef3f
Fixing hostname task
keithquinnpercona 022662d
Debugging debian 11
keithquinnpercona 79e672b
Adding fix for debian 11 hostname
keithquinnpercona 0cc358e
Adding fix for debian 11 hostname
keithquinnpercona 072ea7c
Adding to krb5.conf
keithquinnpercona 79e5cd2
Undoing changes
keithquinnpercona 0f5f5fc
Updating task to fix Debian 11 issue
keithquinnpercona 293906a
Testing fix
keithquinnpercona 2193223
Testing fix
keithquinnpercona 21a2fb6
Readding task
keithquinnpercona f45192e
Fixing non mongod package install issue
keithquinnpercona 52bfee1
Fixing task
keithquinnpercona 384cc8d
Fixing test
keithquinnpercona ada3158
Debugging tests
keithquinnpercona a1cc051
Cleanup
keithquinnpercona e2b1bc7
Cleanup
keithquinnpercona 39cd413
Cleanup
keithquinnpercona fffc5c4
Cleanup
keithquinnpercona c4bf0fe
Cleanup
keithquinnpercona cb6e972
Cleanup
keithquinnpercona dd66610
Cleanup
keithquinnpercona e7be4e7
Cleanup
keithquinnpercona 4b737d9
Cleanup
keithquinnpercona bfa994e
Cleanup
keithquinnpercona f306ff1
Merge branch 'main' of github.com:Percona-QA/psmdb-testing into PSMDB…
keithquinnpercona 76c6659
Cleanup
keithquinnpercona 48eb28c
Cleanup
keithquinnpercona File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -321,7 +321,7 @@ def test_auth(host,auth): | |
| if auth == 'GSSAPI': | ||
| with host.sudo(): | ||
| hostname = host.check_output('hostname') | ||
| host.check_output('kadmin.local -q "addprinc -pw exttestrw exttestrw"') | ||
| host.check_output('docker exec kerberos sh -c "kadmin.local -q \'addprinc -pw exttestrw exttestrw\'"') | ||
| host.check_output('bash -c "kinit exttestrw <<<\'exttestrw\'"') | ||
| result = host.check_output('mongo -u [email protected] --host '+ hostname +' --authenticationMechanism=GSSAPI --authenticationDatabase \'$external\' --quiet --eval "db.runCommand({connectionStatus : 1})"') | ||
| print(result) | ||
|
|
@@ -378,7 +378,7 @@ def test_encryption(host,encryption,cipher): | |
| conf['security']['kmip']['clientCertificateFile'] = MONGO_PEM_FILE | ||
| conf['security']['kmip']['serverCAFile'] = CA_KMIP_FILE | ||
|
|
||
| #erase data and setup config | ||
| #erase data and setup config | ||
| apply_conf(host,conf,True) | ||
|
|
||
| #check startup with encryption | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| - name: Install dependencies (Debian) | ||
| apt: | ||
| update_cache: yes | ||
| name: | ||
| - krb5-user | ||
| - python3-docker | ||
| state: present | ||
| become: yes | ||
| when: ansible_os_family == "Debian" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| - name: Install pip (RedHat) | ||
| become: true | ||
| package: | ||
| name: python3-pip | ||
| state: present | ||
| when: ansible_os_family == "RedHat" | ||
|
|
||
| - name: Create venv (RedHat) | ||
| become: true | ||
| command: /usr/bin/python3 -m venv /opt/ansible-venv | ||
| args: | ||
| creates: /opt/ansible-venv/bin/python | ||
| when: ansible_os_family == "RedHat" | ||
|
|
||
| - name: Upgrade pip in venv (RedHat) | ||
| become: true | ||
| command: /opt/ansible-venv/bin/python -m pip install --upgrade pip | ||
| when: ansible_os_family == "RedHat" | ||
|
|
||
| - name: Install packages in venv (RedHat) | ||
| become: true | ||
| command: /opt/ansible-venv/bin/python -m pip install --upgrade --ignore-installed docker requests | ||
| when: ansible_os_family == "RedHat" | ||
|
|
||
| - name: Use venv interpreter (RedHat) | ||
| set_fact: | ||
| ansible_python_interpreter: /opt/ansible-venv/bin/python | ||
| when: ansible_os_family == "RedHat" | ||
|
|
||
| - name: Install dependencies (Redhat) | ||
| yum: | ||
| update_cache: yes | ||
| name: | ||
| - krb5-workstation | ||
| state: present | ||
| become: yes | ||
| when: ansible_os_family == "RedHat" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,139 @@ | ||
| - include_tasks: "RedHat.yml" | ||
| - include_tasks: "Debian.yml" | ||
|
|
||
| - name: Get system hostname | ||
| ansible.builtin.shell: hostname | ||
| register: hostname_raw | ||
| changed_when: false | ||
|
|
||
| - name: Set hostname variable | ||
| ansible.builtin.set_fact: | ||
| hostname: "{{ hostname_raw.stdout }}" | ||
|
|
||
| - name: Remove pre-existing kerberos container | ||
| docker_container: | ||
| name: kerberos | ||
| state: absent | ||
| keep_volumes: false | ||
|
|
||
| - name: Create required folders | ||
| become: true | ||
| ansible.builtin.file: | ||
| path: "{{ item }}" | ||
| state: directory | ||
| owner: root | ||
| group: root | ||
| mode: '0750' | ||
| loop: | ||
| - /var/lib/krb5kdc | ||
| - /keytabs | ||
|
|
||
| - name: Copy KDC configuration file to host | ||
| template: | ||
| src: krb5.conf | ||
| dest: "/etc/krb5.conf" | ||
|
|
||
| - name: Start Kerberos container | ||
| community.docker.docker_container: | ||
| name: kerberos | ||
| image: "alpine" | ||
| command: > | ||
| sh -c ' | ||
| apk add --no-cache bash krb5 krb5-server krb5-pkinit && | ||
| if [ ! -f /var/lib/krb5kdc/principal ]; then | ||
| kdb5_util -P password create && | ||
| kadmin.local -q "addprinc -pw password root/admin"; | ||
| fi && | ||
| /usr/sbin/krb5kdc -n | ||
| ' | ||
| restart_policy: unless-stopped | ||
| published_ports: | ||
| - "88:88/udp" | ||
| - "88:88/tcp" | ||
| volumes: | ||
| - "/etc/krb5.conf:/etc/krb5.conf" | ||
| - "/var/lib/krb5kdc:/var/lib/krb5kdc" | ||
| - "/keytabs:/keytabs" | ||
|
|
||
| - name: Waiting for Kerberos container to be ready | ||
| ansible.builtin.command: | ||
| cmd: > | ||
| docker exec kerberos sh -c 'test -x /usr/sbin/kadmin.local' | ||
| register: kadmin_check | ||
| retries: 10 | ||
| delay: 2 | ||
| until: kadmin_check.rc == 0 | ||
| changed_when: false | ||
|
|
||
| - name: Create MongoDB service principal for mongod | ||
| ansible.builtin.command: | ||
| cmd: > | ||
| docker exec kerberos sh -c 'kadmin.local -q "addprinc -randkey mongodb/{{ hostname }}@PERCONATEST.COM"' | ||
| register: add_service_princ | ||
| failed_when: > | ||
| add_service_princ.rc != 0 and | ||
| ("already exists" not in (add_service_princ.stderr | default(''))) and | ||
| ("already exists" not in (add_service_princ.stdout | default(''))) | ||
|
|
||
| - name: Create Service Key and store it in the Keytab | ||
| ansible.builtin.command: | ||
| cmd: > | ||
| docker exec kerberos sh -c 'kadmin.local -q "ktadd -k /keytabs/mongodb.keytab mongodb/{{ hostname }}@PERCONATEST.COM"' | ||
|
|
||
| - name: Copy mongodb.keytab from container to host | ||
| ansible.builtin.command: | ||
| cmd: > | ||
| docker cp kerberos:/keytabs/mongodb.keytab /etc/mongodb.keytab | ||
| register: docker_cp_keytab | ||
| changed_when: docker_cp_keytab.rc == 0 | ||
|
|
||
| - name: Give /etc/mongodb.keytab mongod permissions | ||
| ansible.builtin.file: | ||
| path: /etc/mongodb.keytab | ||
| owner: mongod | ||
| group: mongod | ||
| mode: '0600' | ||
|
|
||
| - name: Add KRB5_KTNAME variable for PSMDB (Debian) | ||
| lineinfile: | ||
| path: /etc/default/mongod | ||
| line: KRB5_KTNAME=/etc/mongodb.keytab | ||
| create: yes | ||
| when: ansible_os_family == "Debian" | ||
|
|
||
| - name: Add KRB5_KTNAME variable for PSMDB (RedHat) | ||
| lineinfile: | ||
| path: /etc/sysconfig/mongod | ||
| line: KRB5_KTNAME=/etc/mongodb.keytab | ||
| create: yes | ||
| when: ansible_os_family == "RedHat" | ||
|
|
||
| - name: Check if Percona directory exists | ||
| ansible.builtin.stat: | ||
| path: /percona-server-mongodb | ||
| register: percona_dir | ||
|
|
||
| - name: Restart mongod to pick up Kerberos keytab env | ||
| ansible.builtin.service: | ||
| name: mongod | ||
| state: restarted | ||
| enabled: yes | ||
| when: not percona_dir.stat.isdir | default(false) | ||
|
|
||
| - name: Adding short form of hostname to /etc/hosts (Debian 11) | ||
| become: true | ||
| ansible.builtin.replace: | ||
| path: /etc/hosts | ||
| regexp: '^\s*(127\.0\.1\.1)\s+.*$' | ||
| replace: '\1 {{ hostname }}' | ||
| unsafe_writes: true | ||
| when: | ||
| - ansible_distribution == "Debian" | ||
| - ansible_distribution_major_version | int == 11 | ||
|
|
||
| - name: Add kerberos user to /etc/hosts | ||
| lineinfile: | ||
| state: present | ||
| dest: /etc/hosts | ||
| line: '127.0.0.1 {{ hostname }}' | ||
| unsafe_writes: yes |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
|
|
||
| [libdefaults] | ||
| default_realm = PERCONATEST.COM | ||
| forwardable = true | ||
| dns_lookup_realm = false | ||
| dns_lookup_kdc = false | ||
| ignore_acceptor_hostname = true | ||
| rdns = false | ||
| ticket_lifetime = 10m | ||
| renew_lifetime = 10m | ||
| [realms] | ||
| PERCONATEST.COM = { | ||
| kdc_ports = 88 | ||
| kdc = 127.0.0.1 | ||
| } | ||
| [domain_realm] | ||
| .perconatest.com = PERCONATEST.COM | ||
| perconatest.com = PERCONATEST.COM | ||
| kerberos = PERCONATEST.COM |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.