Skip to content
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

chore: removal of Credential argument in newApi() methods #3713

Merged
merged 7 commits into from
Mar 17, 2023

Conversation

diegomarquezp
Copy link
Contributor

No description provided.

throws FileAlreadyExistsException, IOException {
Preconditions.checkNotNull(credential, "credential not given");
Preconditions.checkState(apiFactory.hasCredentialsSet(), "credentials not set");
Copy link
Member

Choose a reason for hiding this comment

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

Preconditions.checkState --> "Ensures the truth of an expression involving the state of the calling instance, but not involving any parameters to the calling method."

Preconditions.checkArgument --> "Ensures the truth of an expression involving one or more parameters to the calling method."

From https://guava.dev/releases/19.0/api/docs/com/google/common/base/Preconditions.html

*/
@Override
public boolean hasCredentialsSet() throws IOException {
return getAccount() != null && getAccount().getOAuth2Credential() != null;
Copy link
Member

@burkedavison burkedavison Feb 23, 2023

Choose a reason for hiding this comment

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

@diegomarquezp : [Paraphrased] Should we throw these IOExceptions when unable to get the credential?

Generally, it depends on whether the IOException simply represents "no credential", or whether it is truly "exceptional" in the sense that "something unexpected went wrong". Also, generally, it depends on whether the caller of the function would potentially be capable of handling / recovering from the exception in some way that the current method cannot.

I would generally expect a boolean-returning method like hasCredentialsSet to return false if the IOException is simply getOAuth2Credential()'s standard behavior for saying "no credential".

@diegomarquezp : [Paraphrased] Should we return null from getCredential()?

I've jumped on the Java 8 train, and returning null is against my religion. Instead, I would be returning an never-null Optional<Credential> reference. However, the rest of this code base tends to return null often, so there is an argument to be made that maintaining the existing standard is okay.

Ultimately these are trade-offs that depend on the context and how heavily you weigh each consideration. Given the above, what do you think is the best choice in this situation that lets you achieve the desired goal?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In that sense, the IOException occurs when something goes wrong when obtaining the user info via an HTTP request using the default credentials as base. It is therefore truly exceptional. I will modify this to bubble up the exception.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Actually, I think it's fine to bubble it up to GoogleApiFactory where then the exception is catched, but there is still a null check for the credentials in every new[...]Api() method. I think it's fair to leave external callers unconcerned with a failed internal HTTP request to obtain user info.

try {
return accountProvider.getCredential();
} catch (IOException ex) {
LOGGER.severe("Error when obtaining credential: " + ex);
Copy link
Member

Choose a reason for hiding this comment

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

+ ex is effectively + ex.toString() which will print the exception class name and maybe an instance ID. If you're at the point of logging an exception, always do it in a way that includes the stack trace.

LOGGER.log(Level.SEVERE, "Error when obtaining credential.", ex);

@diegomarquezp diegomarquezp marked this pull request as ready for review March 16, 2023 20:40
@diegomarquezp diegomarquezp changed the title chore: initial removal of Credential argument in newApi() methods chore: removal of Credential argument in newApi() methods Mar 16, 2023
@diegomarquezp diegomarquezp merged commit e755e47 into gcloud-cli-creds Mar 17, 2023
@diegomarquezp diegomarquezp deleted the new-api-factory-creds branch March 17, 2023 19:06
diegomarquezp added a commit that referenced this pull request Jun 6, 2023
* Adjustments to use application default credentials

* feat: modify "Manage Google Accounts" button to rely on gcloud ADC (#3715)

* feat: modify "Manage Google Accounts" button to rely on gcloud ADC

* fix: use `setBaseEnabled()` to correctly propagate login state

* chore: better UI, on-demand cred check

* chore: adapt single account to deploy dialog (#3717)

* feat: modify "Manage Google Accounts" button to rely on gcloud ADC

* fix: use `setBaseEnabled()` to correctly propagate login state

* chore: better UI, on-demand cred check

* chore: [wip] adapt single account to deploy dialog

* chore: display gcloud instruction messages

* fix: layout to wrap no ADC message

* chore: cleanup of `gcloud-cli-creds` (#3714)

* chore: cleanup of deploy classes

* chore: cleanup of deploy UI classes

* chore: cleanup of cloudsdk staging helper

* chore: better missing-credentials handling

* chore: removal of Credential argument in `newApi()` methods (#3713)

* feat: initial removal of Credential argument in newApi() methods

* chore: move account resolution to new class

* chore: correct precond check, correct exception logging

* chore: do not throw exception when checking for credentials

* fix: compilation errors

* fix: compilation errors in tests

* chore: enable or disable deploy button depending on ADC being found. (#3718)

* feat: modify "Manage Google Accounts" button to rely on gcloud ADC

* fix: use `setBaseEnabled()` to correctly propagate login state

* chore: better UI, on-demand cred check

* chore: [wip] adapt single account to deploy dialog

* chore: display gcloud instruction messages

* fix: layout to wrap no ADC message

* chore: disable deploy button when not logged in

* chore: use new `hasCredentialsSet` method

* chore: fix unit tests using gcloud ADC (#3722)

* feat: initial removal of Credential argument in newApi() methods

* chore: move account resolution to new class

* chore: cleanup of deploy classes

* chore: cleanup of deploy UI classes

* chore: cleanup of cloudsdk staging helper

* chore: correct precond check, correct exception logging

* feat: modify "Manage Google Accounts" button to rely on gcloud ADC

* fix: use `setBaseEnabled()` to correctly propagate login state

* chore: better UI, on-demand cred check

* chore: [wip] adapt single account to deploy dialog

* chore: display gcloud instruction messages

* fix: layout to wrap no ADC message

* chore: disable deploy button when not logged in

* chore: do not throw exception when checking for credentials

* fix: compilation errors

* fix: compilation errors in tests

* chore: initial compilation-enabling adjustments

* chore: use `hasCredentialsSet()`

* chore: add test account provider

* chore: fix usagetracker and projectselector test

* chore: expose `getCredential()`

* chore: fix projectselector tests

* chore: null check for `setPRoviderState()`

* chore: add avatar URL to test accounts

* chore: fix login tests

* chore: fix googleapis tests

* chore: add convenience state+defaultprovider method

* chore: fix dataflow tests

* chore: fix dataflow core tests

* chore: fix error-prone state check in localserver

* chore: correct static member initialization order in `TestAccountProvider`

* chore: initialize static account provider once

* chore: use mock methods instead of test acct provider in `MiniSelectorTest`

* chore: fixes after merging `gcloud-cli-creds`

* chore: use avatar urls in test accounts

* chore: fix accounts panel tests

* chore: fix dataflow preferences test

* chore: fix login `Account` package

* chore: fix usagetracker test ii

* fix: project repository test

* chore: fix googleapis proxy tests

* fix: dataflow preferences test

* chore: fix login tests, remove unused elements (pending cleanup)

* chore: fix app engine deploy tests

* chore: remove unnecessary test in `GcpProjectQueryJobTest`

* chore: fix localserver tests iii

* chore: more dataflow ui test fixes

* chore: fix project repository test

* chore: accounts panel test to assert correct number of children

* chore: run tests on any pr

* chore: fix update accounts logic in `GoogleLoginService`

* chore: remove initialization of static members in constructors

* chore: fire listeners in `AccountSelector`

* chore: fix `GoogleApiFactory` initalization in `GcpLocalRunTabTest`

* chore: fix cache check in `AccountSelector`

* chore: fix `CloudSdkProcessWrapperTest`

* chore: correct stubbing in `DefaultedPipelineOptionsComponentTest`

* chore: remove unused imports in `CloudSdkProcessWrapper`

* chore: remove unused import in `AccountPanelsTest`

* chore: trigger update on `GcpLocalRunTabTest`

* chore: fix `fireSelectionListeners` after setting change tracker variable

* chore: fix `GcpLocalRUnTabTest`

* chore: refactor force `AccountSelector` check to a better named method

* chore: return validation states in `RunOptionsDefaultsComponent`

* chore: add status checks to other test in `RODCTest`

* chore: make `forceCheck()` public in `AccountSelector`

* chore: remove unused thrown exception from delcaration in `GcpLocalRunTabTest`

* chore: set flag to enable `forceAccountCheck`

* chore: have dataflow Command RunOptionsDefaultScomponent not found to return gcloud CLI email

* chore: fix login service test

* chore: fix assertions, verify projects loaded in `RunOptionsDefaultCOmponentsStest`

* chore: update project lists on account change in `RunOptionsDefaultsComponent`

* chore: lock `login` `com.google.api` versions to `1.25.0`

* chore: remove unthrown exception declaration in `GcpLocalRunTabTest`

* chore: fix tests in `RunOptionsDefaultsCOmponentTest`

* chore: correct versions in login MANIFEST.MF

* chore: fix Command setUpServiceKeyCreation not found in Command GcpLocalRunTabTest not found'

* chore: make account selector to return update result

* chore: fix non-existent version of `com.google.api.services.oauth2`

* chore: fix logic check in `forceAccountCHeck` for `AccountSelector`

* chore: exclude `oauth2` package in manifest check

* chore: fix comments in default pipeline options test

* chore: fixes in dataflow tests

* chore: remove TODO comment

* chore: using `EnumMap` in `TestAccountProvider`

* chore: handle `GoogleApiFactory` credential-related methods internally (#3726)

* chore: change credential and account to `Optional`

* chore: adapt localserver tests

* chore: adapt dataflow plugin

* chore: adapt login plugin

* chore: adapt projectselector tests

* chore: adapt projectselector (credential)

* chore: adapt appengine deploy (hascredentials)

* chore: move ITestAccountProvider

* chore: adapt appengine.deploy (hascredentials)

* chore: adapt appengine.localserver (hascredentials)

* chore: adapt dataflow.ui (hascredentials)

* chore: adapt googleapis test (hascredential)

* chore: adapt login (hascredentials)

* chore: adapt projectselector (hascredentials)

* chore: fix setup in gcplocalruntabtest

* chore: adapt test account provider to new interface

* chore: remove `hasCredentialsSet` from `TestAccountProvider`

* chore: test fixes

* chore: correct import (`java.util.Optional`)

* chore: workaround for undetected mock in `FlexDeployPreferencesDialogTest`

* chore: remove unused import

* chore: `Optional` convenience methods

* chore: adapt tests of `AccountSelector` (#3728)

* chore: remove unnecessary login module classes (#3727)

* chore: remove login service OAuth related classes

* chore: adapt appengine deploy

* chore: adapt appengine deploy tests

* chore: adapt dataflow core

* chore: adapt dataflow core tests

* chore: adapt dataflow ui

* chore:adapt dataflow ui tests

* chore: adapt tests in login ui

* chore: fix test case in dataflow core

* chore: improve Optional usage

* chore: update appengine-plugins-core to 0.9.11 (#3732)

* chore: fix project list initialization in local server launch config (#3729)

* chore: fix project list initialization in local server launch config

* chore: adapt tests to initially set credentials

* chore: initialize account selector at right time

* chore: fix initialization

* chore: fix initialization ii

* chore: initialize account selector with empty creds

* chore: initialize api factory before instantiating the localserver tabl

* chore: (cleanup) convert `GoogleApiFactory` to static usage (#3733)

* chore: update snakeyaml to 2.0

* chore: adapt appengine.deploy.ui

* chore: adapt appengine.deploy.ui.test

* chore: remove usages in `appengine.deploy.ui`

* chore: remove reference from appengine.deploy.ui.test

* chore: hide constructor in googleapis

* chore: adapt localserver

* chore: adapt localserver tests

* chore: adapt dataflow core

* chore: adapt dataflow ui

* chore: adapt dataflow ui test

* chore: adapt googleapis

* chore: adapt login

* chore: adapt projectselector

* chore: adapt projectselector tests

* chore: delete `GoogleLoginService` (due at last merge)

* chore: compilation errors

* chore: compilation errors ii

* chore: adapt localserver test ii

* chore: adapt dataflow core test ii

* chore: adapt dataflow ui ii

* chore: adapt datafow ui test ii

* chore: use GoogleApiFactory mock

* chore: use static instance in defaulted pipeline options

* chore: more compilation errors

* feat: compute credentials from well-known ADC file path (apiary credentials) (#3731)

* chore: compute adc path with auth java library

* chore: add polling and subscription to adc

* chore: fix listener logic for credential changes

* chore: compute cred identifier (refresh token) manually

* chore: adapt test account provider

* chore: listen to cred changes in credentials menu item

* chore: non optional-wrapped ADC file

* chore: add dispose listener to account selector

* chore: use `WatchService`

* chore: tests for `DefaultAccountProvider`

* chore: update snakeyaml to 2.0

* chore temp folder to be public

* chore: add more propagation checks

* chore: reorder change counters

* chore: debug info for test

* chore: more logging

* chore: info level for adc watcher

* chore: use custom constructor

* chore: fix constructor

* chore: wait for adc file change in test

* chore: use class level listener

* chore: mock non-final method to identify credential

* chore: make `CredentialWithId` public

* chore: various test fixes

* test: fix listener wait workflow

* chore: adapt to static apifacotry instance

* chore: adapt to static apifactory instance ii

* chore: correct tests

* chore: compute custom refresh token

* chore: improve logging

* chore: more logging

* chore: increase delay between event handling

* chore: more logging ii

* chore: thread safety

* chore: changes polling logging

* chore: fix break on polling

* chore: thread safety in credentials

* chore: more logging for account and credential test logic

* chore: final test fixes

* chore: fix logging levels for production class

* chore: better path resolution

* chore: init transport cache manually

* chore: exclide OSGI-INF from build

* chore: adapt transport cache tests

* chore: correct reactivity in appengine deploy dialog (#3735)

* chore: remove `@Component` annotation from api factory

* chore: react on credential change via gcloud CLI

* chore: remove comments

* chore: handle correct exception type

* chore: grace period for json file to be written

* chore: use separate thread logic to check adc file

* chore: accomodate (deprecated) dataflow tests

* chore: accomodate (deprecate) dataflow tests ii

* chore: accomodate (deprecate) dataflow tests iii

* chore: revert default pipeline adjustments

* chore: reset mock singleton in `GoogleApiFactory`

* chore: remove unused import

---------

Co-authored-by: Burke Davison <burkedavison@google.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants